Показать сообщение отдельно
Старый 15.03.2009, 23:58
koIIImarik вне форума Посмотреть профиль Отправить личное сообщение для koIIImarik Посетить домашнюю страницу koIIImarik Найти все сообщения от koIIImarik
  № 1  
Ответить с цитированием
koIIImarik
 
Аватар для koIIImarik

Регистрация: Jul 2007
Адрес: Россия, Москва
Сообщений: 522
Question Разрывы в рисование с помощью Bitmap

Здравствуйте.

Передо мной была поставлена задача сделать «рисовалку» на AS3. По нескольким причинам я решил делать программное рисование не через graphic.lineTo, а через BtimapData и draw. Основными причинами к этому были:

1) Нестандартные «кисти» с размытыми краями.
2) Возможность «стирать» нарисованное.

За саму часть рисования у меня отвечает следующий код:
Код AS3:
function onMouseMove(event:MouseEvent) {
	if (this.instrument_mc) {
		this.instrument_mc.x = Main.stage.mouseX;
		this.instrument_mc.y = Main.stage.mouseY;
		//
		if (event.buttonDown) {
			this.toDraw();
		}
	}
}
function onMouseDown(event:MouseEvent) {
	this.toDraw();
}
Блок:
Код AS3:
if (this.instrument_mc) {
Проверяет наличие инструмента для рисования «в руке».

А блок с:
Код AS3:
if (event.buttonDown) {
Проверяет нажата ли кнопка мышки. Если все условия выполняются, то запускается функция toDraw(), в которой и реализован механизм рисования. Механизм примерно такой:

Код AS3:
this.matrix.tx = toX;
this.matrix.ty = toY;
this.bitmap.draw(_mc, this.matrix, this.colorTransform, instrumentBlendMode);
_mc — это клип, которым рисуем, то есть, те самые «кисточки».
instrumentBlendMode — бывает BlendMode.NORMAL и BlendMode.ERASE, что позволяет либо рисовать, либо стирать нарисованное.

Но это всё было отступлением, проблема заключается в том, что если быстро вести мышкой при зажатой кнопке, то линия получается обрывистой, что видно на следующем скриншоте:



На картинке, быстрее всего была проведена верхняя линия, две линии ниже идут по уменьшению скорости.

Вот и вопрос, есть ли способ с этим как-то бороться, или же стоит смотреть в сторону graphic.lineTo и можно ли там (graphioc.lineTo) как-то добиться размытости кистей?

Как всё работает «в живую» можно посмотреть тут (65кб, прелодера нет): http://flashist.ru/files/azat/school/index.html

P.S.:
updateAfterEvent() пробовал, не помогло. Может быть я как-то не так пробовал?
Так же пробовал, при нажатии на кнопку мыши, запускать таймер который бы вызывался 200 раз в секунду и рисовал Btimap, а при отпускании кнопки мышки таймер бы приостанавливался. Тоже не помогло. Может быть опять как-то не так пробовал?

UPD.:
Изменять количество FPS до максимальных 120 тоже пробовал, тоже не помогло =(


Последний раз редактировалось koIIImarik; 16.03.2009 в 02:38.