障碍物在每次活动后都会不断消失.我需要它留在屏幕上



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

我试图只使用类和函数来完成这项工作。

因此,我想在障碍类中创建一个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.Group代替pygame.sprite.GroupSingle:

obstacle_group = pygame.sprite.GroupSingle()

obstacle_group = pygame.sprite.Group()

参见obstacle_group = pygame.sprite.GroupSingle():

GroupSingle容器只容纳一个精灵。添加新精灵时,将删除旧精灵


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

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()

最新更新