使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)