2012-09-20 45 views
1

我想使用hitTestObject函數使子彈射擊和船舶崩潰到另一個太空入侵者類型遊戲,但我無法得到removeChild();函數在沒有上述錯誤的情況下工作。這是守則我該怎麼做。ArgumentError:錯誤#2025:提供的DisplayObject必須是調用者的子項。 AS3

import flash.ui.Keyboard; 
import flash.events.KeyboardEvent; 
import flash.events.Event; 
import flash.display.MovieClip; 

var count:int = 1; 

//adding the components 
var NewBullet:MovieClip = new Bullet; 

    var Ship_M:MovieClip = new Ship; 
    Ship_M.x = 270; 
    Ship_M.y = 470; 
    addChild(Ship_M); 


    var Ship_E:MovieClip = new E_Ship; 
    Ship_E.x = 270; 
    Ship_E.y = 5; 
    addChild(Ship_E); 


stage.addEventListener(Event.ENTER_FRAME , Rec); 
function Rec(e:Event):void{ 
    if (NewBullet.hitTestObject(Ship_E)) 
    { 
    removeChild(Ship_E); 
    removeChild(NewBullet); 

    } 

    if (Ship_E.hitTestObject(Ship_M)) 
    { 
     removeChild(Ship_E); 
     removeChild(Ship_M); 
    } 



    } 

function Moves(e:Event):void{ 

      NewBullet.y -= 30; 

    if (NewBullet.y < 0) 
     { 

     removeChild(NewBullet); 

      count++; 
    removeEventListener(Event.ENTER_FRAME, Moves); 

     } 

      trace (count); 
    } 



//For Moving the Spaceship   
stage.addEventListener(KeyboardEvent.KEY_DOWN, Move); 

function Move (event:KeyboardEvent):void{ 

switch(event.keyCode) 

    { 
     case 37: 
      if (Ship_M.hitTestObject(Stop_L1)) 
      { 
       Ship_M.x -= 0; 
      } 
      else 
      { 
       Ship_M.x -= 10; 
      } 
     break; 

     case 38: 
      if (Ship_M.hitTestObject(Stop_U1)) 
      { 
       Ship_M.x -= 0; 
      } 
      else 
      { 
       Ship_M.y -= 10; 
      } 

     break; 

     case 39: 
      if (Ship_M.hitTestObject(Stop_R1)) 
      { 
       Ship_M.x -= 0; 
      } 
      else 
      { 
       Ship_M.x += 10; 
      } 

     break; 

     case 40: 
      if (Ship_M.hitTestObject(Stop_D1)) 
      { 
       Ship_M.x -= 0; 
      } 
      else 
      { 
       Ship_M.y += 10; 
      } 

     break; 


     case 32: 
     addChild(NewBullet); 
     NewBullet.x = Ship_M.x; 
     NewBullet.y = Ship_M.y; 

     addEventListener(Event.ENTER_FRAME, Moves); 
     break; 

     default: 

    } 

} 
+1

理想情況下,您應該使用lowerCamelCase命名變量以避免混淆。類名通常以大寫字母開頭。 – crooksy88

+0

請考慮使用光柵(bitmapData)和copyPixels來「渲染」您的遊戲,從而大大提高性能。 – zehelvion

回答

1

更換你的

removeChild(SomeSprite); 

if (SomeSprite.parent) 
    SomeSprite.parent.removeChild(SomeSprite); 

的父對象只能調用removeChild之。

+0

謝謝,你能幫我製作多發子彈嗎 – user1685872

+0

你能用子彈描述你的問題嗎? –

1

您可能不需要這在您的特定情況下,但我有一個輔助函數來刪除一個孩子,使之符合GC肚裏像這樣:

private function remove(child:DisplayObject):void 
{ 
    if(child && child.parent) 
    { 
     child.parent.removeChild(child); 
     child = null; 
    } 
} 
0

最有可能你做removeChild之(NewBullet)兩次,第一次碰到Ship_E,第二次碰到邊界。一個簡單的解決方案就是每當你的NewBullet從舞臺上移除,設置一個標誌,說「啓用」,這將意味着子彈可以觸發事件,並檢查整個代碼,每當你必須檢查子彈。

注意,你只有一顆子彈,這是正常的嗎?

+0

雅的子彈東西很奇怪幫我解決請 – user1685872

+0

好吧,這並不容易。你需要一個能夠容納所有子彈的數組,並且如果它們處於邊界內並且它們擊中敵人(當然,每個敵人與每個子彈),則必須檢查每個子彈,並且另一個數組敵方子彈。所有這一切都在一個單一的ENTER_FRAME監聽器中檢查,它永遠不會被刪除,而是從該陣列中刪除一顆子彈,並將其從顯示中刪除,並且從字面上將其忘掉。重用技術比這更好,但你必須先學習走路才能飛行。 – Vesper

+0

我其實很擅長在Java和C++中飛行我只是不明白使用不是代碼的邏輯,但無論如何你說的是我應該爲一個語句填充和用子彈射擊它們並重新排列浸沒吧? – user1685872

相關問題