2017-10-31 1 views
2

나는 소행성을 화면의 맨 위에서 똑바로 떨어 뜨린 다음 사라지려고합니다. 이렇게하려면 소행성 클래스의 여러 객체를 만들었지 만 나중에 삭제할 수는 없습니다.pygame을 사용하여 파이썬에서 표시된 객체를 삭제하는 방법은 무엇입니까?

A = [] 
while gameLoop: 
... 

a = Asteroid() 
A.append(a)` 

for i in A: 
    i.move() 
    if i.pos > dWidth: 
     del i # This doesn't remove the object 

삭제 방법이 있습니까?

+0

이러한 개체를 삭제하는 방법을 결정할 수 있도록 소행성 클래스를 표시하십시오. –

답변

1

delete 클래스를 Asteroid 클래스에 구현하고 if 조건에서 i.delete()을 호출해야합니다.

의 삭제 방법은 에 따라 달라집니다. 먼저이 표시됩니다. 당신의 목적은 보통 pygame.sprite.Sprite의 서브 클래스이어야하며 파이 게임에서

1

는 업데이트하고 모두가 updatedraw 메서드를 호출하여 스프라이트를 포함 렌더링 할 수 있도록 sprite groups에 보관해야합니다. kill 메서드를 호출하여 해당 그룹에서 스프라이트를 제거 할 수 있습니다.

이 예제에서는 각 프레임 all_sprites 그룹에 Projectile 개의 스프라이트를 추가하고 game_area 외부에있는 경우 kill 개의 스프라이트를 추가합니다. pygame.Rectscontains 방법을 사용하여 하나의 rect가 다른 rect 안에 있는지 확인할 수 있습니다. 또는 rect의 x 또는 y 속성이 0보다 작거나 화면의 너비와 높이보다 큰지 여부 만 확인하면됩니다.

import random 

import pygame as pg 
from pygame.math import Vector2 


class Projectile(pg.sprite.Sprite): 

    def __init__(self, pos, game_area): 
     super().__init__() 
     self.image = pg.Surface((5, 5)) 
     self.image.fill(pg.Color('aquamarine2')) 
     self.rect = self.image.get_rect(center=pos) 
     self.vel = Vector2(2, 0).rotate(random.randrange(360)) 
     self.pos = Vector2(pos) 
     self.game_area = game_area 

    def update(self): 
     self.pos += self.vel 
     self.rect.center = self.pos 
     if not self.game_area.contains(self.rect): 
      self.kill() 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    game_area = pg.Rect(60, 60, 520, 360) 
    game_area_color = pg.Color('aquamarine2') 
    clock = pg.time.Clock() 
    all_sprites = pg.sprite.Group(Projectile(game_area.center, game_area)) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 

     all_sprites.add(Projectile(game_area.center, game_area)) 
     all_sprites.update() 

     screen.fill((30, 30, 30)) 
     all_sprites.draw(screen) 
     pg.draw.rect(screen, game_area_color, game_area, 2) 

     pg.display.flip() 
     clock.tick(60) 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 
+0

다음은 스프라이트 및 스프라이트 그룹 [튜토리얼]입니다 (http://programarcadegames.com/index.php?chapter=introduction_to_sprites&lang=en#section_13). – skrx

관련 문제