2017-12-06 11 views
0

지금 그룹에서 스프라이트를 삭제하는 두 가지 작업을 수행하려고합니다. 두 가지를 수행하고 싶습니다.그룹에서 단수 스프라이트를 제거하는 데 문제가 있음

  1. 먼저 총알과 파워 업이 있습니다. 내 총알이 내 파워 업과 충돌하면, 나는 그 특정 탄환과 파워 업을 제거하기를 원해.
  2. 둘째, 내 파워 업이 일정 시간이 지나도 안타를 맞지 않으면 제거해야합니다.

목표 1의 문제 : 탄이 충돌하여 전원이 켜지면 내 모든 글 머리 기호가 멈 춥니 다.
목표 2의 문제점 : 한 번에 하나의 파워 업이 아닌 모든 파워 업이 제거됩니다. 여기

내 총알 클래스입니다 :

class GameScreen(SceneBase): 

    def __init__(self): 
     SceneBase.__init__(self) 

     self.my_font = pygame.font.SysFont("Arial", 50) 

     self.bullets_group = pygame.sprite.Group() 
     self.powerup_group = pygame.sprite.Group() 
     self.player_paddle = classes.PlayerPaddle(screen_size, 20, 100, "naruto.png", self.bullets_group) 
     self.ai_paddle = classes.AIPaddle(screen_size, 20, 100, "naruto.png") 
     self.pong = classes.Pong(screen_size, 20, 20, "pokeball.png") 

     self.now1 = pygame.time.get_ticks() 
     self.now2 = pygame.time.get_ticks() 


    def ProcessInput(self, events, pressed_keys): 
     for event in events: 
      self.player_paddle.handle_event(event) 

    def Update(self): 
     self.player_paddle.update() 
     self.ai_paddle.update(self.pong, self.player_paddle) 
     self.pong.update(self.player_paddle, self.ai_paddle) 

     for powerup in self.powerup_group: 
      self.bullets_group.update(powerup) 
     self.powerup_group.update() 


     # if someone reaches a score of 2, then exit the game 
     if self.player_paddle.score == 2 or self.ai_paddle.score == 2: 
      SceneBase.is_game_over = True 
      self.SwitchToScene(GameOverScreen()) 

     time_difference1 = pygame.time.get_ticks() - self.now1 
     time_difference2 = pygame.time.get_ticks() - self.now2 

     if time_difference1 >= 2000: 
      self.powerup_group.add(classes.PowerUp(screen_size, 40, 40, "ramen.png")) 
      self.now1 = pygame.time.get_ticks() 

     for powerup in self.powerup_group: 
      if time_difference2 >= 5000: 
       self.powerup_group.remove(powerup) 

경우, 내 PlayerPaddle 클래스의 경우 : 여기

class Bullet(Image): 

    def __init__(self, screen_size, width, height, filename, color = (255, 0, 0)): 

     super().__init__(screen_size, width, height, filename, color = (255, 0, 0)) 

    def checkCollision(self, powerup): 

     return pygame.sprite.collide_mask(self, powerup) 

    def removeBullet(self, powerup): 
     if self.checkCollision(powerup): 
      self.kill() 

    def update(self, powerup): 
     self.rect.centerx += 3 
     self.removeBullet(powerup) 

내 파워 업 클래스

class PowerUp(Image): 

    def __init__(self, screen_size, width, height, filename, color = (255, 0, 0)): 

     super().__init__(screen_size, width, height, filename, color = (255, 0 , 0)) 


     _centerx = random.randint(20, 1100) # <-- local variable _centerx (don't need it in other methods) 
     _centery = random.randint(20, 700) # <-- local variable _centery (don't need it in other methods) 
     self.radius = 10 
     self.rect = pygame.Rect(_centerx-self.radius, 
           _centery-self.radius, 
           self.radius*2, self.radius*2) 

    def update(self): 

     pass 

입니다 그리고 여기 내가 모든 것을 실행하는 경우 열쇠를 클릭하면 총알이 발사됩니다. 그러나 총알은 오른쪽으로 이동하지 않습니다 (Bullet의 업데이트 기능에서 수행하도록 요청한 것처럼).

def handle_event(self, event): 
    if event.type == pygame.KEYDOWN: 
     if event.key == pygame.K_UP: 
      self.direction = -1 
     elif event.key == pygame.K_DOWN: 
      self.direction = 1  
     elif event.key == pygame.K_LEFT: 
      self.turnLeft() 
     elif event.key == pygame.K_RIGHT: 
      self.turnRight() 
     elif event.key == pygame.K_u: 
      bullet = Bullet(screen_size, 25, 25, "naruto.png", color = (255, 0 , 0)) 
      bullet.rect.centerx = self.rect.centerx 
      bullet.rect.centery = self.rect.centery 

      self.bullet_group.add(bullet) 
+0

모든 타이머는 자신의 타이머가 있어야합니다. 이제'if time_difference2> = 5000 :'은 모든 파워 업에 대해 같은 타이머를 검사하므로 동시에 모든 파워 업을 제거합니다. – furas

+0

클래스'글 머리 기호'를 볼 수 있지만'bullet' 또는'bullets_group'을 사용하는 코드가 보이지 않으므로 Goal1에 문제가 보이지 않습니다. – furas

+0

나는 항상 특정 글 머리 기호와 파워 업 사이의 충돌을 확인하려고합니다. . 충돌을 감지하기 위해 collide_mask를 사용했지만 지금은 총알이 움직이지 않습니다. – turtlefish12

답변

1

목표 2 : 그렇게는 동시에 모든 파워 업을 제거

time_difference2 = pygame.time.get_ticks() - self.now2 

... 

if time_difference2 >= 5000: 

모든 파워 업에 대해 동일한 타이머를 사용합니다.

전원을 켜면 모든 내부 타이머가 필요합니다. 내가 이름을 사용 kill_timecurrent_time+5000

time_difference1 = pygame.time.get_ticks() - self.now1 

    # --- 

    current_time = pygame.time.get_ticks() 

    if time_difference1 >= 2000: 
     powerup = classes.PowerUp(screen_size, 40, 40, "ramen.png") 
     powerup.kill_time = current_time + 5000 
     self.powerup_group.add(power) 
     self.now1 = pygame.time.get_ticks() 

    # ---- 

    current_time = pygame.time.get_ticks() 

    for powerup in self.powerup_group: 
     if powerup.kill_time <= current_time: 
      self.powerup_group.remove(powerup)