【问题标题】:How to remove HitTestObject once initiated启动后如何删除 HitTestObject
【发布时间】:2014-02-09 22:44:41
【问题描述】:

大家好,所以我有一个名为 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。所以基本上我希望 hitTest 一旦它已经连接了一条鱼就停止。

我似乎无法弄清楚我在想可能添加一个布尔值或删除 eventListener 但是当我在函数中添加 removeEventlistener if 语句时它可以工作,但它会阻止鱼被附加到钩子上。所以它确实会捡起它击中的鱼,但它只是停止附着在它上面,不再跟随它。

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

【问题讨论】:

    标签: actionscript-3 flashdevelop


    【解决方案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(),当且仅当 catchFish 不为 null 时,它控制鱼的位置 - 因为我们只是让它指向 currentFish,它不再是空!

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

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

    当玩家有鱼在桶时,你可以简单地添加这个语句:

    caughtFish = null;
    

    ...这将使程序再次寻找碰撞。

    【讨论】:

    • 这是完美的。这正是我想要的。非常感谢您花时间帮助我解决这个问题!如果你不介意我问你用 as3 编码多久了?
    • 大约七年,给予或接受。不知何故,我仍然设法以它为生,虽然谢天谢地,愚蠢的 Flash/HTML5 战争已经有所减弱,所以它并不像一年前听起来那么疯狂。
    • 太棒了。希望我能跟上编码的步伐。你现在几岁?与 Flash/HTML5 发生争执
    • 现在 30... 重新拾起它永远不会太晚,Flash 可能是最好的开始平台,它非常宽容,让您专注于逻辑等等,而不用担心浏览器hacks 和所有其他真正带来乐趣的东西!
    • 是的,我知道你的意思,我一定会开始把它捡起来。是的,它确实是一种很棒的编码语言。与 C++ 非常相似。我在 C++ 中上过一些课程,所以它有点容易理解。您是否碰巧有一个网站或您创建的任何东西来让自己走出去?或者您是否为 Android 或 Apple 开发过任何应用程序?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多