大家好,所以我有一个名为checkPlayerHitFish();
的函数,可以在fish
与playerHook
联系时控制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与其他鱼类发生。我希望这种情况发生,因为我希望用户能够一次只捡起一条鱼,然后将它们放入桶中,然后一旦掉下来就可以回去捡起另一条鱼。
答案 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;
...这会将程序设置为再次查找碰撞。