如何在启动时删除HitTestObject

时间:2014-02-09 22:44:41

标签: actionscript-3 flashdevelop

大家好,所以我有一个名为checkPlayerHitFish();的函数,可以在fishplayerHook联系时控制hitTest。

有多条鱼被添加到舞台并由计时器控制。

以下是该函数的代码:

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,但是当我在函数if if语句中添加removeEventlistener时它会起作用,但它会阻止鱼附加到钩子上。所以它确实捡起它击中的鱼,但它只是停止附着在它上面并且不再跟随它了。

关于如何做到这一点的任何想法,我可以拿起一条鱼,然后停止所有其他hitTest与其他鱼类发生。我希望这种情况发生,因为我希望用户能够一次只捡起一条鱼,然后将它们放入桶中,然后一旦掉下来就可以回去捡起另一条鱼。

1 个答案:

答案 0 :(得分: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不为null时 - 因为我们只是指向currentFish,它不再是空!

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

这也允许你删除监听器 - 它之前打破了它,因为没有对捕获的鱼(caughtFish)的持久引用,所以它将再次测试碰撞的每一帧。一旦玩家捕到鱼,它就不再需要检查碰撞了。

当玩家将鱼放入桶中时,您只需添加以下声明:

caughtFish = null;

...这会将程序设置为再次查找碰撞。