Невозможно получить доступ к детям в клипе

Внутри Flash CS6 я нарисовал мувиклип, в котором я установил настройки экспорта как abc.Gameboard. Внутри игровой доски у меня есть куча фигур (символ:Piece), которые я экспортирую как abc.Piece - как базовый класс, установленный в MovieClip, так и с файлами классов. Кусок имеет метки кадров, такие как "удар", "над" и т. Д. Моя проблема - доступ к фрагментам кода, поэтому я могу, например. gotoAndPlay("mine") - в данный момент событие срабатывает только один раз, что является последним элементом на доске. Я могу установить действие кадра на этом последнем фрагменте, но хотел бы выяснить, как сделать то же самое для каждого фрагмента.

Я добавляю игровую доску на сцену так

var gb:Gameboard = new Gameboard();
gb.name = "gb001";
contextView.addChild(gb);

затем

contextView.addEventListener(Event.ADDED, thingAdded);

private function thingAdded(event:Event):void
{
    var type:String = event.target.toString();
    switch(type)
    {
        // this runs only once - i want it to run for each piece that is inside the symbol
        case "[object Piece]":

        var p:MovieClip = event.target as Piece;
        p.gotoAndPlay("mine");
        break;
    }
}

или если есть лучший способ, который был бы великолепен.. это выглядит довольно неуклюжим

Изменить: Немного больше информации о том, как я пытаюсь создать игровую доску. Нарисуйте коллекцию фигур в иллюстраторе - замаскируйте ее (область игровой доски). Импортировать во Flash как графический. Преобразование графики в несколько символов фрагмента ролика (чтобы JSFL мог детализировать и получать доступ к замаскированным частям) - запустите сценарий JSFL и создайте 00 частей. Затем я устанавливаю настройки экспорта в Piece и Gameboard и добавляю Gameboard в contextView.

2 ответа

Решение

Я действительно написал целую статью об этом однажды. ADDED событие должно запускаться один раз для каждого добавляемого объекта DisplayObject. Вы уверены, что не используете ADDED_TO_STAGEкоторый не пузырится? Если вы используете ADDED_TO_STAGE, затем вам нужно установить флаг useCapture в true, чтобы он срабатывал для всех детей.

Если вы хотите задействовать RobotLegs в этом процессе, возможно, лучше всего просто создать "маркерный" класс для каждой конкретной кнопки, для которой вы хотите, чтобы поведение велось по-своему, а затем зарегистрировать посредник для каждого класса, который будет управлять объектом., Robotlegs уже имеет встроенные хуки для прослушивания ADDED_TO_STAGE и делает это.

Тем не менее, вы также можете рассмотреть возможность использования Flash IDE для чего-то, что выводит вещи на сцену. В этом случае ваш экземпляр GameBoard будет готов в конструкторе вашего основного документа Class, чтобы вы могли делать с ним все, что захотите.

MPO заключается в том, что логика, которая находится вне Gameboard, не должна знать или заботиться о том, как она работает внутри, и, честно говоря, вероятно, даже GameBoard не должна отвечать за такие простые вещи, как состояния кнопок и другие вещи. Это должно быть до самой кнопки. Если кнопки не нуждаются в переключении или что-то помимо того, что обрабатывает SimpleButton, вы можете просто объявить экземпляры кнопок как Button в библиотеке вместо MovieClip и получить все эти вещи бесплатно вместо того, чтобы кодировать их самостоятельно.

Часть того, чтобы быть хорошим программистом, состоит в том, чтобы находить способы не кодировать все.

В их игровой доске внутри фигуры? Я хочу точно знать вашу структуру игровой доски.

Если ты прав. попробуй это:

function thingAdded(e:Event):void
{
    if(!e.target is Gameboard) return;

    var mc:Gameboard = Gameboard(e.target);

    var i:int = 0;
    while(i<mc.numChildren)
    {
        if( mc.getChildAt(i) is Piece)
        {
            var piece:Piece = Piece(mc.getChildAt(i));

            piece.gotoAndStop(2);
        }
        i++;
    }
}

Вот мой пример кода:

Другие вопросы по тегам