PDA

Просмотр полной версии : Запоздалая реакция на MouseEvent.CLICK


ded100let
24.09.2011, 17:49
Приветствую всех, кто заглянул в эту тему!

В стадии написания довольно шустрой игры обнаружил, что реакция на 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;
}
}
}
}

iNils
24.09.2011, 20:03
MouseEvent.CLICK - это нажатие и отжатие клавиши мыши. А между этими событиями проходит время, поэтому вам и кажется, что объект двигается после вызова stop, хотя он сработает только после того, как вы мышь отпустите.

ded100let
24.09.2011, 20:13
пробую MouseEvent.CLICK.MOUSE_DOWN и результат тот же. Неужели нельзя осуществить мгновенную остановку?

stweet
24.09.2011, 20:15
Ну да, в подобных случаях лучше использовать MouseEvent.MOUSE_DOWN.

Добавлено через 50 секунд
MouseEvent.CLICK.MOUSE_DOWN
это где этому учат???

goodguy
24.09.2011, 20:24
это где этому учат???
Очевидно же, что имелось в виду это: MouseEvent.CLICK / MOUSE_DOWN

iNils
24.09.2011, 20:30
С MOUSE_DOWN все работает как надо.

stweet
24.09.2011, 20:32
MouseEvent.CLICK / MOUSE_DOWN
Извиняюсь за плавный переход на флуд но и такая манера написания меня пугает.

ded100let Что увидеть результат быстродействия кликов, измените делай на 5-10 а движение прибавляйте по 1-2 px и желательно в приёмник TimerEvent добавьте e.updateAfterEvent(); в конец блока.

iNils
24.09.2011, 20:49
Что увидеть результат быстродействия кликов, измените делай на 5-10 а движение прибавляйте по 1-2 px и желательно в приёмник TimerEvent добавьте e.updateAfterEvent(); в конец блока.Зачем? Два трейса в stop и move будет достаточно.

ded100let
24.09.2011, 20:55
да, имелось ввиду MouseEvent.MOUSE_DOWN.

stweet, после изменения delay на 10 меняется скорость движения квадрата и количество шагов после нажатия кнопки мыши. Явного быстродействия не наблюдается. Квадрат не останавливается после клика мгновенно

Интересен тот факт, что в приемнике TimerEvent прописывал trace(время в миллисекундах) и в приемнике MouseEvent.MOUSE_DOWN тоже самое. В конечном итоге время в приемнике MouseEvent больше, чем в приемнике TimerEvent, но глазами я вижу, что передвижение квадрата еще осуществляется после нажатия кнопки.

stweet
24.09.2011, 21:14
да, имелось ввиду 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);
}
}

}

ded100let
24.09.2011, 21:24
stweet, я понимаю для чего delay в Timer. Просто постом выше я описал последствия изменения delay на 10. За код спасибо, так-как я еще в стадии обучения, то обязательно проштудирую.

На самом деле проблема решилась весьма смешным образом. Так-как у меня ноутбук, то по кнопке я нажимал тачпад-ом и это приводило к легкой заторможенности. Нажав на физическую кнопку (ниже тачпад-а) я увидел мгновенную остановку квадрата. Вот так!