Pygame开发太空侵略者游戏波次提示图片显示异常问题求助
问题成因
- 你调用
screen.blit()方法只是把图片绘制到了屏幕的后台缓存中,必须调用pygame.display.update()才会把缓存内容刷新到实际显示器上。你绘制完波次提示后直接调用time.sleep(3),期间没有执行刷新操作,所以提示图不会显示。 time.sleep()会阻塞整个游戏线程,这3秒内游戏的事件循环完全停止运行,窗口会进入无响应状态,用户的操作也无法被识别。- sleep结束后你立刻把
wave变量重置为bgk.png,直到本次循环末尾才执行pygame.display.update(),这时候你绘制的bgk会覆盖之前的波次图,所以波次图只会闪现极短时间。 - 你在游戏循环中反复调用
pygame.image.load()读取图片,磁盘IO操作非常慢,会导致游戏卡顿,也会加剧显示异常的问题。
修复方案
步骤1:提前预加载所有图片,避免循环中重复读取
在初始化部分(pygame.init()之后)添加如下代码:
# 预加载所有静态资源 bg_img = pygame.image.load("bg.png") bgk_img = pygame.image.load("bgk.png") # 预加载所有波次提示图 wave_imgs = { "wave1.png": pygame.image.load("wave1.png"), "wave2.png": pygame.image.load("wave2.png"), "wave3.png": pygame.image.load("wave3.png"), "wave4.png": pygame.image.load("wave4.png"), "wave5.png": pygame.image.load("wave5.png"), } # 新增变量控制波次提示显示时长 wave = "bgk.png" show_wave_end_time = 0 # 单位:毫秒,记录波次提示需要显示到的时间点
步骤2:替换游戏循环中波次提示的原有逻辑
删除你原来循环里的这段代码:
wave1="bgk.png" if wave1!=wave: screen.blit(pygame.image.load(wave),(615,480)) wave="bgk.png" time.sleep(3) screen.blit(pygame.image.load(wave),(615,480)) else: pass
替换为如下逻辑:
current_time = pygame.time.get_ticks() # 获取游戏启动到现在的毫秒数 # 先绘制背景 screen.blit(bg_img, (0,0)) # 波次提示逻辑 if show_wave_end_time > current_time: # 还在提示显示周期内,绘制波次图,跳过正常游戏逻辑 screen.blit(wave_imgs[wave], (615, 480)) else: # 波次提示结束,重置wave状态 if wave != "bgk.png": show_wave_end_time = current_time + 3000 else: # 原有游戏的事件处理、玩家、子弹、敌人等所有逻辑都挪到这里执行 for event in pygame.event.get(): if event.type==pygame.QUIT: running=False # 剩余的事件处理代码原样保留 # 后面的player()、scores()、子弹逻辑、敌人逻辑等所有代码也都原样保留在这里 # 最后统一刷新屏幕 pygame.display.update()
步骤3:修改波次触发逻辑
你原有enimy_quantity()函数里修改wave变量的逻辑不用改,当分数达标给wave赋值为对应波次图片的key即可,计时逻辑会自动处理显示。
额外优化建议
- 分数显示部分不用写大量
if判断,你可以把数字图片存在一个列表里:num_imgs = [_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],要显示某个数字时,把数字转成字符串遍历每个字符,用num_imgs[int(字符)]直接取对应图片即可,代码会简洁很多。 - 读写最高分文件时建议用
with open()语法,会自动关闭文件,避免资源泄漏:# 读最高分 with open("hiscore.txt", "r") as f: hiscore = int(f.read()) # 写最高分 with open("hiscore.txt", "w") as f: f.write(str(score)) - 不要在碰撞逻辑里动态增删敌人列表的元素,遍历列表的时候修改列表长度很容易出现索引异常。
内容的提问来源于stack exchange,提问作者Ashmit Garg
相关产品推荐
相关产品推荐

