使用 Graphics.lineTo/curveTo 时,HitTest 无法正常工作

Posted

技术标签:

【中文标题】使用 Graphics.lineTo/curveTo 时,HitTest 无法正常工作【英文标题】:HitTest not working correctly when using Graphics.lineTo/curveTo 【发布时间】:2014-03-22 07:54:04 【问题描述】:

所以我有一个名为hookLine 的电影剪辑,它是从我的mainEngine 班级添加到舞台的。这个空的movieClip 连接到我的fisherman Movie Clip 并弯曲到我的playerHook Movie Clip。它像这样添加并连接到舞台:

在我的mainEngine 函数循环中:

playerHookLine();

然后是函数:

private function playerHookLine():void 
    

        //Add hook line to fisherman and playerhook
        hookLine.graphics.clear();
        hookLine.graphics.lineStyle(1);
        hookLine.graphics.moveTo(fisherman.x, fisherman.y);
        hookLine.graphics.curveTo(playerHook.x, playerHook.y, mouseX, mouseY);

    

现在我遇到的问题是,每当我尝试使用名为 currentShark 的移动剪辑对 hookLine 进行 hitTest 测试时,hitTest 工作并且我得到了跟踪,但是当我将钩线弯曲到侧面和currentShark 出现在舞台上它会自动命中测试并给我跟踪。所以基本上鲨鱼甚至不必接触实际的线条图形。就在鲨鱼被添加到舞台时,它只是注册。

有人知道这是为什么吗?

hitTest 函数是这样的:

private function checkPlayerHitShark():void 
    
        //Loop through all sharks
        for (var i:int = 0; i < aSharkArray.length; i++)
        
            //Get current Shark in i loop
            var currentShark:mcShark = aSharkArray[i];

            //Check if shark is hittest with Hook
            if (currentShark.hitTestObject(playerHook) || currentShark.hitTestObject(hookLine))
            
                trace("Hook Hit Shark");
                trace("hit LINE");
                removePlayerLive();

                //Destroy player 
                playerHook.destroyPlayerHook();
                hookLine.destroyHookLine();

                //Remove shark from array
                aSharkArray.splice(i, 1);

                //Add new Hook to stage
                stage.addChild(playerHook);
                stage.addChild(hookLine);
            


        

    

【问题讨论】:

【参考方案1】:

你的鲨鱼和钓鱼线的边界框很可能发生碰撞。当您的弯曲钓鱼线向左或向右移动时,您的边界框将与钓鱼线本身的宽度和高度相同。打开您的项目并发布为 SWF,然后在 Flash 播放器中打开 SWF 并按 Control+E 或单击窗口顶部的查看并选择“显示重绘区域”。当它们被重新绘制到舞台上时,您应该会看到红色的边界框。

您正在寻找的是对鲨鱼和钓鱼线的位图进行像素级命中检测。 BitmapData 有一个名为 hitTest 的方法,它需要一些参数。

您将从 Mike Chambers 所写的文章中找到有关像素级命中检测的出色帮助,链接如下: http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/

BitmapData.hitTest 的文档可以在这里找到: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html

只需查找公共方法列表。

【讨论】:

我的意思是,将您的程序发布为 .SWF 文件并在 Flash 播放器中打开它。播放器本身将在顶部有一个菜单,您将看到 View 按钮,在该菜单中是 Show Redrawn Regions。我也要编辑我的帖子。 感谢您提供的所有信息。对此,我真的非常感激。你也是对的,无论我移动它,这条线都有一个巨大的矩形框。 哦,好的,我明白了。我会继续阅读你现在发给我的那些文章。所以我不能把那个区域缩小到只有 hookLine 吗? 没错。如果您的鲨鱼图像只有鲨鱼所在的像素,并且没有鲨鱼像素的边框或背景,那么您也可以将命中区域缩小到仅鲨鱼像素。

以上是关于使用 Graphics.lineTo/curveTo 时,HitTest 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)