Просто любопытно узнать, влияет ли индекс на объем объекта, потому что я создаю игру, и по какой-то причине я получаю сообщение об ошибке, как показано ниже
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at com.objects::Torret/updateObject()
at com.objects::EngineApi/loop()
в зависимости от того, где я поставил свой объект на сцену. Я могу предотвратить эту ошибку. все, что мне нужно сделать, это изменить или удалить следующий код.
eApi.setChildIndex(this, (eApi.numChildren - 1));
Существует постоянный поток объектов, приходящих и уходящих на мою сцену, поэтому этот код удерживает мои объекты от падения под новым объектом. Есть только один объект, который выдает эту ошибку, и это мой класс Turret. Другой класс - мой класс корабля. Класс турели содержит ссылку на класс корабля, поэтому он может стрелять в него.
Класс Turret - единственный класс, который выдает эту ошибку. ниже мой код для обоих классов. И да, я знаю, что записал турель неправильно. БЛАГОДАРЯ
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;
}
}
}
Ниже мой класс корабля
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));
}
}
}
Просто чтобы вы, ребята, знали, updateObject - это цикл для всех моих объектов. У меня есть один централизованный цикл, и в этом цикле он вызывает массив объектов, которые были размещены на сцене. все они содержат метод updateObject. обновить статус объекта. addGameChild () - это инкапсулированная addChild (), которая не только добавляет объект на сцену, но и помещает его в массив, чтобы можно было вызывать его метод updateObject (). он также используется для облегчения сбора мусора.