我目前正在用java开发一个LibGDX项目,我想知道如何检测不是矩形或圆圈的形状上的鼠标。比如说,我有一艘宇宙飞船。当渲染它的时候,你会得到精灵,它是一个正方形,在这个方块里面,你有宇宙飞船。问题是,宇宙飞船不是正方形,所以在精灵的边缘有空白(很可能空格是透明的,这样就不会对背景或其他场景物体造成任何麻烦)。你怎么能在飞船上探测到鼠标,而不是整个广场?有没有什么方法?
发布于 2014-05-02 04:53:25
有几种方法可以使命中检测更精确。
长方形
首先,我建议您忽略这个问题,使用比实际对象稍小或更大的矩形(取决于您是否希望“点击”更容易或更难)。如果有游戏问题,那么你可以使它更精确。
+----+
| |
| |
+----+多个矩形
一旦您得到了与用来绘制精灵的矩形不同的矩形的支持,那么您就可以更精确地分解空间。作为下一个近似级别,您可以将空间细分为较小的部分(例如,使用几个矩形或一个矩形和一个三角形)。
+-+
| |++
| |++
+-+非矩形
三角点测试非常快速(参见Intersector.pointInTriangle,实际上还有很多其他有用的方法)。所以你可以用一个矩形表示你的飞船的底部,用一个三角形来表示你的顶端。
+-+
| |\
| |/
+-+“嵌套”更复杂的命中检测通常是有意义的(因此,在对象周围有一个大的粗框,并且只有当“命中”检查更精确的约束时,才能查看位置是否在这些范围内)。
象素
在系统中(不是OpenGL!)如果视频内存是可读的,并且您的游戏对屏幕上的像素有更直接的了解,您可以测试对象的alpha通道(甚至可以构建表示透明或非透明的特殊1位纹理),以检测特定的单击点是否“在”对象内。这在OpenGL中是非常困难的,因为屏幕上的像素是相当抽象的。(当然,这并非不可能,但我认为这是一个不同的问题,我不知道答案。)
因此,大多数基于OpenGL的游戏(我猜)使用抽象几何学(矩形、三角形、圆圈等)来表示对象,并根据这些来计算命中或非命中,而不是通过纹理像素。
另见https://gamedev.stackexchange.com/questions/30866/collision-detection-with-non-rectangular-images
https://stackoverflow.com/questions/23405431
复制相似问题