Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 19.11.2015, 13:01
бакуард вне форума Посмотреть профиль Отправить личное сообщение для бакуард Найти все сообщения от бакуард
  № 1  
Ответить с цитированием
бакуард

Регистрация: Mar 2015
Сообщений: 64
По умолчанию Пользовательские события. Композиция.

Доброго времени суток.

Разрабатываю небольшую игру. Проблема возникла когда реализовывал смерть персонажа. Чтобы оповестить
все классы о смерти персонажа решил использовать собственное событие. Поскольку класс персонажа уже расширяет класс Sprite, а реализовывать интерфейс IEventDipatcher не очень хочется (просто не знаю как) решил создать отдельный класс расширяющий EventDispatcher. Внутри этого класса есть открытый метод внутри которого создается новое событие.
В классе персонажа создается экземпляр класса унаследованного от EventDispatcher и используя композицию вызывается метод создающий новое событие. Во всех остальных классах также создаются экземпляры класса унаследованного от EventDispatcher и подписываются на это событие.
Проблема: событие не срабатывает (слушатели не вызываются), никаких ошибок и исключений нет.

Привожу код (код я специально сильно упростил).

Класс события:
Код AS3:
package {
 
	import flash.events.Event;
	import flash.events.EventDispatcher;
 
	public class GameOverEvent extends EventDispatcher{
 
		public static const GAME_OVER:String = "gameOver";
 
		public function GameOverEvent(){
 
		}
 
		internal function gameOverListener():void{
			dispatchEvent(new Event(GameOverEvent.GAME_OVER));
		}
 
	}
}
Код класса создающего экземпляр GameOverEvent и вызывающий метод gameOverListener использую композицию:
Код AS3:
package {
 
	import flash.utils.Timer;
	import flash.events.*;
 
	public class Compozition{
 
		private var timer:Timer;
		private var gameOverEvent:GameOverEvent;
 
		public function Compozition(gameOverEvent){
			gameOverEvent = new GameOverEvent();
 
			timer = new Timer(1000);
			timer.addEventListener(TimerEvent.TIMER, endListener);
			timer.start();
		}
 
		private function endListener(e:TimerEvent):void{
			if(timer.currentCount == 10){
				gameOverEvent.gameOverListener();
			}
		}
 
	}
}
Код класса подписывающегося на событие GameOverEvent.GAME_OVER:
Код AS3:
package {
 
	import flash.display.Sprite;
	import flash.utils.Timer;
	import flash.events.*;
 
	public class MySprite extends Sprite{
 
		private var timer:Timer;
		private var gameOver:GameOverEvent;
 
		public function MySprite(){
			this.x = 200;
			this.y = 300;
 
			timer = new Timer(1000);
			timer.addEventListener(TimerEvent.TIMER, moveListener);
			timer.start();
 
			gameOver = new GameOverEvent();
			gameOver.addEventListener(GameOverEvent.GAME_OVER, gameOverListener);
		}
 
		private function moveListener(e:TimerEvent):void{
			this.x += 5;
		}
 
		private function gameOverListener(e:Event):void{
			timer.stop();
			timer.removeEventListener(TimerEvent.TIMER, moveListener);
			trace("сработало пользовательское событие");
		}
 
	}
}
Подскажите пожалуйста, где может быть ошибка или возможно я вообще ерунду делаю.

Создать новую тему   Часовой пояс GMT +4, время: 18:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 18:52.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.