Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обработка события размещенного в контейнер (http://www.flasher.ru/forum/showthread.php?t=169221)

HoneyBunny. 30.09.2011 04:11

Обработка события размещенного в контейнер
 
Доброе время суток.

Хотел бы задать следующие вопросы.

Есть класс, объект которого, по достижению некоторого условия, должен удаляться со сцены.
Код AS3:

package by.me
{
        ...
        public class Coin extends Sprite
        {
                ...
                private var _mainContainer:Object3DContainer;
 
                public function Coin(mainContainer:Object3DContainer)
                {
                        super();
                        this._mainContainer = mainContainer;
                        ...
                        this._mainContainer.addEventListener(Coin.CHECK, onCheck);
                }
                private function onCheck(e:Event):void
                {
                        if (this._body.z < -500) this.remove();
                }
                private function remove():void
                {
                        this._mainContainer.removeEventListener(Coin.CHECK, onCheck);
                        this._mainContainer.dispatchEvent(new Event(Coin.REMOVE));
                }
        }
}

Есть соответственно класс, в котором создаются эти коины.
Код AS3:

package by.me
{
        import by.me.Coin;
        ...
        public class MyPhysics extends Alternativa3dPhysics
        {
                private var _mainContainer:Object3DContainer;
                private var coinsVector:Vector.<Coin>;
                ...
 
                public function MyPhysics(mainContainer:Object3DContainer)
                {
                        this._mainContainer = mainContainer;
                        super(this._mainContainer, MyPhysics.SPEED);
                        coinsVector = new Vector.<Coin>();
                        this._mainContainer.addEventListener(Coin.REMOVE, onCoinRemove);
                }
                public function fillWithCoins():void
                {
                        for (var i:uint = 0; i < 4; i++)        {
                                for (var j:uint = 0; j < 2; j++)        {
                                        coinsVector[i] = new Coin(this._mainContainer);
                                        ...
                                }
                        }
                }
                private function onCoinRemove(e:Event):void
                {
                        var i:uint;
                        i = coinsVector.indexOf(e.target);
                        removeBody(coinsVector[i]._body);
                        coinsVector.splice(i, 1);
                }
        }
}

На данный момент, на функции удаления монетки из вектора, я в e.target и в e.currentTarget получаю null. Поэтому в i у меня 0xffffff, в общем ничего хорошего из этого не выходит, так как удалять нечего. При этом сам объект пока никуда не делся.

Функция onCheck вызывается следующим образом:
Код AS3:

        this._mainContainer.dispatchEvent(new Event(Coin.CHECK));

через каждые 40 OnEnterFrame'ов.



Вопросы:
1) Почему передаются null, как исправить.
2) Стоит ли переделывать через DataEvent, передавая в ней какой-нибудь идентификатор, this.name, к примеру.
3) Стоит ли проверку вообще проводить внутри самого объекта, может правильнее проверять весь вектор в MyPhysics.

goodguy 30.09.2011 07:13

Трейсы уже не в моде?

Функция заполнения вектора монетками-то есть, а где она вызывается не вижу.

tofflife 30.09.2011 11:06

null попробуйте исправить, заменив

Код AS3:

this._mainContainer.addEventListener(Coin.REMOVE, onCoinRemove);

на

Код AS3:

this._mainContainer.addEventListener(Coin.REMOVE, onCoinRemove, true);

2) - Не критично

3)Стоит, т.к. в таком случае фаша функция переносима и может быть применена в любом другом классе, где нет вектора.

P.S Почита

HoneyBunny. 30.09.2011 12:53

@goodguy - trace в моде, просто как и многое другое были убраны из цитируемого кода, как не важное, для читабельности.

@tofflife - спасибо, по поводу UseCapture=true, помогло, пойду читать что и почему. Ну а потом переделаю по пункту 3.

Psycho Tiger 30.09.2011 21:05

Если разберетесь - отпишитесь сюда, пожалуйста. Мне очень интересно, как может быть target/currentTarget = null, и как в capture-phase это исправляется.


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

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