python碰撞检测-python – 具有透明背景的精灵的像素完美碰撞检测

使用

pygame.mask.from_surface函数为精灵赋予self.mask属性.

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

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

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

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

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值