0

Im doing a space invaders game in flash when i came to collisions i had a 1061 error possibly undefined hittestobject through a reference with a static type class.... How can i fix that? tried many ways can't get rid of that error

/* Código que pára a timeline na 1 frame para que o menu continue apresentado*/ stop(); /*Movimenta a nave fazendo a seguir os movimentos do rato e esconde o cursor do sistema operacional*/ stage.addChild(arma_tiro); arma_tiro.mouseEnabled = false; arma_tiro.addEventListener(Event.ENTER_FRAME, fl_CustomMouseCursor); function fl_CustomMouseCursor(event:Event) { arma_tiro.x = stage.mouseX; } Mouse.hide(); /* Mouse Click Event Clicking on the specified symbol instance executes a function in which you can add your own custom code. Instructions: 1. Add your custom code on a new line after the line that says "// Start your custom code" below. The code will execute when the symbol instance is clicked. */ stage.addEventListener(MouseEvent.CLICK, fl_MouseClickHandler_3); function fl_MouseClickHandler_3(event:MouseEvent):void { var bullet:bullet_ = new bullet_(); addChild(bullet); bullet.x=arma_tiro.x; bullet.y=arma_tiro.y; bullet.addEventListener(Event.ENTER_FRAME, moverbala); } function moverbala(event:Event):void // função para mover a bala para cima */ { event.target.y=event.target.y-20; } //stage.addEventListener(Event.ENTER_FRAME, Primeira); setInterval(Primeira, 1000) ; //define intervalo de tempo entre as varias repetiçoes da funçao function Primeira(){ //funçao de spawn de nave 1 var invader1:invader_1 = new invader_1(); addChild(invader1); invader1.x=0; invader1.y=15; invader1.addEventListener(Event.ENTER_FRAME, mover1); } function mover1(event:Event):void // função para mover a nave para lado direito */ { event.target.x+=10; } //Nave 2 setInterval(Segunda, 1000) ; //define intervalo de tempo entre as varias repetiçoes da funçao function Segunda(){ //funçao de spawn de nave 1 var invader2:invader_2 = new invader_2(); addChild(invader2); invader2.x=0; invader2.y=45; invader2.addEventListener(Event.ENTER_FRAME, mover2); } function mover2(event:Event):void // função para mover a nave para lado direito */ { event.target.x+=10; } //Nave 3 setInterval(Terceira, 1000) ; //define intervalo de tempo entre as varias repetiçoes da funçao function Terceira(){ //funçao de spawn de nave 1 var invader3:invader_3 = new invader_3(); addChild(invader3); invader3.x=0; invader3.y=85; invader3.addEventListener(Event.ENTER_FRAME, mover3); } function mover3(event:Event):void // função para mover a nave para lado direito */ { event.target.x+=10; } // error line if (bullet_.hitTestObject(invader_1)) { //Remove bullet and enemy mcGameStage.removeChild(bullet_); mcGameStage.removeChild(invader_1); } 

1 Answer 1

1

it seems that bullet_ is a class and not an instance so you cannon call hitTestObject on it. maybe try replace bullet_ by bullet.

there are many solution to do that but the simplest for me would be to keep 2 array, one for the bullets, one for the enemies.

so add arrays:

// create the array for the bullets bullets :Array = []; // create the array for the enemies enemies :Array = []; 

add an onEnterFrame event listener to do the tests and the game logic on each frame:

addEventListener( Event.ENTER_FRAME, _gameLoop ); 

change your function to create bullets and enemies:

function fl_MouseClickHandler_3( event:MouseEvent ):void { // create the bullet var bullet:bullet_ = new bullet_(); addChild(bullet); bullet.x=arma_tiro.x; bullet.y=arma_tiro.y; // add the bullet to the bullets array bullets.push( bullet ); } function Primeira():void { var invader1:invader_1 = new invader_1(); addChild(invader1); invader1.x=0; invader1.y=15; enemies.push( invader1 ); } function Segunda():void { var invader2:invader_2 = new invader_2(); addChild(invader2); invader2.x=0; invader2.y=45; enemies.push( invader2 ); } function Terceira():void { var invader3:invader_3 = new invader_3(); addChild(invader3); invader3.x=0; invader3.y=85; enemies.push( invader3 ); } 

now create the game loop function:

function _gameLoop():void { var firstLoop:Boolean = true; // loop to move/remove the bullets for( var a:int = bullets.length-1; a>=0; a-- ) { bullets[a].y -= 20; // if the bullet is not on screen anymore, remove it from array if( bullets[j].y < 0 ) { removeChild( bullet[a] ); bullets.splice(a,1); continue; } } // loop enemies for( var i:int = enemies.length-1; i>=0; i-- ) { // move the enemy enemies[i].x += 10; // loop the bullets to see if on collide the enemy for( var j:int = bullets.length-1; j>=0; j-- ) { // test collision with the enemy if( enemies[i].hitTestObject( bullets[j] ) { // make your enemy dead removeChild( enemies[i] ); // remove it from the array enemies.splice(i,1); } } } } 

Hope this could helps you

Sign up to request clarification or add additional context in comments.

3 Comments

now says undefined function bullet and invader , where am I support define it or make it global to code?
As i see your bullet and invader variables are defined in a function scope so you cannot access it outside the function. As you have more than one bullet and more than one enemy you have to keep an array of your objects and see on each frame if a collision occurs between bullets ans enemies.
Could you explain me a bit how can I do that please?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.