2010-01-29 3 views
0

Juste curieux de savoir si l'effet de l'indice de la portée d'un objet parce que je vais créer un jeu et pour une raison quelconque, je reçois une erreur comme ci-dessousL'index d'affichage affecte-t-il la portée d'un objet?

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at com.objects::Torret/updateObject() 
    at com.objects::EngineApi/loop() 

selon l'endroit où je mets mon objet sur la scène. Je peux empêcher cette erreur de se produire. tout ce que j'ai à faire est de modifier ou supprimer le code suivant.

eApi.setChildIndex(this, (eApi.numChildren - 1)); 

Il y a un flux constant d'objets vont et viennent sur scène pour mon code conserve mes objets de tomber sous un nouvel objet. Il n'y a qu'un objet qui lance cette erreur et c'est ma classe de tourelle. L'autre classe est ma classe de navire. La classe de la tourelle contient une référence à la classe de navire afin qu'elle puisse tirer dessus.

La classe de tourelle est la seule classe qui lance cette erreur. ci-dessous est mon code pour les deux classes. Et OUI je sais que j'ai mal orthographié la tourelle. MERCI

package com.objects{ 
    import flash.events.Event; 

    public class Torret extends gameObject{ 

     public var currentAngle:Number; 
     protected var newAngle:Number; 
     public var shoot:Boolean = false; 
     public var autoRotate:Boolean = false; 
     public var updated:Boolean = false; 
     public var target:Avatar; 
     public var enemyLock:Boolean = false; 
     public var attackDelay:Number; 
     public var delay:Boolean = false; 
     public var wielder; 
     public var smokeDelay:Number = 500; 

     public function Torret():void 
     { 
      health = 1; 
      maxHealth = 1; 
      currentAngle = rotation; 
      newAngle = currentAngle; 
      lastTime = getTime(); 
     } 

     public function Hit(dmg:Number = .01):void { 
      if(health > 0) 
       health -= dmg; 

      if(health < 0) 
       health = 0; 
     } 

     override public function updateObject():void 
     { 
      eApi.setChildIndex(this, (eApi.numChildren - 1)); 
      if(health <= 0) 
      { 
       dead = true; 
       blowUp(); 
      } 

      if(y > 949)//If boss doesnt work, this is why 
      { 
       garbage = true; 
      } 
      if(!dead) 
      { 

       if(wielder) 
       { 
        scaleX = wielder.scaleX; 
        scaleY = wielder.scaleY; 

       } 
       if(currentAngle != newAngle || autoRotate == true) 
       { 
        rotation += 3; 
        currentAngle = rotation; 
        updated = false 
       } 
       else 
       { 
        updated = true 
       } 

       if(shoot) 
       { 
        if((getTime() - lastTime) > attackDelay && delay == true) 
        { 
         var stingerlaser = new StingerLaser(); 
         stingerlaser.laserDir = rotation; 
         stingerlaser.x = x; 
         stingerlaser.y = y; 
         eApi.addGameChild(stingerlaser); 
         lastTime = getTime(); 
        } 
       } 

       if(enemyLock) 
       { 
        var dx = target.x - x; 
        var dy = target.y - y; 
        var angle = Math.atan2(dy,dx); 
        rotation = angle * 180/Math.PI; 
       } 
      } 
     } 

     protected function blowUp():void 
     { 
      if((getTime() - lastTime) > smokeDelay) 
      { 
       var smoke:MissileSmoke = new MissileSmoke(); 
       smoke.x = x; 
       smoke.y = y; 
       smoke.dir = -1; 

       eApi.addGameChildAt(5,smoke); 
       eApi.setChildIndex(smoke, (eApi.numChildren - 4)); 
       lastTime = getTime(); 
      } 

     } 

     protected function degreesToRadians(degrees:Number):Number { 
      return degrees * Math.PI/180; 
     } 

     protected function rotate(angle:Number):void 
     { 
      newAngle = angle; 
     } 
    } 
} 

Voici ma classe de navire

package com.objects{ 

    import flash.display.MovieClip 

    public class Avatar extends gameObject { 

     public var targets:Array; 
     public var delay:Number = 3000; 
     public var weapon:Number = 1; 

     public function Avatar():void 
     { 
      rotation = -90; 
      lastTime = getTime(); 
      targets = new Array(); 
     } 

     override public function Attack(dir:Number = -40):void 
     { 
      switch(weapon){ 

       case 1: 
        var bullet1:Bullet = new Bullet(); 
        bullet1.wielder = this; 
        bullet1.x = x + 35; 
        bullet1.y = y + 30; 
        bullet1.bulletDir = rotation; 
        eApi.addGameChild(bullet1); 

        var bullet2:Bullet = new Bullet(); 
        bullet2.bulletDir = rotation; 
        bullet2.wielder = this; 
        bullet2.x = x - 35; 
        bullet2.y = y + 30; 
        eApi.addGameChild(bullet2); 
       break; 
       case 2: 
        if((getTime() - lastTime) > delay) 
        { 
         var missle = new Missile(); 
         missle.x = x; 
         missle.y = y; 
         missle.wielder = this; 
         eApi.addGameChildAt((eApi.numChildren - 2),missle); 
         lastTime = getTime(); 
        } 
       break; 
       default: 
      } 
     } 

     public function Hit():void 
     { 
      trace("ouch"); 
     } 

     override public function updateObject():void 
     { 
      eApi.setChildIndex(this, (eApi.numChildren - 1)); 
     } 
    } 
} 

Juste pour vous laisser savoir, updateObject est la boucle pour tous mes objets. J'ai une boucle centralisée et dans cette boucle elle appelle un tableau d'objets qui ont été placés sur la scène. tous contenant la méthode updateObject. mettre à jour le statut de l'objet. addGameChild() est un addChild() encapsulé, qui non seulement ajoute l'objet à la scène, mais le place dans un tableau afin que sa méthode updateObject() puisse être appelée. Il est également utilisé pour faciliter le ramassage des ordures.

+0

Qu'est-ce que eApi? Peut-il être nul à un moment donné? Quand vous faites un eApi.numChildren - 1 êtes-vous sûr qu'il y a presque un enfant dedans? – Patrick

Répondre

0

d'abord je pense que l'utilisation de addGameChildAt est inutile car vous n'avez pas besoin d'un tableau supplémentaire pour stocker vos objets pour appeler updateObject sur eux.

for(var i:int;i<numChildren;i++) { gameObject(getChildAt(i)).updateObject(); } 

alors je suggère de commencer vos noms de classe avec des lettres majuscules-à-dire GameObject et les noms de méthode doivent commencer par des lettres minuscules-à-dire attack()

et je vous recommande de vérifier si vos objets de référence à existe eapi (non null) et votre objet fait partie de la eapi avant de mettre son index

if(eApi && eApi.contains(this)) { eApi.setChildIndex(this, (eApi.numChildren - 1)); } 

Je me demande pourquoi vous utilisez setChildIndex de toute façon, comme je le prendre il y a une boucle constante qui invoque updateObject sur les objets qui sont actuellement childs de eApi donc vous déplacez constamment l'objet dont la méthode updateObject est actuellement exécutée vers le haut, ce qui semble inutile?

Questions connexes