2012-03-08 70 views
-1

TypeError:错误#1009:无法访问空对象引用的属性或方法。 Main_fla :: MainTimeline/BulletFire()[Main_fla.MainTimeline :: frame32:68]中的 。正在发生,我不知道为什么...请帮助,这是我的几天解决这个问题,我完全失去了。谢谢你,也因为某些原因,当我火那就只在45度和225度的子弹......谢谢你们错误#1009,ActionScript 3,项目符号为空

//Create an array to hold multiple sprites 
var mySpriteHolder:Array = []; 
//Create a counter to keep track of the number of sprites 
var lbCounter:int = 0; 
//Maximum number of sprites on the canvas 
var maxLB:int = 1; 
//Keypress Code 
stage.addEventListener(MouseEvent.CLICK, dropBullet); 
//Function for the mouse event to fire bullet 
function dropBullet(evt:MouseEvent):void{ 

    var bcos:Number = Math.cos((Turret.rotation) * Math.PI/180); 
    var bsin:Number = Math.sin((Turret.rotation) * Math.PI/180); 

    //starting x and y 
    var startx:Number = Turret.x + (15 * bcos); 
    var starty:Number = Turret.y + (15 * bsin); 

    //calculates where the bullet needs to go by aiming in front of the gun 
    var endx:Number = Turret.x + (50 * bcos); 
    var endy:Number = Turret.y + (50 * bsin); 

    var Bullet:MovieClip = new bullet(); 

    Bullet.x = startx; 
    Bullet.y = starty; 

    Bullet.xspeed = (endx - startx)/5; 
    Bullet.yspeed = (endx - startx)/5; 

    mySpriteHolder.push(Bullet); 
    stage.addChild(Bullet); 

    //this calls the move down function 
    stage.addEventListener(Event.ENTER_FRAME,BulletFire); 
} 
//Function to shoot bullet 
function BulletFire(evt:Event):void{ 
    var Bullet:MovieClip; 
    //Use a for loop to move the Bullets 
    for(var i:int=0; i<=mySpriteHolder.length; i++){ 
     Bullet = mySpriteHolder[i]; 
    //Bounds Collision 
    if(Bullet.hitTestObject(Up)){ 
     Bullet.yspeed*=-1; 
    } 
    if(Bullet.hitTestObject(Lower)){ 
     Bullet.yspeed*=-1; 
    } 
    if(Bullet.hitTestObject(Left)){ 
     Bullet.xspeed*=-1; 
    } 
    if(Bullet.hitTestObject(Right)){ 
     Bullet.xspeed*=-1; 
    } 
    //Blockade Collision 
    for(var t in myBlockadeHolder){ 
      if(Bullet.hitTestObject(myBlockadeHolder[t])){ 
       trace("test"); 
      } 
     } 
    //Target Collision 
     for(var c in mytargetHolder){ 
      if(Bullet.hitTestObject(mytargetHolder[c])){ 
      stage.removeChild(Bullet); 
      mySpriteHolder.splice(i,1); 
      lbCounter --; 
      mytargetHolder[c].y = Math.random()*390 + 10; 
      mytargetHolder[c].x = Math.random()*390 + 10; 
       while(mytargetHolder[c].hitTestObject(Turret)){ 
        mytargetHolder[c].y = Math.random()*390 + 10; 
        mytargetHolder[c].x = Math.random()*390 + 10; 
       } 
      } 
      for(var a in mytargetHolder){ 
       for(var s in mytargetHolder){ 
        while(mytargetHolder[a].hitTestObject(mytargetHolder[s])&& a!=s){ 
         mytargetHolder[a].y = Math.random()*390 + 10; 
         mytargetHolder[a].x = Math.random()*390 + 10; 
        } 
       } 
       for(var g in myBlockadeHolder){ 
        while(mytargetHolder[a].hitTestObject(myBlockadeHolder[g])&& a!=g){ 
         mytargetHolder[a].y = Math.random()*390 + 10; 
         mytargetHolder[a].x = Math.random()*390 + 10; 
        } 
       } 
      } 
     } 
     Bullet.y += Bullet.yspeed; 
     Bullet.x += Bullet.xspeed; 
    } 
} 
+0

什么时候这个错误发生了什么?只有在这条线运行后:'stage.removeChild(Bullet);'?请尝试没有它。另外你应该删除你的EventListener发生这种情况。 – 19greg96 2012-03-08 18:46:10

+0

当我调试SWF它指向61行...这是If(Bullet.hitTestObject(上)) – Cory 2012-03-08 19:08:58

回答

1
mySpriteHolder.splice(i,1); 

此行可能造成一些意想不到的结果(也可能是你的错误)作为你从你的循环是从工作逐步阵列拼接对象。理解当你在AS3中拼接一个对象时,你有效地移除了这个元素,并且所有随后的索引都向下移动了拼接数量,这一点很重要。尝试在循环,而不是向后工作:

for(var i:int=mySpriteHolder.length-1; i>=0; i--){ 

另外,该线路应该移到你的鼠标点击事件,你要添加的每一颗子弹放置时间多ENTER_FRAME事件。因为它现在是它每次点击鼠标时会执行一次额外的bulletFire()传递:

stage.addEventListener(Event.ENTER_FRAME,BulletFire); 
+0

谢谢...这工作完美 – Cory 2012-03-12 17:29:37

1

一开始:

for (var i:int = 0; i < mySpriteHolder.length; i++) { 
... 

即改变<=<。如果i变成mySpriteHolder.length那么你会得到一个界外例外。

下一页:

stage.removeChild(Bullet); 
mySpriteHolder.splice(i--, 1); 

即当删除从阵列中的当前元素,还递减该索引i。它会在下一次迭代中再次增加,所以你将处于相同的索引。例如,如果删除第5个元素,则想要在下一次迭代中查看新的第5个元素(之前是第6个元素),而不是新的第6个元素(之前为第7个元素)。在你当前的代码中,你无意中跳过了一个 - 更不用说它本身可能会给你一个超出界限的例外。

“越界”我的意思是Bulletundefined