2014-02-09 2 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; 




       } 
      } 

    } 

, как вы можете видеть в, если заявление после того, как рыба попадает на крючок, то его положение меняется, и рыба будет прикреплен к крючку и после него. Это именно то, что я хотел этого сделать.

Теперь у меня возникли проблемы с тем, когда одна из рыб прикреплена к крюку. Я больше не хочу рыбу, чтобы ее можно было нанести с помощью крюка. Поэтому в основном я хочу, чтобы hitTest останавливался, когда у него уже есть одна рыба, прикрепленная к нему.

Я не могу понять это, я думал, может быть, добавление логического или удаление eventListener, но когда я когда-либо добавляю removeEventlistener внутри функций, если оператор работает, но он не позволяет привязать рыбу к крюку. Таким образом, он подбирает рыбу, которую он ударил, но затем он просто перестает прикрепляться к ней и больше не следует за ней.

Любая идея о том, как это сделать, чтобы я мог забрать одну рыбу, а затем остановить все другие хиты с другими рыбами. Я хочу, чтобы это произошло, потому что я хочу, чтобы пользователь мог одновременно забирать только одну рыбу, а затем отбрасывать их в ведро, а затем высаживаться, чтобы вернуться назад и забрать другую рыбу.

ответ

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

Таким образом, программа ш больной только запускает цикл, чтобы проверить, поймана ли рыба, если в данный момент ее нет. Теперь, вы можете изменить состояние внутри 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

 Смежные вопросы

  • Нет связанных вопросов^_^