Как проверить все экземпляры мувиклипа — ACTIONSCRIPT 2

Я делаю игру в жанре Tower Defense и довел ее до того, что мои башни стреляют пулями через определенные промежутки времени. Но мне нужно иметь возможность удалять мувиклипы. Например, если башня стреляет пулей, она создает копию мувиклипа пули, нацеленного на дубликат конкретного врага. Однако я не могу понять, как настроить hitTest. Есть ли способ gt hittest для проверки всех дочерних мувиклипов, дублированных из определенного объекта?

РЕДАКТИРОВАТЬ: я добавил эту функцию, которая должна выполняться каждую секунду. Но почему-то не подтверждает попаданий.

function checkHits(){//checks for hits between enemies and bullets
for (var zz = 0; zz < bulletArray.length; zz += 1)//checks for each bullet
{
    for(var yy=0;yy<enemiesArray.length;yy+=1){//checks for each enemy
        trace("enemies loc"+yy+":"+enemiesArray[yy]);
        trace("bullet loc"+zz+":"+bulletArray[zz]);
        if(bulletArray[zz].hitTest(enemiesArray[yy])){
            trace("HIT!");
           removeMovieClip(bulletArray[zz]);
           removeMovieClip(enemiesArray[yy]);
           bulletArray.splice(zz,1);
           bulletArray.splice(yy,1);
           }//end if
    }//end for
}//end for

}

function dupeCircle()
{
//trace("Dupe circle initiated");
duplicateMovieClip(circlebase, "_root.circle" + circleCount, circleCount);
bulletArray.push("circle" + circleCount);
trace(bulletArray[0]._width);
circleCount += 1;
}

Это код объекта, который добавляет круги.


person Nick    schedule 18.02.2012    source источник


Ответы (2)


Вы можете сохранить массив со всеми клипами, которые вы хотите протестировать, а затем просмотреть этот массив и проверить каждый из них. Поэтому всякий раз, когда вы добавляете один на экран, добавляйте его в этот массив. Затем, когда вы хотите протестировать, проверьте всех в этом массиве. Если вы хотите удалить его, удалите его из массива и экрана.

ИЗМЕНИТЬ

Вот что я думаю сделать в этом случае...

function dupeCircle() 
{    
    //trace("Dupe circle initiated"); 
    bulletArray.push(duplicateMovieClip(circlebase, "_root.circle" + circleCount, circleCount));
    circleCount += 1; 
 }

По сути, просто сохраните настоящий мувиклип в массиве, а затем вы сможете делать то, что пытались сделать с bulletArray[index].hitTest, и, надеюсь, это сработает. (Сделайте то же самое, когда вы сохраняете фактический мувиклип для другого массива)

person M. Laing    schedule 18.02.2012
comment
Я думал об этом, но как мне успеть проверить это? Если у меня на экране 30 врагов и 30 пуль, должен ли каждый экземпляр постоянно проверяться? Или лучше иметь стек для каждого массива для каждой пули и каждого врага, который проходит через них всех; и чтобы он проверял каждую секунду? - person Nick; 18.02.2012
comment
Ну, есть много разных методов, которые вы могли бы использовать для проверки. Одна вещь, которую я люблю делать при создании игры, — это создавать основной цикл, потому что я привык к C++, а основной цикл всегда есть. Я не знаю, лучший ли это способ сделать это во флэш-памяти, но я делаю это так, и у меня не было никаких проблем. Я думаю, что таймер — хороший способ реализовать этот цикл. Ваш код, который вы добавили, выглядит как правильная идея. Не знаю, почему не бьет. Попробуйте опубликовать код, где вы вызываете эту функцию (часть прослушивателя событий) и где вы добавляете врагов и пули в массив. - person M. Laing; 19.02.2012
comment
Я проверил и через устранение неполадок обнаружил, что он распознает объекты в массиве. Например, я могу использовать removeMovieClip(enemiesArray[yy]), чтобы убрать врага со сцены, но я не могу получить доступ ни к каким методам или свойствам мувиклипа. Я думаю, что это моя проблема, так как я использую функцию hitTest в мувиклипе. Есть ли какая-то причина, по которой я не смогу получить доступ к свойствам? РЕДАКТИРОВАТЬ: все они приходят неопределенными - person Nick; 19.02.2012
comment
И что бы это ни стоило, функция checkHits настроена на срабатывание в каждом кадре. - person Nick; 19.02.2012
comment
Ну, если все свойства равны NULL, что-то не так... Опубликуйте код, в котором вы добавляете его в массив. - person M. Laing; 19.02.2012
comment
Хм, я отредактирую свой пост на то, что, по моему мнению, вы должны попробовать (что я обычно делаю). Я не совсем уверен, что вы пытаетесь сделать, сохраняя в массиве только кружок #. Я обычно храню фактический объект... См. мой отредактированный пост выше... - person M. Laing; 19.02.2012
comment
Я вставил этот код. дубликатMovieClip (база круга, _root.circle + кругКоличество, кругКоличество); Я не использовал root, потому что это функция корневого уровня. Даже с вашей строкой она по-прежнему не определена, когда я пытаюсь проверить ширину объекта. - person Nick; 19.02.2012
comment
function dupeCircle() { // трассировка (Инициирован дублирующий круг); дубликатMovieClip (база круга, _root.circle + кругКоличество, кругКоличество); bulletArray.push(круг + кругКоличество); кругКоличество += 1; } Это код. Это идентичный метод, за исключением изменения метода дублирования. - person Nick; 19.02.2012
comment
Этот код такой же, как и в вашем исходном сообщении... но вы говорите, что пытались напрямую вставить мувиклип в массив, и это не работает? Отредактируйте свой исходный пост, чтобы точно указать самый последний код, который вы пытаетесь использовать, и где вы пытаетесь получить доступ к свойству ширины, чтобы мы могли точно видеть, что происходит. - person M. Laing; 19.02.2012
comment
Я отредактировал его. Я только что проверил его после первоначального нажатия, потому что я знаю, что он будет там, и мне нужна была только одна проверка. - person Nick; 19.02.2012
comment
давайте продолжим это обсуждение в чате - person Nick; 19.02.2012

Вы удаляете 2 раза из bulletArray:

       bulletArray.splice(zz,1);
       bulletArray.splice(yy,1);

Последним должно быть удаление врагов, я думаю. может быть, это выдает ошибку, когда вы позже пытаетесь удалить врага, которого вы уже удалили со сцены?

person User    schedule 18.02.2012
comment
Если я сначала склею, то при попытке удалить, он удалит не тот объект, я полагаю - person Nick; 19.02.2012
comment
Я имею в виду, что вы удаляете пулю 2 раза, и вы не удаляете врага из массива врагов. Должна ли последняя строка быть врагамиArray.splice(yy,1) вместо bulletArray.splice(yy,1);? - person User; 19.02.2012
comment
Спасибо. Я пропустил это, но я не думаю, что это было причиной проблемы. - person Nick; 19.02.2012
comment
Да дело в том, что это на самом деле невозможно, так как, если его убрать со сцены, он ничего не проверит. Тогда не знаю :/ - person User; 19.02.2012