2012-03-08 14 views
-1

TypeError:エラー#1009:nullオブジェクト参照のプロパティまたはメソッドにアクセスできません。 Main_fla :: MainTimeline/BulletFire()[Main_fla.MainTimeline :: frame32:68]の 何が起こっているのか分かりません...助けてください、それは私の日々のトラブルシューティングであり、私は完全に失われています。おかげで開始するために、また、...私はそれだけで45度と225度で行く弾丸を発射何らかの理由おかげでみんなエラー#1009、ActionScript 3、Bullet is null

//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);'?それなしで試してみてください。さらに、イベントリスナーを削除する必要があります。 – 19greg96

+0

私はswfをデバッグするときに、61行目を指しています。これは、If(Bullet.hitTestObject(up)) – Cory

答えて

1
mySpriteHolder.splice(i,1); 

あなたのループからインクリメンタルに取り組んでいる配列からオブジェクトをスプライシングしているので、この行は、おそらくいくつかの予期しない結果(そしておそらくあなたのエラー)が原因となっています。 AS3でオブジェクトをスプライスすると、その要素が効果的に削除され、その後に続くすべてのインデックスがスプライス量を下げることを理解することが重要です。代わりに、ループ内で逆方向に働いてみてください。あなたは、複数のENTER_FRAMEイベント弾丸が配置されるたびに追加しているとしても

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

、このラインはあなたのMouseClickとイベントの外に移動する必要があります。今のところ、追加の弾丸を実行しようとしています。マウスをクリックするたびにFire()を渡します:

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

です。これは完璧に機能しました – Cory

1

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

すなわち<<=を変更します。 imySpriteHolder.lengthになると、範囲外の例外が発生します。

次へ

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

もし配列から現​​在の要素を削除する場合、すなわち、あなたは、インデックスiをデクリメント。それは次の反復で再び増加するので、同じインデックスになります。たとえば、5番目の要素を削除すると、新しい6番目の要素(以前は7番目)とは対照的に、次の反復で新しい5番目の要素(以前の6番目の要素)を見たいとします。あなたの現在のコードでは、間違って1つをスキップしています - それ自体があなたに境界外の例外を与えることはもちろんですが。

「範囲外」とは、Bulletundefinedであることを意味します。

関連する問題