Пользовательский прослушиватель событий не работает

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

Вот мой код:

package 
{

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

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

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

		}

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

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

	}

}

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


person Mana    schedule 29.04.2015    source источник
comment
Просто совет по кодированию AS3. Начинайте имена экземпляров со строчной буквы, а имена классов — с прописной. Это стандартная практика, которая способствует удобочитаемости (и выделению кода).   -  person BadFeelingAboutThis    schedule 29.04.2015
comment
Вы уверены, что ваше if(Buyer_mc.y == 377.25) условие выполнено? Поместите оператор трассировки непосредственно перед и после этого оператора if, чтобы увидеть. Если не задействован какой-то другой код, я не уверен, как это может быть true - вы запускаете свой gameTimer, но никогда ничего с ним не делаете и не слушаете тики таймера. Похоже, вы хотите, чтобы условие было в обработчике тика таймера   -  person BadFeelingAboutThis    schedule 29.04.2015
comment
Большое спасибо, я понял, что ошибка была только в том, что if(Buyer_mc.y == 377.25) встречался не часто. :)   -  person Mana    schedule 30.04.2015


Ответы (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. Оно само разберется.

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

person null    schedule 29.04.2015
comment
Большое спасибо за подробный и поясненный ответ. Это очень помогло. - person Mana; 30.04.2015