PDA

Volledige versie bekijken : Probleem met game Error #1009


Asdfnl
%Europe/Berlin %679 %2008, 16:19
Ik ben bezig met een Flashgame.

Op de een of andere manier blijft deze error steeds terugkomen.

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Guns::Bullet1/moveMe()
at flash.utils::Timer/flash.utils:Timer::_timerDispatch()
at flash.utils::Timer/flash.utils:Timer::tick()

Ik heb alle mogelijke vars al getraced, om ergens null te vinden. Misschien iemand van jullie een idee?
package Guns{

import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.display.DisplayObject;
import flash.geom.Point;
//import

public class Bullet1 extends MovieClip {

var r:Number;// richting in radialen
var n:Number;// kracht in radialen
var timer:Timer;
var colPoint:Point;
var reef:MovieClip;
var eA:Array;

public function Bullet1(X:Number,Y:Number,z:Number,reef1:MovieClip ,EA:Array) {
rotation += z - rotation/2;
r = (z/180*Math.PI);
x = Math.cos(r)*30+X;
y = Math.sin(r)*30+Y;
n = 20;
reef=reef1;
eA = EA;

colPoint = new Point(0,0);

timer = new Timer(50);
timer.addEventListener(TimerEvent.TIMER, moveMe);
timer.start();
}
public function moveMe(e:TimerEvent) {
x += Math.cos(r)*n;
y += Math.sin(r)*n;
//x += 5;
//y += Math.sin(x)+100;
//x+=1;

if (x > stage.stageWidth || x < 0 || y > stage.stageHeight || y < 0) {
// if you want to delete an object, stop all timerinstances related to the object, else you'll get errors..
timer.stop();

stage.removeChild(this);

}
if (reef.hitTestPoint(this.localToGlobal(colPoint).x, this.localToGlobal(colPoint).y ,true)) {
timer.stop();

stage.removeChild(this);

}
var lA:Number = eA.length;
for (var i = 0; i<lA; i++) {

if (eA[i].hitTestObject(this)) {
eA[i].killMe();
stage.removeChild(this);
timer.stop();


break;

}
}
}
}
}


het volgende probleem:
ik laat 3 enemies spawnen om te testen. deze worden bijgehouden in een array en gespliced als ze gehit worden.
public function killMe(){
health -=10;


if(health == 0){

eA.splice(aN,1);

gotoAndStop(2);
//parent.removeChild(this);
//y = 1000;
}
if(y<this.y){
timer.stop();
}
}

zoals de splice nu staat (aN,1) kun je de 1e enemy niet hitten. Als ik er (aN,0) van maak kun je alle enemies hitten maar worden ze niet gespliced... (aN is het array nummer van de enemy).

graag uw ideeen hierover:D

Ciao

Tim

theFlashWizard
%Europe/Berlin %083 %2008, 02:00
Volgens mij roep je bijna meteen stage aan. Dat zou heel misschien een probleem kunnen zijn.
Ik zou stage er helemaal uit halen. Het is namelijk er onhandig dat je bullets zo afhankelijk zijn van de stage. Je kan nu niet opgeven dat de kogel moet stoppen wanneer die uit een kleiner gebied gaat. Ik zou hier eerder een bounds:Rectangle property voor meegeven.
Ook verwijdert de class zichzelf. Dit is niet netjes omdat het in jou geval vereist dat de kogel in de stage zit (grote afhankelijkheid). Ook is het over het algemeen niet netjes parent/stage direct iets te laten doen vanuit een class. Je kan hiervoor beter een event dispatchen en de class die daar naar luistert (dat kan dan alles zijn, onafhankelijk dus) laten beslissen wat er gebeurt.

eA[i].killMe();
Dit is ook risky, je kan hier beter een array van maken waarop hij alleen hittests doet. Bij een hittest doe je een event dispatchen, bijv hit en dan stuur je bijv. via custom event mee wat hij raakte. Dan kan vervolgens de class die daar naar luistert weer beslissen wat er gebeurt. Die kan dan ook doen:

if( hittedObject is Enemy){
var enemy:Enemy = hittedObject as Enemy;
enemy.die();
}else if( hittedObject is Coin){
var coin:Coin = hittedObject as Coin;
collect(coin);
}
bullet.explode();
enz.

Zo maak je je kogel veel minder afhankelijk van de rest van je game en kan je hem dus makkelijker hergebruiken.

Lijkt me een hele her organisatie, dus misschien los je hiermee al automatisch je probleem op.

Succes :)

Asdfnl
%Europe/Berlin %528 %2008, 12:40
bedankt:) ik ga dur mee aan de slag:)