2012-03-08 2 views
-1

ТипError: Ошибка # 1009: Не удается получить доступ к свойству или методу ссылки на нулевой объект. на 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);'? попробуйте без него. Кроме того, вы должны удалить EventListener, когда это произойдет. – 19greg96

+0

Когда я отлаживаю swf, он указывает на строку 61 ... которая есть If (Bullet.hitTestObject (вверх)) – Cory

ответ

1
mySpriteHolder.splice(i,1); 

Эта линия, вероятно, вызывают некоторые неожиданные результаты (и, возможно, ваша ошибку), как вы сращивание объектов из массива вашего цикл работает пошагово с. Важно понимать, что при сращивании объекта в AS3 вы эффективно удаляете этот элемент, и все индексы, которые следуют, перемещаются вниз по объему сплайсинга. Попробуйте работать в обратном цикле вместо:

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

Кроме того, эта линия должна быть перенесена из вашего Mouseclick события, как вы добавляете несколько событий ENTER_FRAME каждый раз, когда пуля помещается. Поскольку это прямо сейчас, он будет делать дополнительный пропуск bulletFire() каждый раз, когда вы нажимаете мышь:

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

Спасибо ... это сработало отлично – Cory

1

Для начала:

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

т.е. изменить <= к <. Если i станет mySpriteHolder.length, тогда вы получите исключение из-за пределов.

Следующие:

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

т.е. при удалении текущего элемента из массива, вы также уменьшить значение индекса i. Он будет увеличен снова на следующей итерации, поэтому вы будете иметь тот же индекс. Например, если вы удалите 5-й элемент, вы хотите посмотреть на новый 5-й элемент (ранее шестой) на следующей итерации, в отличие от нового 6-го элемента (ранее 7-го). В вашем текущем коде вы непреднамеренно пропускаете один - не говоря уже о том, что сама может дать вам исключение из-за пределов.

Под «из-за границ» я имею в виду Bullet, являющийся undefined.

Смежные вопросы