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.
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