Pygame开发疑问:仅单个精灵显示,多精灵共存问题如何解决?
解决Pygame太空侵略者精灵覆盖问题
嘿,我来帮你搞定这个发射物覆盖战机的问题!咱们先拆解下代码里的几个核心问题:
- 每次画精灵都清空整个窗口:你的
sprite类的draw()方法里,每次都调用window.fill(255),这会把整个屏幕刷成白色,后面画的发射物自然就把之前的战机盖住了,连背景图都没机会展示! - 重复缩放图片:每次调用
draw()都执行pygame.transform.scale(),这不仅浪费性能,还会让图片越来越模糊——因为每次都是在已经缩放的图上再次缩放。 - 频繁刷新屏幕:每个精灵画完就调用
pygame.display.flip(),这会导致屏幕只显示最后画的那个精灵,刷新时机完全不对。
修正后的完整代码
下面是调整好的代码,我把这些问题都修复了:
# Import the library PyGame import pygame pygame.init() # Create the window/GUI window = pygame.display.set_mode((800, 800)) pygame.display.set_caption('Space Invaders') class Sprite: """A class that you assign to a sprite, it has the functions draw() and resize()""" def __init__(self, file_path): self.x = 330 self.y = 700 self.width = 100 self.height = 100 # 加载原始图片后,一次性完成缩放,避免重复操作 self.image = pygame.image.load(file_path).convert() self.image = pygame.transform.scale(self.image, (self.width, self.height)) # Blit the sprite onto the screen, ex: plane.draw() def draw(self): # 只负责绘制自身,不要做清空窗口或刷新屏幕的操作 window.blit(self.image, (self.x, self.y)) # 加载并适配背景图尺寸 background = pygame.image.load("stars.png").convert() background = pygame.transform.scale(background, (800, 800)) # Assign the variable plane to the class "Sprite" plane = Sprite("plane.gif") # 调整发射物初始位置,避免和战机重叠 projectile = Sprite("projectile.png") projectile.x = 375 # 让发射物居中于战机 projectile.y = 650 projectile.width = 50 projectile.height = 50 while True: # 处理窗口退出事件(不然游戏窗口关不掉) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 绘制流程:先画背景(覆盖上一帧内容)→ 画战机 → 画发射物 → 统一刷新 window.blit(background, (0, 0)) plane.draw() projectile.draw() pygame.display.flip()
关键改动说明:
- 把类名改成
Sprite(符合Python大驼峰命名规范) - 将图片缩放逻辑移到
__init__方法中,只执行一次,避免性能损耗和图片模糊 draw()方法仅负责绘制自身,不再处理窗口清空和屏幕刷新- 主循环里统一控制绘制顺序:先画背景(相当于清空上一帧),再依次绘制所有精灵,最后一次性刷新屏幕
- 调整了发射物的初始位置,避免一开始就和战机重叠
- 添加了窗口退出事件处理,让游戏可以正常关闭
这样修改后,战机和发射物就能同时显示在屏幕上啦!
内容的提问来源于stack exchange,提问作者Frei
相关产品推荐
相关产品推荐

