2017-12-29 10 views

답변

1

pygame.mask.from_surface 함수를 사용하여 스프라이트에 self.mask 특성을 부여하십시오.

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

그럼 당신은 pygame.sprite.spritecollide 같은 스프라이트 충돌 함수 중 하나에 콜백 함수로 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() 
: 여기
pygame.sprite.spritecollide(self.player, self.enemies, False, pygame.sprite.collide_mask) 

완성 예 (두 스프라이트 충돌 할 때 자막이 변경)의
관련 문제