Проверка элементов массива as3

У меня есть 4 клипа в массиве

var tiles:Array = new Array("tile1","tile2","tile3","tile4");

Внутри каждого есть код, который исчезает при щелчке мышью на втором кадре.

this.visible = false;

Из основной временной шкалы находится управление щелчком мыши для каждой из плиток (отображается только первая).

tile1.addEventListener(MouseEvent.CLICK, fl_);

function fl_(event:MouseEvent):void
{
    tile1.gotoAndStop(2);
}

Как мне сделать так, чтобы когда все плитки в массиве стали невидимыми, вспыхнуло, чтобы выполнить действие (например, перейти к кадру 5)?

Спасибо!


person Johnnien    schedule 25.09.2014    source источник


Ответы (1)


Я посмотрел на ваш .fla. Вот два способа сделать то, что вы хотите:

На вашей основной временной шкале: (замените текущий код кадра 1 основной временной шкалы следующим)

stop(); 

//loop through every child of the `cont` container, and add the same click listener
var i:int = cont.numChildren
while(i--){
    var tile:MovieClip = cont.getChildAt(i) as MovieClip;
    if(tile){
       tile.addEventListener(MouseEvent.CLICK, tileClick, false,0,true);
    }
}

function tileClick(e:MouseEvent):void {
    //this gets a reference to one that was clicked
    var tile:MovieClip = e.currentTarget as MovieClip;

    tile.gotoAndStop(2);

    //loop through the tile array to see if any are still visible
    var i:int = cont.numChildren
    while(i--){
        tile = cont.getChildAt(i) as MovieClip;
        if(tile && tile.currentFrame == 1) return;
    }

    //if we got this far, all the tiles are hidden, lets go to frame 5.
    gotoAndStop(5);
}

Если приведенное выше пугает и вы предпочитаете оставить все как было раньше, то это все, что вам нужно сделать: (опять же, этот код заменит ваш текущий основной код кадра 1 временной шкалы)

stop();

cont.tile1.addEventListener(MouseEvent.CLICK, tileClick);
cont.tile2.addEventListener(MouseEvent.CLICK, tileClick);
cont.tile3.addEventListener(MouseEvent.CLICK, tileClick);
cont.tile4.addEventListener(MouseEvent.CLICK, tileClick);

function tileClick(e:MouseEvent):void {
    MovieClip(e.currentTarget).gotoAndStop(2);
    if(cont.tile1.currentFrame == 1) return;
    if(cont.tile2.currentFrame == 1) return;
    if(cont.tile3.currentFrame == 1) return;
    if(cont.tile4.currentFrame == 1) return;

    //if we got this far, all the tiles are hidden, lets go to frame 5.
    gotoAndStop(5);
}
person BadFeelingAboutThis    schedule 25.09.2014
comment
Большое спасибо за ваш ответ, я просто спросил, как я могу перейти на кадр 5, не меняя текущую конфигурацию. Он должен перейти к кадру 2 внутри тайла, а эти тайлы на самом деле находятся внутри контейнера mc. Я надеялся, что из ответа здесь я выясню остальное, но теперь это стало намного сложнее, в любом случае, спасибо. Кстати, вот файл: app.box.com/files/ 0/f/0/1/f_21071986269 - person Johnnien; 26.09.2014
comment
Я не уверен, что еще вы хотите сделать? Сделать так, чтобы плитка, по которой щелкнули, перешла на кадр 2, достаточно легко (я обновил ответ), с чем еще вы боретесь? - person BadFeelingAboutThis; 26.09.2014
comment
У меня есть tile.visible = false; на втором кадре внутри тайла. Чтобы перейти к этому кадру 2, у меня есть cont.tile1.addEventListener(MouseEvent.CLICK, fl_); function fl_(event:MouseEvent):void { tile1.gotoAndStop(2); } И так у меня есть 4 плитки внутри mc, называемые cont. После того, как все они нажаты и становятся невидимыми, мне нужно предпринять какие-либо действия, например, перейти к пятому кадру на основной временной шкале. Вот и все! Я не уверен, нужен ли массив. Спасибо. - person Johnnien; 28.09.2014
comment
Если единственными дочерними элементами cont являются 4 плитки, вы можете сделать это так же, но без массива. Нет никаких причин, по которым вы не можете вернуться к добавлению отдельного слушателя для всех 4 плиток, как вы делали это раньше, это просто больше кода (и если вы хотите что-то изменить позже, вам нужно изменить это в 4 разных местах вместо 1) - person BadFeelingAboutThis; 29.09.2014
comment
app.box.com/s/psg9ocy475j4ymowcme6 На самом деле это файл. Нет, это должно быть в этой конфигурации, потому что этот контейнер mc будет уровнем для игры. Я хочу перейти только к пятому кадру, когда они все невидимы. Это превратилось в чрезвычайно сложную задачу, и я уже больше недели мечтаю об этом. - person Johnnien; 30.09.2014
comment
Я посмотрел на ваш .fla и дополнил ответ. Пробовал оба способа, которые я написал, и они работают. - person BadFeelingAboutThis; 30.09.2014
comment
Спасибо большое вы молодцы! Это намного проще! - person Johnnien; 01.10.2014