Как я могу это решить?

Я делаю игру, в которой насекомые сверху экрана двигаются вниз к низу. Цель игрока состоит в том, чтобы убить этих насекомых своей мышью. При убийстве насекомое должно показать кадр уничтожения, куда я его вставил. Кадр уничтожения останется там на 3 секунды, а объект будет удален. Это также увеличит счет игрока.

Этот код написан внутри насекомого:

function kill(event:MouseEvent):void
{
this.dead = true;

}

Этот код записывается внутри фонового кадра мувиклипа.

function moveEnemies():void
{
var tempEnemy:MovieClip;

for (var i:int =enemies.length-1; i>=0; i--)
{
    tempEnemy = enemies[i];
    if (tempEnemy.dead)
    {

        tempEnemy.gotoAndStop(21);
        var myTimer:Timer = new Timer(3000);
        myTimer.addEventListener(TimerEvent.TIMER, timerListener);
        myTimer.start();
}
}
}
function timerListener (e:TimerEvent):void
{

for (var i:int =enemies.length-1; i>=0; i--)
{
if (tempEnemy.dead)
{
    score++;
    roachLevel.score_txt.text = String(score);
removeEnemy(i);

}


}
}
function removeEnemy(id:int)
{

removeChild(enemies[id]);
enemies.splice(id,1);
}

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


person user2884909    schedule 16.10.2013    source источник
comment
Проблема в том, что вы убираете врагов раз в 3 секунды. Вы должны сделать это, когда вместо этого нажимаете на врага.   -  person Pier    schedule 16.10.2013
comment
Пожалуйста, используйте более описательный заголовок для вопроса.   -  person Maic López Sáenz    schedule 16.10.2013


Ответы (1)


Вы должны переместить добавление очков к классу врага и назначить тайм-аут конкретному раздавленному врагу вместо базового класса. Лучше всего это сделать в функции kill().

function kill(e:MouseEvent):void {
    this.dead=true;
    gotoAndStop(21);
    flash.utils.setTimeout(removeSelf,3000);
}
function removeSelf():void {
    this.parent.removeChild(this);
}

Теперь настройте механику подсчета очков и отслеживания объектов. Во-первых, если объект становится dead, вы немедленно удаляете его из массива врагов (он справится с его удалением самостоятельно) и даете за него баллы. А во-вторых, весь остальной функционал должен быть сохранен.

for (var i:int=enemies.length-1;i>=0;i--) {
    var tempEnemy=enemies[i];
    if (tempEnemy.dead) {
        score++;
        enemies.splice(i,1);
    } else {
        tempEnemy.y++; // or other move function
    }
}

Этот цикл должен находиться в прослушивателе enterframe, поэтому он будет вызываться один раз за кадр. Кроме того, сочетание сплайсинга и перемещения, как здесь, устраняет необходимость размещения кода перемещения в другом месте, так как вы все равно выполняете итерацию по массиву.

person Vesper    schedule 16.10.2013