Pygame中的Rects之间的Colorkey冲突,Python 3

时间:2016-07-16 01:57:50

标签: python python-3.x pygame pygame-surface color-key

我目前正在开发一款关于Pygame,Python 3的游戏,游戏的一个重要部分是在子弹目标情况下Rects的碰撞。

使用colliderect函数可以很容易地实现这一功能,但是必须对与colorkey颜色相同的像素进行计数。

例如,如果其中一个精灵(角色)是一个大的等边三角形,其基部是水平的,子弹来自左上角,colliderect会检测到碰撞权即使左上角的像素是玩家的精灵也是透明的。

我需要创建一个只有在子弹到达与colorkey颜色不同的像素时才会检测到碰撞的函数。如果子弹只有一个像素,这很容易:

if player.get_at((bullet[0] - player.left, bullet[1] - player.top)) != player.get_colorkey():

我尝试为子弹中的每个像素迭代上述语句,但是,当然,这导致了大量的延迟。是否有不同的,更有效的方式?

提前致谢!!

2 个答案:

答案 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

可能不是最有效的方式,但它解决了我的问题:)