Просмотр полной версии : как повесить событие Event.ENTER_FRAME не на отображаемый объект?
Den_root
19.02.2012, 23:50
Господа, можно ли(и если до, то как) повесить слушатель события Event.ENTER_FRAME на объект, класс которого не был унаследован от DisplayObject и им подобным?
Это должен быть наследник EventDispatcher.
Повесить можно точно так же, но коли это не DisplayObject, ваш объект не будет посылать Event.ENTER_FRAME (если вы его не заставите, конечно).
Если вам требуется постоянно выполнять какие-то действия, воспользуйтесь классом Timer.
Den_root
20.02.2012, 00:22
Есть куча "не DisplayObject" объектов, которые должны получать событие Event.ENTER_FRAME. Что то вроде этого:public class Intelegence extends EventDispatcher{
public function Intelegence() {
addEventListener(Event.ENTER_FRAME, update);
}
public function update(e:Event):void {
//if (Input.KEY_W) entity.startUngine();
trace("Test");
}
}
Но данный код не работает:(
Так это другое дело! Берёте экземпляр этого вашего Intelegence (IntelegenceObj), зажимаете вместе с ним в углу любой не удаляемый на протяжении жизни display object (displayObj, root в качестве него подойдёт) и делаете ему так: displayObj.addEventListener(Event.ENTER_FRAME, IntelegenceObj.update);
И не будет. Лучше у всей этой кучи вызывайте апдейт из внешнего источника stage, например.
У EventDispatcher-а нет события Event.ENTER_FRAME. Я думал речь идет о dispatch-е. Тогда можно попробовать сочетать с таймером, как советовал Gaen.
А какой смысл в таких манипуляциях?
Zebestov
20.02.2012, 00:32
Птщь (http://www.flasher.ru/forum/showpost.php?p=1062026&postcount=15)
Den_root
20.02.2012, 01:04
А какой смысл в таких манипуляциях?
Замысел был такой: К объекту класса Intelegence приписан отображаемый объект, которым Intelegence,собственно, и управляет. Так как с "миром" будет взаимодействовать отображаемый объетк, а не эфемерный Intelegence, то и наследовать Intelegence от DisplayObject лишний раз не хотелось.
public class ArtificialIntelligence extends EventDispatcher{
public var entity:Entity;
public function Intelegence() {
entity = new Entity;
addEventListener(Event.ENTER_FRAME, update);
}
public function update(e:Event):void {
entity.doSomething();
}
}
Не вижу смысла в такой прослойке. В чем принципиальная необходимость не наследоваться от DisplayObject-а, если можно наследоваться от DisplayObject-а и переписать необходимый функционал?
Или же если необходимо спрятать функционал (частично или полностью), оставив лишь набор кастомных методов для взаимодействия с объектом, то почему не
entity.addEventListener(Event.ENTER_FRAME, update);
?
Кстати, вот так правильней:
entity = new Entity();
Никогда не парился, просто создавал экзепмляр Shape в таких случаях и подписывался на него c ENTER_FRAME.
Shape, потому что быстрее остальных DisplayObject-ов создается и меньше памяти ест.
Причём фишка в том, что этот shape добавлять никуда не надо - подписались - пошло распространение событий.
private var _enterFrameDispatcher:IEventDispatcher = new Shape();
...
_enterFrameDispatcher.addEventListener(Event.ENTER_FRAME, onEnterFrame);
Откуда какие-то заморочки с наследованием берутся? Главное знать когда отписаться - вот и вся премудрость.
Если вам требуется постоянно выполнять какие-то действия, воспользуйтесь классом Timer.
Иногда нужна синхронизация именно с кадрами
cleptoman
20.02.2012, 21:13
так создавать ничего не надо, если Entity - какойнить спрайт, подписали и вперед.
package {
import flash.events.EventDispatcher;
public class SomeClass extends EventDispatcher {
public function SomeClass(target:IEventDispatcher = null) {
super(target);
}
}
}А при инстанцировании класса - передавать ему в конструктор именно то, что и будет диспатчить enterFrame.
Не оно?
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.