我目前正在研究java中的LibGDX项目,我想知道如何在不是矩形或圆形的形状上检测鼠标。比方说,我有一艘宇宙飞船。在渲染时,你将拥有一个正方形的精灵,在那个正方形内你有飞船。问题是太空船不是一个正方形,所以你会在那个精灵的边缘周围留出空白(很可能那个空白区域是透明的,因此它不会对背景或其他场景对象造成任何麻烦)。你如何检测飞船上的鼠标而不是整个广场?有什么方法吗?
答案 0 :(得分:2)
有几种方法可以使hit detection更精确。
首先,我建议您忽略该问题并使用比实际对象略小或大的矩形(取决于您是否希望“更轻松或更难”)。如果存在游戏性问题,那么您可以使其更精确。
+----+
| |
| |
+----+
一旦你获得了一个与用于绘制精灵的矩形不同的矩形的支持,那么你可以更精确地打破空间。作为下一级近似,您可以将空间细分为较小的部分(例如,使用多个矩形或矩形和三角形)。
+-+
| |++
| |++
+-+
三角形测试非常快(参见Intersector.pointInTriangle
,其中有很多其他有用的方法)。因此,您可以通过基座的矩形和尖端的三角形来表示您的太空飞船。
+-+
| |\
| |/
+-+
“窝”通常是有意义的。更复杂的命中检测(因此您在对象周围有一个粗糙的大框,并且只有在命中时才会检查更精确的约束以查看该位置是否在这些边界内)。
在视频内存可读的系统(非OpenGL!)中,您的游戏对屏幕上的像素有更直接的了解,您可以测试对象的Alpha通道(甚至可以构建一个特殊的1位纹理代表透明或无意义)以检测特定点击点是否在内部"对象与否。这在OpenGL中非常难,因为屏幕上的像素相当抽象。 (当然,这不是不可能的,但我认为这是一个不同的问题,而且我不知道答案。)
所以,大多数基于OpenGL的游戏(我猜)会使用抽象几何(矩形,三角形,圆形等)来表示对象,并根据它来计算命中或不是,而不是通过纹理像素。 / p>
另见https://gamedev.stackexchange.com/questions/30866/collision-detection-with-non-rectangular-images