1

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

使用该colliderect功能很容易实现,但必须不计算与颜色键相同颜色的像素。

例如,如果其中一个精灵(角色)是一个大的等边三角形,其底部是水平的,并且子弹从左上角colliderect射出,即使顶部的像素也会立即检测到碰撞- 左边是玩家的精灵是透明的。

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

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

我尝试为子弹中的每个像素迭代上述语句,但是,当然,这会导致大量滞后。有没有不同的、更有效的方法?

提前致谢!!

4

2 回答 2

1

看一下 collide_mask 函数:

http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.collide_mask

简而言之,你给每个精灵一个 self.mask 属性(使用 pygame.mask.from_surface())——你可以使用颜色键或每像素 alpha 来完成。然后将它作为 spritecollide 函数的回调包含在内,如下所示:

pygame.sprite.spritecollide(玩家,子弹,真,pygame.sprite.collide_mask)

希望这可以帮助!

于 2016-07-16T08:31:17.950 回答
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

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

于 2016-07-17T00:21:40.627 回答