每次事件滴答后,障碍物都会消失。我需要它留在屏幕上

Obstacle keeps disappearing after each event tick. I need it to stay on the screen

我正在 pygame 中创建一个小游戏,障碍物从屏幕顶部落到底部。在每个事件刻度,都会创建一个障碍。然而,在每个新的刻度(1500 毫秒),当前障碍物在它到达底部之前被移除并创建一个新障碍物。我需要障碍物在生成新障碍物时留在屏幕上。

我正在尝试仅使用 classes 和函数来完成此操作。

所以我想在障碍物 class 内创建一个 obstacle_movement() 函数。 你能帮忙吗? 我的代码如下。

import pygame
import sys
from random import randint
from pygame import surface
import time
import os


class obstacle(pygame.sprite.Sprite):
  def __init__(self):
    super().__init__()

    Obstacle_directory = r'C:\Users\ctcar\Documents\CompSci\GameDev\selfgame\Graphics\Obstacles'

    obstacle_lst = []
    self.obstacle_frames = []

    for filename in sorted(os.listdir(Obstacle_directory), key = len):
      if filename.endswith('.png'):
        obstacle_lst.append('Graphics/Obstacles/' + filename)
      
    for sprite in obstacle_lst:
      alpha_sprite = pygame.image.load(sprite).convert_alpha()
      self.obstacle_frames.append(alpha_sprite)  

    y_pos = -20
    self.obstacle_idx = 0
    self.frames = self.obstacle_frames
    self.image = self.frames[self.obstacle_idx]
    self.rect = self.image.get_rect(midbottom = (randint(50, 750), y_pos))

  def obstacle_animation(self):
    self.obstacle_idx += 0.1
    if self.obstacle_idx >= len(self.frames):
      self.obstacle_idx = 0
    self.image = self.frames[int(self.obstacle_idx)]

  def update(self):
    self.obstacle_animation()
    self.rect.y += 4



obstacle_group = pygame.sprite.GroupSingle()


obstacle_timer = pygame.USEREVENT + 1
pygame.time.set_timer(obstacle_timer, randint(1000, 1100))

game_active = True
while True: 
  
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      sys.exit()

  if game_active:

    screen.blit(sky_surface,(0,0))
    screen.blit(ground_surface,(100,710))

    if event.type == obstacle_timer:
      obstacle_group.add(obstacle())


    obstacle_group.draw(screen) 
    obstacle_group.update()
          
    pygame.display.update()
    clock.tick(60)




您需要使用 pygame.sprite.GroupSinglepygame.sprite.Group insterad:

obstacle_group = pygame.sprite.GroupSingle()

obstacle_group = pygame.sprite.Group()

obstacle_group = pygame.sprite.GroupSingle():

The GroupSingle container only holds a single Sprite. When a new Sprite is added, the old one is removed.


此外,事件必须在事件循环中处理:

game_active = True
run = True
while run: 

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

        if game_active:    
            if event.type == obstacle_timer:
                obstacle_group.add(obstacle())

    if game_active:

        screen.blit(sky_surface,(0,0))
        screen.blit(ground_surface,(100,710))
        obstacle_group.draw(screen) 
        obstacle_group.update()
            
    pygame.display.update()
    clock.tick(60)

pygame.quit()
sys.exit()