2014-02-10 102 views
0

我在閃光燈做一個太空入侵者遊戲時,當我碰到我有一個1061錯誤可能未定義的hittestobject通過靜態類型的參考...... 我該如何解決這個問題?試了很多辦法都無法擺脫這個錯誤As3碰撞測試

/* 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

的似乎bullet_是一類,而不是一個實例,所以你大炮調用hitTestObject就可以了。 也許嘗試用bullet替換bullet_。

有很多解決方案可以做到這一點,但對我來說最簡單的做法是保持2個陣列,一個用於子彈,一個用於敵人。

所以加陣列:

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

添加onEnterFrame事件監聽器做的每一幀的測試和遊戲邏輯:

addEventListener(Event.ENTER_FRAME, _gameLoop); 

變化的函數來創建子彈和敵人:

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); 
} 

現在創建遊戲循環功能:

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); 
      } 
     } 
    } 
} 

希望這可以幫助你

+0

現在說未定義功能子彈和入侵者,我在哪裏支持定義它或使其全球的代碼? –

+1

正如我看到你的子彈和侵入者變量定義在一個函數範圍內,所以你不能在函數外部訪問它。由於你有不止一顆子彈和一個以上的敵人,你必須保存一系列你的物體,並在每一幀上看到子彈和敵人之間發生碰撞。 –

+0

你能否解釋一下我該怎麼做? –