首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >透明背景下精灵的像素完美碰撞检测

透明背景下精灵的像素完美碰撞检测
EN

Stack Overflow用户
提问于 2017-12-29 16:12:02
回答 1查看 3.9K关注 0票数 4

如何使用Pygame的sprite模块来检测具有透明背景的两个精灵的碰撞,以便只有当实际的精灵而不是透明的背景发生碰撞时,才能返回True

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-29 16:39:24

使用pygame.mask.from_surface函数为sprites提供一个self.mask属性。

代码语言:javascript
复制
self.mask = pygame.mask.from_surface(self.image)

然后,您可以将pygame.sprite.collide_mask作为回调函数传递给像pygame.sprite.spritecollide这样的精灵碰撞函数之一,并且碰撞检测将是像素完美的。

代码语言:javascript
复制
pygame.sprite.spritecollide(self.player, self.enemies, False, pygame.sprite.collide_mask)

下面是一个完整的示例(当两个精灵发生碰撞时,标题被更改):

代码语言:javascript
复制
import pygame as pg


class Player(pg.sprite.Sprite):

    def __init__(self, pos):
        super(Player, self).__init__()
        self.image = pg.Surface((120, 120), pg.SRCALPHA)
        pg.draw.polygon(self.image, (0, 100, 240), [(60, 0), (120, 120), (0, 120)])
        self.rect = self.image.get_rect(center=pos)
        self.mask = pg.mask.from_surface(self.image)


class Enemy(pg.sprite.Sprite):

    def __init__(self, pos):
        super(Enemy, self).__init__()
        self.image = pg.Surface((120, 120), pg.SRCALPHA)
        pg.draw.circle(self.image, (240, 100, 0), (60, 60), 60)
        self.rect = self.image.get_rect(center=pos)
        self.mask = pg.mask.from_surface(self.image)


class Game:
    def __init__(self):
        self.screen = pg.display.set_mode((640, 480))
        self.player = Player((20, 20))
        self.enemies = pg.sprite.Group(Enemy((320, 240)))
        self.all_sprites = pg.sprite.Group(self.player, self.enemies)
        self.done = False
        self.clock = pg.time.Clock()

    def run(self):
        while not self.done:
            self.event_loop()
            self.update()
            self.draw()
            pg.display.flip()
            self.clock.tick(60)

    def event_loop(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.done = True
            elif event.type == pg.MOUSEMOTION:
                self.player.rect.center = event.pos

    def update(self):
        # Check if the player collides with an enemy sprite. The
        # `pygame.sprite.collide_mask` callback uses the `mask`
        # attributes of the sprites for the collision detection.
        if pg.sprite.spritecollide(self.player, self.enemies, False, pg.sprite.collide_mask):
            pg.display.set_caption('collision')
        else:
            pg.display.set_caption('no collision')

    def draw(self):
        self.screen.fill((30, 30, 30))
        self.all_sprites.draw(self.screen)


if __name__ == '__main__':
    pg.init()
    game = Game()
    game.run()
    pg.quit()
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48025283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档