我已经开始研究 Rabbyt 库,到目前为止,我真的很喜欢将它与 pyglet 结合使用。
库中似乎没有实现的一件事是精灵之间的像素完美碰撞检测。我在实施时有两个问题。
首先,我正在使用 pyglet 加载精灵的纹理,但我不明白如何从纹理中获取位掩码(我非常有限的 OpenGL 知识是主要问题)。似乎 BufferImageMask 是从 AbstractImage 实例获得的,而不是从纹理本身获得的。这样做的正确方法是什么?
其次,实现实际的碰撞检测算法有哪些不同的方法?如果有任何方法/变化,我最感兴趣,因为到目前为止我读过的所有内容都是这样的:
我只是尽量不要错过任何重要信息,算法本身是可靠的。
提前致谢!
PS 我在 Python 2.7 中编码,但我宁愿在 C 中实现实际的像素完美碰撞检测算法并将其用作扩展。
更新
我已经设法使用非旋转精灵进行像素完美碰撞检测:
r1 = collision[entity1].aabb
r2 = collision[entity2].aabb
sprite1 = renderable[entity1].sprite
sprite2 = renderable[entity2].sprite
ri = r1.intersect(r2)
offx1, offy1 = int(ri.left - r1.left), int(ri.top - r1.top)
offx2, offy2 = int(ri.left - r2.left), int(ri.top - r2.top)
d1 = sprite1.texture.get_image_data().get_data('A', sprite1.texture.width)
d2 = sprite2.texture.get_image_data().get_data('A', sprite2.texture.width)
p1 = cast(d1, POINTER(c_ubyte))
p2 = cast(d2, POINTER(c_ubyte))
for i in range(0, int(ri.width)):
for j in range(0, int(ri.height)):
c1, c2 = 0, 0
x1 = offx1+i
y1 = (j+offy1)*sprite1.texture.width
x2 = offx2+i
y2 = (offy2+j)*sprite2.texture.width
if x1 >= 0 and y1 >= 0:
c1 = p1[x1 + y1]
if x2 >= 0 and y2 >= 0:
c2 = p2[x2 + y2]
if c1>0 and c2 >0:
pairs.add(pair)
break
碰撞和可渲染只是与给定实体相关联的对象的字典。该算法是这个算法的修改版本:Pyglet 像素完美碰撞
虽然这非常好(而且速度很快,即使对于像这样被破解的代码也是如此)它对旋转的精灵没有用(我需要,除非为不同角度缓存大约 100 个不同版本的相同精灵是一个可行的选择),所以我是仍在寻找解决该问题的方法。