Почему эти цели появляются снова после того, как моя функция удаляет их из списка? - PullRequest
1 голос
/ 28 марта 2020

Я занимаюсь разработкой целевой стрелялки. В соответствии с приведенным ниже кодом, элементы в «all_targets» должны быть добавлены к target_sprites после того, как «clock» достиг порогового значения каждого целевого значения (ради задержки). Затем я использую другую функцию для удаления цели из all_targets, когда они сталкиваются с пулей. Затем я использую «self.destroyed», чтобы различать, какой экран конца игры показан, при этом экран победителя показывает, поражены ли все 6 целей, а проигравший отображается, если не все 6 поражены после того, как шестой покинул арену. Это работает на секунду, но потом все они появляются снова. Я попытался поместить список all_targets в то время как l oop, но он все еще не работает.

clock = 0
py_clock = pygame.time.Clock()

#Using pygame.sprite to create a class for the player sprite.
player_img = pygame.image.load('santa.png')

class Player(pygame.sprite.Sprite):
    def __init__(self, width, height):
        pygame.sprite.Sprite.__init__(self, player_sprites)
        self.image = pygame.Surface([width, height])
        self.image = player_img
        self.rect = self.image.get_rect()
        self.rect.center = (800 / 2, 545)

player_sprites = pygame.sprite.Group()

player_sprite = Player(64,64)
player_sprites.add(player_sprite)

#Using pygame.sprite to create a class for the target sprites.
target_img = pygame.image.load('Christmas Target.png')

class Target(pygame.sprite.Sprite):
    def __init__(self, width, height, offset, threshold):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([width, height])
        self.image = target_img
        self.rect = self.image.get_rect()
        self.rect.center = (self.rect.x + 50, self.rect.y + offset)
        self.threshold = threshold
        self.destroyed = False
        self.spawned = False


target_sprites = pygame.sprite.Group()

target_1 = Target(100, 100, 100, 0)
target_2 = Target(100, 100, 300, 150)
target_3 = Target(100, 100, 200, 300)
target_4 = Target(100, 100, 100, 450)
target_5 = Target(100, 100, 400, 600)
target_6 = Target(100, 100, 250, 750)

destroyed_targets = []

def wrecked():
  for item in all_targets:
    if item.destroyed == True:
      all_targets.remove(item)
      destroyed_targets.append(item)


def target_delay():
  global clock 
  clock += 1
  for item in all_targets:
    if clock >= item.threshold:
      target_sprites.add(item)

def movement():
  for item in target_sprites:
    item.rect.x += 1

#Creating a function which will deal with redrawing all sprites and updating the screen.
def refresh_window():
  if len(target_sprites) > 0:
   window.blit(bgr, (0,0))
  if len(all_targets) == 0 and len(destroyed_targets) == 6:
    window.blit(winner, (0,0))
  if len(target_sprites) > 0 and target_6.rect.x >= 575:
    window.blit(loser, (0,0))
  if len(target_sprites) > 0 and target_5.rect.x >= 575:
    window.blit(loser, (0,0))
  if len(target_sprites) > 0 and target_4.rect.x >= 575:
    window.blit(loser, (0,0))
  if len(target_sprites) > 0 and target_3.rect.x >= 575:
    window.blit(loser, (0,0))
  if len(target_sprites) > 0 and target_2.rect.x >= 575:
    window.blit(loser, (0,0))
  if len(target_sprites) > 0 and target_1.rect.x >= 575:
    window.blit(loser, (0,0))
  player_sprites.draw(window)
  target_sprites.draw(window)
  for item in all_bullets:
    pygame.draw.rect(window, BLUE, (item['x']-5, item['y']-5, 10, 10))
    b_hitbox = (item['x']-10, item['y']-10, 20, 20)
    pygame.draw.rect(window, BLUE, b_hitbox, 2)
  pygame.display.update()

#The game itself is contained in this while loop (game loop)
while exec:
  current_time = pygame.time.get_ticks() 

  for event in pygame.event.get():
    if event.type == pygame.QUIT:
            exec = False

  if event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == 1:
            dx = event.pos[0] - (player_sprite.rect.x+ 100//2)
            dy = event.pos[1] - player_sprite.rect.y
            direction = pygame.math.Vector2(dx, dy).normalize()
            bullet = {'x': player_sprite.rect.x+42, 'y': player_sprite.rect.y, 'direction': direction}
            all_bullets.append(bullet)

  all_bullets_keep = []

  for item in all_bullets:
    item['x'] += item['direction'][0] # item['direction'][0] * 2
    item['y'] += item['direction'][1] # item['direction'][1] * 2

    if 0 < item['x'] < 800 and 0 < item['y'] < 575:
          all_bullets_keep.append(item)

  all_bullets = all_bullets_keep

  all_targets = [target_1, target_2, target_3, target_4, target_5, target_6]

  target_delay()

  movement()

  wrecked()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...