2015-04-29 4 views
0

Я новичок в as3, и недавно я видел создание пользовательских событий в as3 в учебнике, и я хотел включить в свою игру. Когда я сделал учебник, все это выглядело хорошо для этого проекта. Но, похоже, он не работает с новым проектом.Пользовательский прослушиватель событий не работает

Вот мой код:

package 
 
{ 
 

 
\t import flash.display.MovieClip; 
 
\t import flash.utils.Timer; 
 
\t import flash.events.TimerEvent; 
 

 
\t public class FashionFrenzy extends MovieClip 
 
\t { 
 
\t \t 
 
\t \t public var Buyer_mc:Buyer; 
 
\t \t public var Buyers:Array; 
 
\t \t public var gameTimer:Timer; 
 

 
\t \t public function FashionFrenzy() 
 
\t \t { 
 
\t \t \t 
 
\t \t \t GameTimeController(); 
 
\t \t \t GenerateBuyers(); 
 
\t \t \t addEventListener(ReachMallDoorEvent.CHECK, OnReachMallDoor); 
 

 
\t \t } 
 

 
\t \t 
 
\t \t public function GameTimeController() 
 
\t \t { 
 
\t \t \t gameTimer = new Timer(25); 
 
\t \t \t gameTimer.start(); 
 
\t \t } 
 
\t \t public function GenerateBuyers() 
 
\t \t { 
 
\t \t \t Buyers = new Array ; 
 
\t \t \t Buyer_mc = new Buyer(533.2,0) ; 
 
\t \t \t addChild(Buyer_mc); 
 
\t \t \t gameTimer.addEventListener(TimerEvent.TIMER, BuyerEnter); 
 
\t \t \t 
 
\t \t \t 
 
\t \t \t if(Buyer_mc.y==377.25) 
 
\t \t \t { 
 
\t \t \t \t dispatchEvent(new ReachMallDoorEvent(ReachMallDoorEvent.CHECK)); 
 
\t \t \t } 
 
\t \t \t \t \t 
 
\t \t \t 
 
\t \t \t 
 
\t \t } 
 
\t \t 
 
\t \t public function BuyerEnter(event:TimerEvent) 
 
\t \t { 
 

 
\t \t \t Buyer_mc.Enter(); 
 
\t \t } 
 
\t \t 
 
\t \t public function OnReachMallDoor(event:ReachMallDoorEvent) 
 
\t \t { 
 
\t \t \t 
 
\t \t \t trace("my timer starts now"); 
 
\t \t } 
 
\t \t 
 
\t \t 
 

 
\t } 
 

 
}

Здесь OnReachMallDoor кажется, никогда не работать, потому что есть что-то не так. Я не могу видеть вывод, в котором говорится: «Мой таймер начинается сейчас». Но в коде нет ошибок, и вывод также не показывает ошибок во время выполнения. Где я ошибся? Я хочу, чтобы функция OnReachMallDoor запускалась, когда координата y находится в желаемой позиции, и событие отправляется.

+0

Просто подсказка для кодирования AS3. Имена экземпляров начинаются с строчной буквы, а имена классов начинаются с прописных букв. Это стандартная практика и помогает читать (и выделять код) – BadFeelingAboutThis

+0

Вы уверены, что ваше условие 'if (Buyer_mc.y == 377.25)' встречается? Положите оператор trace непосредственно перед и после этого, если инструкция для просмотра. Если не используется какой-то другой код, я не уверен, как он может быть «правдой» - вы начинаете свой «gameTimer», но ничего не делаете с ним или не слышите тики таймера. Похоже, вы хотите, чтобы если условие было в обработчике таймера – BadFeelingAboutThis

+0

Спасибо большое, я понял, что ошибка была только в том случае, если (Buyer_mc.y == 377.25) часто не встречался. :) – Mana

ответ

1

Порядок команд неправильный.

GenerateBuyers(); 
addEventListener(Rea... 

Первая строка из этих двух является тот, который потенциально может привести событие к отправке. Но только после этого вы начнете его слушать. Это слишком поздно. Вы должны начать прослушивание до Событие отправлено.

Вероятность отправки события очень низкая.

Buyer_mc.y==377.25 

Проверка значений с плавающей точкой на равенство часто не является хорошей идеей. Его легко можно было просто слегка отключить из-за ошибок округления и т. Д. Если бы это свойство .y управлялось мышью, например, вам нужно было бы поместить мышь в точно такое положение, что очень маловероятно.

Вы отправляете событие только в начале.

GenerateBuyers(); 

Эта функция вызывается только один раз. Оценивается позиция .y. Это происходит только один раз и никогда больше. Но положение .y может быть изменено, и состояние должно быть оценено снова, чего не происходит

Структура не рекомендуется.

Это не имеет большого значения для объекта для прослушивания его собственных событий. Просто вызовите функцию и сделайте с ней.

Мероприятия предназначены для связи между объектами.


Как это должно быть:

Суть обычая Event уведомляется о чем-то. Вы хотите получить уведомление, когда это условие

Buyer_mc.y==377.25 

верно. Если вы оцениваете это условие так, как это делаете сейчас, то нет смысла получать уведомление о его результате. У вас это уже есть.

Вместо этого Buyer_mc должен отправить Event. Условие должно быть проверено в классе Buyer.

Что выглядит код

некоторых фрагментах указывает, какие вышеуказанные средства, код тестировался:

класс Покупатель

override public function set y(value:Number):void 
{ 
    if (value == 377.25) 
     dispatchEvent(new ReachMallDoorEvent(ReachMallDoorEvent.CHECK)); // I'm at the position, I send out the notification 
    super.y = value; 
} 

класс FashionFrenzy

buyer = new Buyer(533.2, 0); // variables should start with small letter 
buyer.addEventListener(ReachMallDoorEvent.CHECK, OnReachMallDoor); 

Если теперь вы устанавливаете .y позиция к значению, объект отправит Event. Он будет считать это самостоятельно.

Позволяет объекту что-то выдумать самостоятельно и просто получать уведомление об этом является основной причиной использования пользовательских событий.

+0

Большое спасибо за подробный и объясненный ответ. Это очень помогло. – Mana

Смежные вопросы