数组,移动和错误1010

时间:2012-02-01 16:26:10

标签: flash actionscript-3

基本上我要做的是制作一个非常简单的垂直子弹射弹系统(子弹以一致的速度移动,子弹可以应用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;
    }
}

问题是当我尝试引用list [i] .x并让所有对象以一致的速度移动时,包括#1010错误,我一直在使用for / while / etc时遇到各种各样的问题。

如果有人知道更好的方法来做我正在寻找的东西,或修复我当前的代码,我将非常感激。 :)

3 个答案:

答案 0 :(得分:1)

当您移动项目符号列表时,需要正确索引列表。你得到#1010&#39; undefined&#39;错误是因为list [i]并不总是被定义。您还应该删除已移出屏幕的所有项目符号。我使用300像素作为任意截止点。你应该在一个计时器上调用moveBullets(),可能在你的15ms计时器上。

试试这个:

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--;
    }
  }
}

答案 1 :(得分:0)

在向舞台添加任何项目之前运行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
        }
    }
}

答案 2 :(得分:0)

在你的代码中,第二个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;
}