我有一个关于libGDX碰撞检测的问题。因为这是一个相当具体的问题,我在互联网上没有找到任何好的解决方案。
所以,我已经创建了由不同身体部位组成的“人类”,每个部位都有矩形形状的碰撞检测。
现在我想要实现武器和技能,例如: 技能示例图片 问题:
使用矩形进行碰撞检测将会让玩家非常沮丧,例如出现这种技能:他们成功躲避了技能,但碰撞检测仍然会对他们造成伤害。
方法1:
在开始使用Libgdx之前,我使用自定义引擎创建了一款Android游戏,并使用了类似的技能。我通过以下方式解决了这个问题:
1. 检测矩形碰撞 2. 计算重叠的矩形部分 3. 检查技能重叠部分的每个像素是否透明 4. 如果发现任何不透明像素-> 碰撞
虽然这是一种比较繁琐的方法,但由于只检查重叠像素并且游戏的其余部分非常简单,所以它完全正常工作。
目前我的技能图像是以"TextureRegion"的形式加载,无法访问单个像素。我已发现libGDX有一个Pixmap类,可以允许进行像素检查。问题是:如果额外以Pixmap方式加载它们,将会更加沉重并且也违背了Texture系统的初衷。
另一种选择是只使用Pixmap来加载所有技能。你认为这是一种好的方式吗?在屏幕上绘制许多Pixmaps是否会出现任何问题和延迟?
方法2: 另一种方式是创建具有技能形状的多边形,并将它们用于碰撞检测。
a)如何为每个单独的技能定义多边形形状(有超过150个)?在浏览了一段时间后,我找到了这个有用的工具:http://www.aurelienribon.com/blog/projects/physics-body-editor/ 它允许手动创建多边形形状,然后将它们保存为可被libGDX应用程序读取的JSON文件。现在遇到了困难:
所以,我已经创建了由不同身体部位组成的“人类”,每个部位都有矩形形状的碰撞检测。
现在我想要实现武器和技能,例如: 技能示例图片 问题:
使用矩形进行碰撞检测将会让玩家非常沮丧,例如出现这种技能:他们成功躲避了技能,但碰撞检测仍然会对他们造成伤害。
方法1:
在开始使用Libgdx之前,我使用自定义引擎创建了一款Android游戏,并使用了类似的技能。我通过以下方式解决了这个问题:
1. 检测矩形碰撞 2. 计算重叠的矩形部分 3. 检查技能重叠部分的每个像素是否透明 4. 如果发现任何不透明像素-> 碰撞
虽然这是一种比较繁琐的方法,但由于只检查重叠像素并且游戏的其余部分非常简单,所以它完全正常工作。
目前我的技能图像是以"TextureRegion"的形式加载,无法访问单个像素。我已发现libGDX有一个Pixmap类,可以允许进行像素检查。问题是:如果额外以Pixmap方式加载它们,将会更加沉重并且也违背了Texture系统的初衷。
另一种选择是只使用Pixmap来加载所有技能。你认为这是一种好的方式吗?在屏幕上绘制许多Pixmaps是否会出现任何问题和延迟?
方法2: 另一种方式是创建具有技能形状的多边形,并将它们用于碰撞检测。
a)如何为每个单独的技能定义多边形形状(有超过150个)?在浏览了一段时间后,我找到了这个有用的工具:http://www.aurelienribon.com/blog/projects/physics-body-editor/ 它允许手动创建多边形形状,然后将它们保存为可被libGDX应用程序读取的JSON文件。现在遇到了困难:
- 物理体编辑器与Box2d相连(我没有使用)。为了一个微小的碰撞检测,我要么得添加整个Box2d物理引擎(我根本不需要),要么得编写一个自定义的BodyEditorLoader,这将是一项困难、复杂且耗时的任务。
- 同一技能精灵的某些图像形状存在很大差异(例如第二个技能精灵示例)。当使用BodyEditor工具时,我不仅需要定义每个技能的形状,还需要定义每个技能的多个图像(最多12个)的形状。这将非常耗时,并且在实现这些数十个多边形形状时会变得非常混乱。
b) 如果有任何平滑的方式可以自动生成图像的多边形,那就可以解决问题。我只需将每个精灵部分连接到生成的多边形上,然后以此检查碰撞。然而,存在一些问题:
- 有没有一种流畅的工具可以从图像中生成多边形形状(并且不需要太多时间)?
- 我认为像这样的工具(如果存在)可能无法直接使用纹理。它可能需要像素图。但在多边形创建后,不需要保持像素图的加载。仍然是一个极其繁重的任务!
我的当前想法
我被困在这一点上,因为有几种可能的方法,但所有这些方法都有困难。在选择一条路线并继续编码之前,如果您能留下一些想法和知识,那将是非常好的。
libGDX 中可能包含有用的类和代码,可以在几秒钟内解决我的问题 - 因为我真的很新于 libGDX,所以我对它还不了解很多。
目前,我认为我会选择第一种方法:使用像素检测。这样,我在先前的 Android 游戏中实现了精确的碰撞检测。
你怎么看?
问候 Felix