В вашем коде второй цикл 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;
}