精灵面具碰撞不起作用(直接碰撞工作)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精灵面具碰撞不起作用(直接碰撞工作)相关的知识,希望对你有一定的参考价值。

我使用时碰撞有效:

pygame.sprite.collide_rect 

但是当我使用时它不起作用:

pygame.sprite.collide_mask 

这是我的两个班级:

class Ball():
    def __init__(self):
        self.rect = balltexture.get_rect()
        self.rect.x=225
        self.rect.y=400
        self.radius = 100
        self.velx=0
        self.vely=0
        self.action=False
        self.switchx=0
        self.switchy=0        
        pygame.sprite.Sprite.__init__(self)
        self.mask = pygame.mask.from_surface(balltexture)
    def draw(self):
        win.blit(balltexture, self.rect)


class rock():
    def __init__(self, y):
        self.rect = rocktexture.get_rect()
        self.rect.x = screensize.current_w
        self.rect.y = y
        self.width = 120
        pygame.sprite.Sprite.__init__(self)
        self.mask = pygame.mask.from_surface(rocktexture)


    def draw(self, win):
        win.blit(rocktexture, self.rect)

这是碰撞检查

for i in rocks:
    if pygame.sprite.collide_rect(i, Player):
        print(1)
        if pygame.sprite.collide_mask(i, Player):
            print(2)

所以当他们碰撞时,它会一直打印1。

BTW我正在移动rect坐标(例如Player.rect.x)来移动Player / rocks并且我也尝试了掩码重叠方法但是它也没有工作

offset = (Player.rect.x-i.rect.x, Player.rect.y-i.rect.y)
if i.mask.overlap(Player.mask, offset):
    print(2)
答案

不太清楚发生了什么,但这里有一些尝试:

您可以使用self.mask.fill()将掩码设置为全1。此时,掩码碰撞应与基于矩形的碰撞相同。

您可以调用print(self.mask.count()),它将显示设置的像素数。确保它不是0或其他东西。

您可以调用i.mask.overlap(Player.mask(0,0)),并在它们具有相同的左上角时确认它们重叠。

这可能是掩模创建的问题,或者偏移在某种程度上是错误的;这应该缩小问题的范围。

另一答案

我的一张图片没有透明度,这就是问题所在

以上是关于精灵面具碰撞不起作用(直接碰撞工作)的主要内容,如果未能解决你的问题,请参考以下文章

OnTriggerEnter2d 统一不起作用

三精灵节点碰撞

检测精灵套件中的碰撞

Sprite Kit 碰撞发生在精灵之外的几个点

精灵表动画上的像素完美碰撞,XNA

SpriteKit中精灵之间的碰撞