我目前正在开发一款关于Pygame,Python 3的游戏,游戏的一个重要部分是在子弹目标情况下Rects的碰撞。
使用colliderect
函数可以很容易地实现这一功能,但是必须对与colorkey颜色相同的像素进行计数。
例如,如果其中一个精灵(角色)是一个大的等边三角形,其基部是水平的,子弹来自左上角,colliderect
会检测到碰撞权即使左上角的像素是玩家的精灵也是透明的。
我需要创建一个只有在子弹到达与colorkey颜色不同的像素时才会检测到碰撞的函数。如果子弹只有一个像素,这很容易:
if player.get_at((bullet[0] - player.left, bullet[1] - player.top)) != player.get_colorkey():
我尝试为子弹中的每个像素迭代上述语句,但是,当然,这导致了大量的延迟。是否有不同的,更有效的方式?
提前致谢!!
答案 0 :(得分:1)
看一下collide_mask函数:
http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.collide_mask
简而言之,你给每个sprite一个self.mask属性(使用pygame.mask.from_surface()) - 你可以使用colorkey或per-pixel alpha。然后将它包含为spritecollide函数的回调,如下所示:
pygame.sprite.spritecollide(player,bullets,True,pygame.sprite.collide_mask)
希望这有帮助!
答案 1 :(得分:0)
我设法制作了一个查看每个矩形角落的算法:
def rectsCollideSimple (rect1, surf1, rect2, surf2):
collide = False
try:
if surf1.get_at((rect2.left - rect1.left, rect2.top - rect1.top)) != surf1.get_colorkey():
collide = True
except IndexError:
useless = None
try:
if surf1.get_at((rect2.right - rect1.left, rect2.top - rect1.top)) != surf1.get_colorkey():
collide = True
except IndexError:
useless = None
try:
if surf1.get_at((rect2.left - rect1.left, rect2.bottom - rect1.top)) != surf1.get_colorkey():
collide = True
except IndexError:
useless = None
try:
if surf1.get_at((rect2.right - rect1.left, rect2.bottom - rect1.top)) != surf1.get_colorkey():
collide = True
except IndexError:
useless = None
return collide
def rectsCollide (rect1, surf1, rect2, surf2):
if rectsCollideSimple(rect1, surf1, rect2, surf2) or rectsCollideSimple(rect2, surf2, rect1, surf1):
return True
else:
return False
可能不是最有效的方式,但它解决了我的问题:)