Я пытаюсь навсегда «убить» цели при попадании пули, но они снова появляются после использования «.kill ()» (PYGAME) - PullRequest
3 голосов
/ 28 марта 2020

Я недавно выложил довольно много вопросов, и я думаю, что люди устали от меня, но я плохо программирую и пытаюсь написать игру для курсовых работ уровня A, поэтому мне нужна вся помощь, чтобы научиться язык. Во всяком случае, я покажу несколько соответствующих битов кода ниже для справки. Я использую all_targets, потому что хочу добавить задержку, используя threshold, чтобы они не появлялись одновременно. Я думаю, что это вызывает повторное добавление целей в группу спрайтов, но я не могу решить это. Я хочу, чтобы цели удалялись из target_sprites при попадании пули. Я пытался использовать логические значения, чтобы сделать так, чтобы if destroyed == True: all_bullets.remove(item), но это, похоже, не работает. Любая помощь приветствуется.

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



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)

#Function to add delay between targets spawning.

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

#Function to make targets move each time screen refreshes.
def movement():
  for item in target_sprites:
    item.rect.x += 1
  for item in all_bullets_keep:
    if item['y']-30 < (target_1.rect.y) + 100 and item['y']+30 > target_1.rect.y:
      if item['x']+10 > target_1.rect.x and item['x']-30 < (target_1.rect.x) + 100:
        target_1.kill()
    if item['y']-30 < (target_2.rect.y) + 100 and item['y']+30 > target_2.rect.y:
      if item['x']+10 > target_2.rect.x and item['x']-30 < (target_2.rect.x) + 100:
        target_2.kill()
    if item['y']-30 < (target_3.rect.y) + 100 and item['y']+30 > target_3.rect.y:
      if item['x']+10 > target_3.rect.x and item['x']-30 < (target_3.rect.x) + 100:
        target_3.kill()
    if item['y']-30 < (target_4.rect.y) + 100 and item['y']+30 > target_4.rect.y:
      if item['x']+10 > target_4.rect.x and item['x']-30 < (target_4.rect.x) + 100:
        target_4.kill()
    if item['y']-30 < (target_5.rect.y) + 100 and item['y']+30 > target_5.rect.y:
      if item['x']+10 > target_5.rect.x and item['x']-30 < (target_5.rect.x) + 100:
        target_5.kill()
    if item['y']-30 < (target_6.rect.y) + 100 and item['y']+30 > target_6.rect.y:
      if item['x']+10 > target_6.rect.x and item['x']-30 < (target_6.rect.x) + 100:
        target_6.kill()

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Вам не нужен пороговый атрибут. Удалите его:

class Target(pygame.sprite.Sprite):
    def __init__(self, width, height, offset):
        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)

Создайте пустую группу спрайтов:

target_sprites = pygame.sprite.Group()

Количество миллисекунд с pygame.init() может быть получено с помощью pygame.time.get_ticks(). См. pygame.time модуль. Используйте тики, чтобы порождать спрайтов с интервалом в главном приложении l oop (target_delay должен вызываться в приложении l oop):

offsets = [100, 300, 200, 100, 400, 150]
next_target_time = 0
threshold = 1000 # 1000 milliseconds = 1 second

def target_delay():
    global next_target_time, offsets
    current_time = pygame.time.get_ticks()
    if current_time > next_target_time and len(offsets) > 0:
        target_sprites.add(Target(100, 100, offsets[0]))
        offsets.pop(0)
        next_target_time = current_time + threshold

Оценить, должна ли цель быть убит (kill) во всех oop:

for item in all_bullets_keep:
    for target in target_sprites:
        if item['y']-30 < (target.rect.y) + 100 and item['y']+30 > target.rect.y:
            if item['x']+10 > target.rect.x and item['x']-30 < (target.rect.x) + 100:
                target.kill()
0 голосов
/ 31 марта 2020

Я не знаю, помогает ли это, но есть функция спрайта target_1.alive(), которая сообщает вам, был ли спрайт уничтожен или нет. Вы можете использовать это, чтобы сначала определить, следует ли рисовать, или, во-вторых, когда все они были убиты, чтобы вы знали, когда закончить игру.

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