2014-02-09 79 views
1

嘿大家所以我有一個函數checkPlayerHitFish();控制hitTest時,fish接觸到playerHook如何刪除HitTestObject一旦啓動

有多條魚被添加到舞臺上並由計時器控制。

這裏是該函數的代碼:

stage.addEventListener(Event.ENTER_FRAME, gameLoop); 

private function gameLoop(e:Event):void 
    { 
     checkPlayerHitFish(); 
     checkFishHitBucket(); 
     checkMainFishOffScreen(); 
    } 


private function checkPlayerHitFish():void 
    { 


     //loop through all our fishes 
      for (var j:int = 0; j < aFishArray.length; j++) 
      { 
       //get current fish in j loop 
       var currentFish:mcMainFish = aFishArray[j]; 

       //test if current fish is hitting current playerhook 
       if (currentFish.hitTestObject(playerHook)) 
       { 

        trace("hit initialized"); 
        currentFish.stopFish(); 
        currentFish.x = playerHook.x; 
        currentFish.y = playerHook.y; 




       } 
      } 

    } 

,你可以在if語句看一次魚打了勾,然後它的位置變化和魚,現在裝在鉤和它後面。這正是我想要它做的。

現在我遇到的麻煩是一旦有一條魚附着在鉤子上,我不想再讓魚在鉤子上進行測試。所以基本上我想讓hitTest停下來,一旦它已經附着了一條魚。

我似乎無法弄清楚這一點,我想也許增加一個布爾值或刪除eventListener,但是當我添加removeEventlistener函數內部if語句它的工作,但它阻止魚被掛鉤。所以它會捕獲它碰到的魚,但它只是停止附着在它上面,並且不再遵循它。

有關如何做到這一點的任何想法,所以我可以拿起一條魚,然後停止所有其他hitTest與其他魚發生。我希望發生這種情況,因爲我希望用戶能夠一次只拾取一條魚,然後將它們丟棄在一個桶中,然後一旦脫落就能夠返回並拾取另一條魚。

回答

1

正如你所說,最簡單的解決方案是一個布爾變量來指示魚是否被捕獲,但是您還需要持續引用捕獲的魚,而不是也有一個布爾值,您可以簡單地檢查這個參考爲空或不是:

最頂上補充一點:

var caughtFish:mcMainFish;//This will be 'null' at first, but that's what you need. 

然後,修改你的遊戲循環功能:

private function gameLoop(e:Event):void 
    { 
     if(caughtFish == null) 
      checkPlayerHitFish(); 
     else 
      trackFish();//We'll make this function in a moment 

    checkFishHitBucket(); 
    checkMainFishOffScreen(); 
} 

這樣,節目W如果目前沒有發現任何魚,那麼生病只運行循環來檢查魚是否被捕獲。現在,你可以修改條件內checkPlayerHitFish:

if (currentFish.hitTestObject(playerHook)) 
{ 

    caughtFish = currentFish;//Make caughtFish point to this fish 
    currentFish.stopFish();//Not sure what this function does? 

} 

...最後,你只能如果添加新的功能,trackFish(),它控制着魚,如果的位置,並且,caughtFish不爲空 - 因爲我們只是把它指向currentFish,它不再是空的!

function trackFish(){ 
    caughtFish.x = playerHook.x; 
    caughtFish.y = playerHook.y; 
} 

這也將讓您刪除監聽器 - 它打破了之前它,因爲沒有持續的參照捕獲的魚(caughtFish),所以每一幀,將再次測試了碰撞。一旦玩家抓到一條魚,就不再需要檢查碰撞。

當玩家把桶裏的魚,你可以簡單地添加以下語句:

caughtFish = null; 

...這將設置程序再次尋找衝突。

+0

這是完美的。這正是我所期待的。非常感謝您花時間幫助我!如果你不介意我問你在as3中編碼多久了? – Nathan

+0

大約七年,給予或承擔。不知何故,我仍然努力以此爲生,但幸運的是,愚蠢的Flash/HTML5戰爭似乎已經有所緩解,所以它並沒有像一年前那樣瘋狂。 – MickMalone1983

+0

太棒了。希望我能跟上編碼。你現在幾歲?現在有一個關於Flash/HTML5 – Nathan