Странные проблемы при использовании addChild и hitTest с AS3

У меня возникла пара проблем при добавлении ребенка в сценарий действия 3. В настоящее время я создаю игру Space Invaders и пишу функцию, которая добавляет астероиды на сцену.

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

Моя вторая проблема связана с добавлением функции hitTestOject. Он выдает ошибку и ничего не делает, когда космический корабль сталкивается с астероидом.

Вот ошибка, которую я получаю с помощью hitTestObject:

TypeError: Ошибка № 1034: Ошибка приведения типа: невозможно преобразовать «ast_0» в flash.display.DisplayObject. в spaceranger_fla::MainTimeline/addAstroid() в flash.utils::Timer/_timerDispatch() в flash.utils::Timer/tick()

И вот мой код. Я использую таймер, чтобы каждый астероид добавлялся каждые 5000 мс:

// Add astoid
var astTimer:Timer = new Timer(5000);
astTimer.addEventListener(TimerEvent.TIMER, addAstroid);
var i:Number = 0;
function addAstroid (e:TimerEvent):void{
    var ast = new astroid();
    ast.name = "ast_"+i;
    ast.y = Math.random()*stage.stageHeight;
    ast.x = 565;
    addChild(ast);
    trace(i);
    if(ship.hitTestObject(ast.name)){
        gotoAndStop("2");
    }
i = i+1;
}

astTimer.start();

Некоторые советы, рекомендации и ответы будут очень признательны :)

ОБНОВЛЕНИЕ

Я разобрался с ошибкой зацикливания. Старые астероиды больше не появляются снова! :D

Огромное спасибо,

Питер Стюарт


person Peter Stuart    schedule 05.05.2013    source источник


Ответы (2)


В вашей первой проблеме не появляется приращение i - всегда 0.

Когда вы назначаете имя, увеличивайте i:

ast.name = "ast_" + (i++).toString();

В общем, говоря i = i + 1;

Далее, нажмите test на самом экземпляре, а не на личности:

ship.hitTestObject(ast)

Не уверен, как работает ваша игра, но, похоже, вам действительно нужны два обработчика:

  • один, чтобы иногда добавлять новый астероид
  • тот, который проверяет столкновения

В настоящее время ваша функция addAsteroid() добавляет новый астероид и немедленно проверяет, сталкивается ли он с кораблем при создании. Этот астероид больше никогда не будет проверен на столкновение. Если это похоже на классическую игру с астероидами, вы можете поместить каждый астероид в массив и добавить прослушиватель событий для ENTER_FRAME, чтобы проверять каждый астероид на столкновение с кораблем.

person Jason Sturges    schedule 05.05.2013
comment
Согласно вашему редактированию только что, я вижу, вы добавили i=i+1; в свой пример. - person Jason Sturges; 05.05.2013
comment
Привет, Джейсон, да, я удалил код приращения при отладке, я забыл добавить его, однако это не изменило ситуацию. Каждый объект-астероид представляет собой мувиклип, и мувиклип зацикливается. Я исправил это, добавив stop() в конце анимации движения. Теперь мой hitTestObject работает? - person Peter Stuart; 05.05.2013
comment
Да, твой ответ мне понятен! Я создам таймер, который проверяет хиты каждые 500 миллисекунд! Спасибо :) - person Peter Stuart; 05.05.2013

ship.hitTestObject(ast.name) не будет работать, потому что ast.name — это String, а не DisplayObject.

Попробуй это :

if(ship.hitTestObject(ast)){
        gotoAndStop("2");
    }
person prototypical    schedule 05.05.2013
comment
Не повезло, ship.hitTestObject(ast) возвращает false :( - person Peter Stuart; 05.05.2013
comment
Вопрос об ошибке принуждения, это решает эту проблему. Если он возвращает false, и вы не знаете почему, это другой вопрос. Откройте новый вопрос. - person prototypical; 05.05.2013
comment
Так что примите этот ответ, он устраняет ошибку принуждения. Если вы не принимаете ответы, которые решают проблемы, как вы думаете, насколько вероятно, что кто-то поможет вам с вашей следующей проблемой? - и, кстати, этот новый вопрос имеет ту же проблему, что и этот ответ. - person prototypical; 05.05.2013
comment
Нет, но это не решает общей картины. Не говорите мне, какие ответы принимать, это на мое усмотрение. Это решило часть проблемы, 1+ за это, но в скрипте все еще есть проблемы .... Теперь я все еще получаю false с hitTest, но я думаю, что это потому, что он запускает hitTest в момент его выполнения. добавлено, а не позже. - person Peter Stuart; 05.05.2013
comment
Вы не обязаны принимать ответы, но, как я уже сказал, зачем кому-то помогать вам с вашей следующей проблемой, если вы этого не сделаете? Это сайт вопросов и ответов, а не отладка моей программы на одном сайте вопросов. Если у вас есть несколько проблем в одном вопросе, вы слишком широко задаете свои вопросы. - person prototypical; 05.05.2013