用线命中测试

Posted

技术标签:

【中文标题】用线命中测试【英文标题】:Hit test with line 【发布时间】:2015-01-30 03:16:41 【问题描述】:

所以我正在制作一个平台游戏风格的游戏,并尝试用一条线进行命中测试,如果这有任何意义的话。现在我有一个四处移动的物体,每当你向右移动时,如果右下角或右上角撞到你停止移动的世界。与左设置相同的东西。但是,如果“世界”电影剪辑太小并且没有达到您可以直接通过的任何点,则此方法有效。所以我需要在这些点之间画一条实线并用它进行 hitTest 吗?

else if (keyIsDown(Keyboard.RIGHT))
        
            //dude.gotoAndStop("right");
            //obj.scaleX = 1;
            for (i = 0; i<speedX; i++)
            
                obj.x++;
                dude.ball.rotation++;
                if (status == "ground")
                
                    dude.height+= 0.05;
                    dude.width += 0.05;

                
                    if (world.hitTestPoint(obj.x + obj.width/8 - obj.width/2, obj.y - obj.height/4,true) || world.hitTestPoint(obj.x + obj.width/2,obj.y - obj.height + obj.height/4,true))
//this is what dictates the points that hit, trying to make it test a hit with a solid line between the 2 points.
                    //if (world.hitTestObject(dude.hitD))
                    

                        dude.ball.rotation--;


    obj.x--;
                    break;
                
            
        
        dude.gotoAndStop(1);

    

我尝试添加的行代码

else if (keyIsDown(Keyboard.RIGHT))
        
            //dude.gotoAndStop("right");
            //obj.scaleX = 1;
            for (i = 0; i<speedX; i++)
            
                obj.x++;
                dude.ball.rotation++;
                myShape.graphics.moveTo(obj.x + obj.width/8 - obj.width/2,obj.y - obj.height/4); 
                myShape.graphics.lineTo(obj.x + obj.width/2, obj.y - obj.height + obj.height/4);
                // The number in obj.y-4 affects the climbing ability
                if (status == "ground")
                
                    //dude.height+= 0.05;
                    //dude.width += 0.05;
                


                if (obj.hitTestObject(myShape))
                
                    dude.ball.rotation--;
                    obj.x--;
                    break;
                
            
        
        dude.gotoAndStop(1);

    

【问题讨论】:

那么为什么不画这条实线并给它一个solid_line.alpha = 0; 现在肉眼看不见,但计算机可以检测到对它的“命中”?您的问题不清楚..您不知道如何制作这条线或什么? @VC.One 已经尝试通过添加此线条形状,也许我做的不对?见编辑 【参考方案1】:

据我所知,您正在尝试制作一款玩家控制球的平台游戏。 所以你需要圆形碰撞检测,至少要左右行驶。

在实现任何类型的程序时,尤其是在经常执行的部分上,例如碰撞检测,您应该始终寻找捷径。

我可以建议几种方法;

    这种情况的捷径可以是一个比你的球略小的不可见的盒子形状,并用它进行碰撞检测。当然,它会降低视觉质量;例如当您接近可以适合对象左下角的低边缘时,您的对象会提前崩溃,而不会在视觉上接触到块。

    或者您只是忽略性能并增加圆圈周围的点数。 甚至你可以编写一个算法来在你的圆的外边缘以一定的间距找到位置,并检查它们中是否有任何碰撞。这样您的碰撞检测就不会错过小物体。

    但是,有更好的方法。您可以实现两级碰撞检测。 第一个是你现在拥有的,第二个是一个不可见的盒子,它与你的球高度相同,宽度更小,以至于它的边缘落在你的主要检测点后面。 这样,二级检测就不会遗漏任何东西,但只有在一级检测未能捕捉到介于两者之间或之下的任何东西时,它才会起作用。

【讨论】:

谢谢,但是我试过很多次了。您能否指导我完成在影片剪辑中为隐形框方法制作影片剪辑的步骤?这就是我的理解方式:双击movieclip,在中心附近绘制一个正方形并转换为符号。给出符号实例名称并使用该实例测试 HitTestObject。 是的,没错。在您的角色内部创建一个 MovieClip,按照您想要的方式塑造它(请记住,对象的边界框将使用 hitTestObject() 视为实心)并将其用于您的检测功能。像这样:world.hitTestObject(player.hitBox)。如果一切都失败了,您可以通过我的个人资料中的电子邮件与我联系。

以上是关于用线命中测试的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ:Scala 测试中的断点不会被命中

`UIGestureRecognizer`命中测试

WPFの命中测试

四个旋转顶点之间的命中测试

命中测试 UIView 子类的填充区域

为啥必须使用 CALayer 的presentationLayer 进行命中测试?