每次事件滴答后,障碍物都会消失。我需要它留在屏幕上
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.GroupSingle
的 pygame.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()
我正在 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.GroupSingle
的 pygame.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()