嘿大家,所以我有一个叫做函数的函数checkPlayerHitFish();
,它fish
在接触playerHook
。
有多个鱼被添加到舞台并由计时器控制。
这是该函数的代码:
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语句的函数内部添加removeEventlistener时,它都会起作用,但它会阻止鱼附着在钩子上。因此,它确实捡起了它撞到的鱼,但随后它不再附着在它上面,不再跟随它了。
关于如何执行此操作的任何想法,这样我就可以捡起一条鱼,然后停止其他所有hitTest与其他鱼的发生。我希望发生这种情况,因为我希望用户一次只能捡起一条鱼,然后将它们放到水桶中,一旦放下,就可以返回并捡起另一条鱼。
如您所说,最简单的解决方案是一个布尔变量,以指示是否捕获了一条鱼,但是您还需要对捕获的鱼的持久引用,而不是布尔值,您可以简单地检查此引用是否为null或不:
在最顶部添加以下内容:
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(),当且仅当catchFish不为null时,该函数才能控制鱼的位置-因为我们只是将其指向currentFish,所以它不再为null!
function trackFish(){
caughtFish.x = playerHook.x;
caughtFish.y = playerHook.y;
}
这也将允许您删除侦听器-之前中断了侦听器,因为没有持久引用到捕获的鱼(caughtFish),因此每个帧都将再次测试碰撞。一旦玩家抓到一条鱼,它就不再需要检查碰撞。
当玩家将鱼放到水桶中时,只需添加以下语句即可:
caughtFish = null;
...这会将程序设置为再次查找冲突。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句