![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Mar 2009
Сообщений: 30
|
Приветствую всех, кто заглянул в эту тему!
В стадии написания довольно шустрой игры обнаружил, что реакция на MouseEvent.CLICK слегка замедленна. Для проверки написал обычный класс, в котором квадрат движется из стороны в сторону с шагом 10 раз в секунду. Если кликнуть в любом месте мышкой, то по идеи квадрат должен остановиться. Проблема в том, что квадрат продолжает двигаться дальше еще 1-3 шага. Есть ли выход из подобной ситуации? package { import flash.display.*; import flash.events.*; import flash.utils.*; public class Test extends Sprite { private var obj:Sprite; private var timer:Timer; private var flag:int = 0; public function Test () :void { addEventListener(Event.ADDED_TO_STAGE, addedToStageListener); } private function addedToStageListener(e:Event) :void { removeEventListener(Event.ADDED_TO_STAGE, addedToStageListener); stage.scaleMode = "noScale"; stage.align = "TL"; stage.frameRate = 100; obj = new Sprite(); obj.graphics.beginFill(0xFF0000); obj.graphics.drawRoundRect(0, 0, 25, 25, 10); addChild(obj); stage.addEventListener(MouseEvent.CLICK, start); } private function start (e:MouseEvent) :void { stage.removeEventListener(MouseEvent.CLICK, start); stage.addEventListener(MouseEvent.CLICK, stop); timer = new Timer(100, 0); timer.addEventListener(TimerEvent.TIMER, move); timer.start(); } private function stop (e:MouseEvent) :void { timer.stop(); timer.removeEventListener(TimerEvent.TIMER, move); stage.removeEventListener(MouseEvent.CLICK, stop); stage.addEventListener(MouseEvent.CLICK, start); } private function move (e:TimerEvent) :void { switch(flag) { case 0: if (obj.x >= 250) { obj.x -= obj.width; flag = 1; } else { obj.x += obj.width; } break; case 1: if (obj.x == 0) { obj.x += obj.width; flag = 0; } else { obj.x -= obj.width; } break; } } } } |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
MouseEvent.CLICK - это нажатие и отжатие клавиши мыши. А между этими событиями проходит время, поэтому вам и кажется, что объект двигается после вызова stop, хотя он сработает только после того, как вы мышь отпустите.
|
|
|||||
|
Регистрация: Mar 2009
Сообщений: 30
|
пробую MouseEvent.CLICK.MOUSE_DOWN и результат тот же. Неужели нельзя осуществить мгновенную остановку?
|
|
|||||
|
Ну да, в подобных случаях лучше использовать MouseEvent.MOUSE_DOWN.
Добавлено через 50 секунд это где этому учат???
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь! |
|
|||||
|
Banned
Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
|
|
|||||
|
Извиняюсь за плавный переход на флуд но и такая манера написания меня пугает.
ded100let Что увидеть результат быстродействия кликов, измените делай на 5-10 а движение прибавляйте по 1-2 px и желательно в приёмник TimerEvent добавьте e.updateAfterEvent(); в конец блока.
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь! |
|
|||||
|
Регистрация: Mar 2009
Сообщений: 30
|
да, имелось ввиду MouseEvent.MOUSE_DOWN.
stweet, после изменения delay на 10 меняется скорость движения квадрата и количество шагов после нажатия кнопки мыши. Явного быстродействия не наблюдается. Квадрат не останавливается после клика мгновенно Интересен тот факт, что в приемнике TimerEvent прописывал trace(время в миллисекундах) и в приемнике MouseEvent.MOUSE_DOWN тоже самое. В конечном итоге время в приемнике MouseEvent больше, чем в приемнике TimerEvent, но глазами я вижу, что передвижение квадрата еще осуществляется после нажатия кнопки. |
|
|||||
|
Цитата:
У вас и будит объект плавать т.к. расстояние между операциями у вас 100 - одна десятая секунды и шаг передвижения в ширину объекта. package { import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.utils.Timer; public class BoxMove extends Sprite { public function BoxMove() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // startup var setSide:Boolean = false; var timer:Timer = new Timer(2); timer.addEventListener(TimerEvent.TIMER, function (e:TimerEvent):void { if (numChildren != 0) stage.getChildAt(0).x += 5; }); stage.addEventListener(MouseEvent.MOUSE_DOWN, function (e:MouseEvent):void { if (setSide) timer.start(); else timer.stop(); setSide = !setSide; }); addBoxToStage(50, 50); stage.getChildAt(0).x = 100; stage.getChildAt(0).y = 100; } private function addBoxToStage (w:int, h:int):void { var shape:Shape = new Shape(); shape.graphics.beginFill(0, .5); shape.graphics.drawRect( -w / 2, -h / 2, w, h); shape.graphics.endFill(); addChild(shape); } } }
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь! |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:20. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| MouseEvent.CLICK , TimerEvent.TIMER |
|
|