ActionScript 3.0 Удаление массивов / остановок после перехода к следующему кадру

#flash #actionscript-3 #adobe

#flash #actionscript-3 #adobe

Вопрос:

Что у меня есть это:

 var ster:Array;
ster = new Array();

stage.addEventListener(Event.ENTER_FRAME, groente);

function groente(event:Event)
{
    if(Math.round(Math.random()*140) == 1)
    {
            ster.push(new groente1_MC());
            addChild(ster[ster.length-1]);
            ster[ster.length-1].x = machine.x
            ster[ster.length-1].y = machine.y 
            ster[ster.length-1].scaleX = 0.2;
            ster[ster.length-1].scaleY = 0.2;
    }
    for(var i:int = 0; i < ster.length-1; i  )
    {
            ster[i].y = ster[i].y   5;
            if( hero.hitTestObject(ster[i]) ) {
                ster[i].visible = false;
                score = score  1;
                Score.text = ""  score;

            }
    }
}   
  

Теперь проблема в том, что после перехода к следующему кадру. Я все еще вижу groente1_MC. И на моей стадии все еще появляются новые. Как я могу удалить все это и прекратить их создание после перехода к следующему кадру?

Комментарии:

1. Не могли бы вы кое-что уточнить — в настоящее время ваши экземпляры groente1_MC перемещаются в каждом кадре и иногда создаются новые экземпляры. Когда вы говорите, что переходите к следующему кадру, вы имеете в виду следующий экран вашей игры?

2. Когда вы завершаете игру. У меня есть эта строка и для другого объекта, но затем, после 5 обращений. вы вернетесь к главному экрану, чтобы «воспроизвести» его снова. к сожалению, при возврате к этому кадру. Я все еще вижу эти объекты (этот код находится в Frame3. И я возвращаюсь к Frame1)

Ответ №1:

Вам нужно удалить прослушиватель ENTER_FRAME, чтобы остановить перемещение и создание объектов, затем выполнить цикл по массиву, удаляя каждый объект со сцены, прежде чем очищать массив:

 function clearStage():void
{
    stage.removeEventListener(Event.ENTER_FRAME, groente);
    for each(var mc:groente1_MC in ster) {
        removeChild(mc);
    }
    ster = [];
}
  

Комментарии:

1. извините, не хватает пробела. Это должно быть for each

Ответ №2:

попробуйте

 for(var i:int = ster.length -1; i >= 0; i--)
{
        ster[i].y = ster[i].y   5;
        if( hero.hitTestObject(ster[i]) ) {
            ster[i].visible = false;
            score = score  1;
            Score.text = ""  score;
            removeChild(ster[i]);
            ster.splice(i, 1);
        }
}
  

пример:

             var ar:Array = [0,1,2,3,4,5,6,7,8,9,10]
            for(var i:int = ar.length - 1; i >= 0; i--){
                if(i % 2 == 0){                        
                    tf.text  =  i   ' : '   ar[i]   'n';                    
                    ar.splice(i,1);
                }
            }
            tf.text  = 'so : '   ar.join(', ');
  

tf.text является

10: 10
8: 8
6: 6
4: 4
2: 2
0: 0
итак : 1, 3, 5, 7, 9

Комментарии:

1. Просто вопрос по этому поводу: выполняет ли он переоценку ster. длина в начале цикла каждый раз? Не будет ли ster.splice изменять длину ster, и цикл будет делать странные вещи? Я просто помню, что однажды у меня было что-то подобное в Java, но это могло быть для каждого цикла