PDA

Просмотр полной версии : как повесить событие Event.ENTER_FRAME не на отображаемый объект?


Den_root
19.02.2012, 23:50
Господа, можно ли(и если до, то как) повесить слушатель события Event.ENTER_FRAME на объект, класс которого не был унаследован от DisplayObject и им подобным?

TanaTiX
19.02.2012, 23:55
Это должен быть наследник EventDispatcher.

Gaen
20.02.2012, 00:11
Повесить можно точно так же, но коли это не 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");
}
}
Но данный код не работает:(

-De-
20.02.2012, 00:28
Так это другое дело! Берёте экземпляр этого вашего Intelegence (IntelegenceObj), зажимаете вместе с ним в углу любой не удаляемый на протяжении жизни display object (displayObj, root в качестве него подойдёт) и делаете ему так: displayObj.addEventListener(Event.ENTER_FRAME, IntelegenceObj.update);

GBee
20.02.2012, 00:29
И не будет. Лучше у всей этой кучи вызывайте апдейт из внешнего источника stage, например.

TanaTiX
20.02.2012, 00:29
У 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();
}
}

TanaTiX
20.02.2012, 01:17
Не вижу смысла в такой прослойке. В чем принципиальная необходимость не наследоваться от DisplayObject-а, если можно наследоваться от DisplayObject-а и переписать необходимый функционал?
Или же если необходимо спрятать функционал (частично или полностью), оставив лишь набор кастомных методов для взаимодействия с объектом, то почему не
entity.addEventListener(Event.ENTER_FRAME, update);
?
Кстати, вот так правильней:
entity = new Entity();

expl
20.02.2012, 01:35
Никогда не парился, просто создавал экзепмляр 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 - какойнить спрайт, подписали и вперед.

BuKT
22.02.2012, 07:58
package {
import flash.events.EventDispatcher;
public class SomeClass extends EventDispatcher {
public function SomeClass(target:IEventDispatcher = null) {
super(target);
}
}
}А при инстанцировании класса - передавать ему в конструктор именно то, что и будет диспатчить enterFrame.
Не оно?