具有透明背景的精灵的像素完美碰撞检测 [英] Pixel perfect collision detection for sprites with a transparent background

查看:56
本文介绍了具有透明背景的精灵的像素完美碰撞检测的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我如何使用 Pygame 的 sprite 模块来检测具有透明背景的两个精灵的碰撞,以便它仅在实际精灵而不是透明背景时返回 True背景冲突?

How can I use Pygame's sprite module to detect the collision of two sprites with transparent backgrounds, so that it will return True only if the actual sprites, not the transparent backgrounds collide?

推荐答案

使用 pygame.mask.from_surface 函数给你的精灵一个 self.mask 属性.

self.mask = pygame.mask.from_surface(self.image)

然后你可以通过pygame.sprite.collide_mask 作为精灵碰撞函数之一的回调函数,如pygame.sprite.spritecollide,碰撞检测将是像素完美的.

Then you can pass pygame.sprite.collide_mask as the callback function to one of the sprite collision functions like pygame.sprite.spritecollide and the collision detection will be pixel perfect.

pygame.sprite.spritecollide(self.player, self.enemies, False, pygame.sprite.collide_mask)

这是一个完整的例子(当两个精灵碰撞时标题会改变):

Here's a complete example (the caption is changed when the two sprites collide):

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()

这篇关于具有透明背景的精灵的像素完美碰撞检测的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆