Массивы, движение и ошибка 1010 - PullRequest
1 голос
/ 01 февраля 2012

По сути, я пытаюсь создать очень простую вертикальную систему метательных снарядов (пули движутся с постоянной скоростью, к пулям может быть применен hitTestObject и т. Д.), Но у меня возникают трудности при объединении чего-либо.

На данный момент мой код:

// define timer
var myTimer:Timer = new Timer(15);
// define array [list]
var list:Array = new Array();

myTimer.addEventListener(TimerEvent.TIMER, timerListener);
myTimer.start();

function timerListener(e:TimerEvent):void
{

    var Create:Bullet = new Bullet();
    addChild(Create);
    // Starting position
    Create.x = 150;
    Create.y = 150;
    // Push into list
    list.push(Create);
}

for (var i:int; i <= 10; i++){
    list[i].x + 10;
    i++;
    if (i > 10){
        i = 0;
    }
}

Проблема в том, что у меня возникают всевозможные проблемы с использованием for / while / etc, когда дело доходит до попытки составить список ссылок [i] .x и все объекты движутся с одинаковой скоростью, включая ошибки # 1010.

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

Ответы [ 3 ]

1 голос
/ 01 февраля 2012

Когда вы перемещаете свой список пуль, вам нужно правильно проиндексировать список.Причина, по которой вы получаете # 1010 «неопределенные» ошибки, заключается в том, что list [i] не всегда определяется.Вы также должны удалить все пули, которые сдвинулись с экрана.Я использовал 300 пикселей в качестве произвольной точки отсечения.Вы должны вызывать moveBullets () для таймера, возможно для вашего таймера 15 мс выше.

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

function moveBullets():void{
  var target:Bullet;
  for(var i:int=0;i<list.length;i++){
    target = Bullet(list[i]);
    target.x +=10;
    if(target.x > 300){
      removeChild(target);
      list.splice(i,1);
      i--;
    }
  }
}
0 голосов
/ 01 февраля 2012

В вашем коде второй цикл for (тот, который отвечает за перемещение маркеров) выполняется до того, как будет создан хотя бы один маркер. Вот почему вы получаете исключение нулевого указателя: Flash Player пытается переместить объекты, которые не существуют (пока). Вы всегда должны убедиться, что объекты существуют, прежде чем вызывать их.

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

Вкратце: Цикл движения должен быть в функции, которую вы периодически вызываете.

Кроме того, перебор массивов утомителен с помощью переменной счетчика - вы можете использовать for... in и просто забыть о длинах и тому подобном.

var createTimer : Timer = new Timer ( 15 );

var maxBullets : uint = 10;
var moveSpeed : uint = 10;

var list : Array = [];

createTimer.addEventListener ( TimerEvent.TIMER, onCreationTimer );
createTimer.start ();

addEventListener ( Event.ENTER_FRAME, onEnterFrame ); // <= this will call the 
                                                      //    motion loop each 
                                                      //    time the screen 
                                                      //    refreshes.

function onEnterFrame ( event : Event ) : void
{
    for each ( var bullet : Bullet in list) // <= move bullets and remove if off-screen
        if ((bullet.x += moveSpeed) > stage.stageWidth)
            removeChild ( list.splice ( list.indexOf ( bullet ), 1 )[0] );
}

function onCreationTimer ( e : TimerEvent ) : void
{
    if (list.length >= maxBullets) return;

    var bullet : Bullet = new Bullet ();
    list.push ( addChild ( bullet ) );
    bullet.x = bullet.y = 150;
}
0 голосов
/ 01 февраля 2012

Вы запускаете цикл for до того, как к сцене будут добавлены какие-либо приклады.

функция для цикла for должна выглядеть примерно так:

// define timer
var myTimer:Timer = new Timer(15);
// define array [list]
var list:Array = new Array();

myTimer.addEventListener(TimerEvent.TIMER, timerListener);
myTimer.start();

function timerListener(e:TimerEvent):void
{

    var Create:Bullet = new Bullet();
    addChild(Create);
    // Starting position
    Create.x = 150;
    Create.y = 150;
    // Push into list
    list.push(Create);
}

// the for loop functionality:
addEventListener ( Event.ENTER_FRAME, handleEnterFrame );

function handleEnterFrame ( e : Event )
{
//    for (var i:int; i <= 10; i++) -> why 10?

    var length_i:uint = list.length;
    var bulletMC:Bullet;
    for (var i:uint; i <= length_i; i++)
    {
        bulletMC = list[i];
        // list[i].x + 10; -> almost :)
        bulletMC.x += 10;

        // i++; -> you do need to do this the for loop automaticaly increases the i variable.

        // then you need to check if you still need the bullet ( is it of of the stage )
        if ( bulletMC.x > stage.stageWidth ) // here can be some other parameter
        {
            list.splice(i,1)
            list.removeChild ( bulletMC );
            i--; // since we removed one bullet from the array
            length_i = list.length // updating the lenght of the array
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...