Pygame游戏重启问题求助:TNT下落速度未重置及按键响应异常
MacPhee Minecraft游戏问题修复
问题总结
- Game Over界面的「Press a Key to Play」提示偶尔无法响应按键
- 重启游戏后,TNT下落速度未重置为初始慢速,反而持续加快
修复方案
1. 按键无响应问题修复
原代码中showTextScreen和checkForKeyPress函数重复设置了INC_SPEED定时器,且checkForKeyPress对KEYDOWN事件处理错误,导致按键事件被忽略。
修改点:
- 删除
showTextScreen函数内的INC_SPEED定时器设置 - 删除
checkForKeyPress函数内的INC_SPEED定时器设置,检测到KEYDOWN时直接返回按键值,不再跳过
2. 速度不重置问题修复
全局变量SPEED在游戏过程中持续累加,重启时未重置;同时TNT的位置也没有回到初始状态。
修改点:
- 在碰撞触发
Game Over后,重置SPEED为初始值5 - 给Enemy类添加
reset_pos方法,用于重置TNT到屏幕顶部随机坐标 - 把背景图加载代码移到游戏循环外,避免重复加载浪费性能
- 同时重置玩家的位置到初始点
修改后的完整代码
import pygame, sys from pygame.locals import * import random, time from pygame import mixer # 初始化 pygame.init() # 设置帧率 FPS = 60 FramePerSec = pygame.time.Clock() # 颜色定义 BLUE = (0, 0, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) DARKGREEN = (21, 89, 30) BLACK = (0, 0, 0) WHITE = (255, 255, 255) ORANGE = (255, 204, 51) GRAY = (185, 185, 185) BORDERCOLOR = BLUE BGCOLOR = DARKGREEN BASICFONT = pygame.font.Font('freesansbold.ttf', 36) BIGFONT = pygame.font.Font('freesansbold.ttf', 80) TEXTCOLOR = WHITE TEXTSHADOWCOLOR = GRAY # 全局变量 SCREEN_WIDTH = 1500 SCREEN_HEIGHT = 800 SPEED = 5 # 创建屏幕 DISPLAYSURF = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) def showTextScreen(text): DISPLAYSURF.fill(BGCOLOR) # 绘制文字阴影 titleSurf, titleRect = makeTextObjs(text, BIGFONT, TEXTSHADOWCOLOR) titleRect.center = (int(SCREEN_WIDTH / 2), int(SCREEN_HEIGHT / 2)) DISPLAYSURF.blit(titleSurf, titleRect) # 绘制主文字 titleSurf, titleRect = makeTextObjs(text, BIGFONT, TEXTCOLOR) titleRect.center = (int(SCREEN_WIDTH / 2) - 3, int(SCREEN_HEIGHT / 2) - 3) DISPLAYSURF.blit(titleSurf, titleRect) # 绘制提示文字 pressKeySurf, pressKeyRect = makeTextObjs('Press a key to play.', BASICFONT, TEXTCOLOR) pressKeyRect.center = (int(SCREEN_WIDTH / 2), int(SCREEN_HEIGHT / 2) + 100) DISPLAYSURF.blit(pressKeySurf, pressKeyRect) pygame.display.flip() while checkForKeyPress() == None: pygame.display.update() FramePerSec.tick() def makeTextObjs(text, font, color): surf = font.render(text, True, color) return surf, surf.get_rect() def checkForKeyPress(): checkForQuit() for event in pygame.event.get([KEYDOWN, KEYUP]): if event.type == KEYDOWN: return event.key return event.key return None def checkForQuit(): for event in pygame.event.get(QUIT): terminate() for event in pygame.event.get(KEYUP): if event.key == K_ESCAPE: terminate() pygame.event.post(event) def terminate(): pygame.quit() sys.exit() # 预加载背景图,避免循环内重复加载 background = pygame.image.load("minecraftbackground.jpg").convert_alpha() background = pygame.transform.scale(background, (1500,800)) DISPLAYSURF.fill((0,0,0)) DISPLAYSURF.blit(background, (0,0)) pygame.display.update() pygame.display.set_caption("MacPhee Minecraft") showTextScreen('MacPhee Minecraft') class Enemy(pygame.sprite.Sprite): def __init__(self): self.image = pygame.image.load("TNT.jpg") self.image=pygame.transform.scale(self.image,(70,70)) self.rect = self.image.get_rect() self.reset_pos() def reset_pos(self): self.rect.center = (random.randint(40,SCREEN_WIDTH-40), 0) def move(self): self.rect.move_ip(0,SPEED) if (self.rect.top > 800): self.reset_pos() pygame.display.update() class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.image.load("Steve4.png") self.image=pygame.transform.scale(self.image,(140,200)) self.rect = self.image.get_rect() self.rect.center = (260, 480) def move(self): pressed_keys = pygame.key.get_pressed() if self.rect.left > 0: if pressed_keys[K_LEFT]: self.rect.move_ip(-55, 0) if self.rect.right < SCREEN_WIDTH: if pressed_keys[K_RIGHT]: self.rect.move_ip(55, 0) # 创建精灵 P1 = Player() E1 = Enemy() # 精灵组 enemies = pygame.sprite.Group() enemies.add(E1) all_sprites = pygame.sprite.Group() all_sprites.add(P1) all_sprites.add(E1) # 设置速度增加定时器 INC_SPEED = pygame.USEREVENT + 1 pygame.time.set_timer(INC_SPEED, 1000) # 游戏主循环 while True: # 事件处理 for event in pygame.event.get(): if event.type == INC_SPEED: SPEED += 1 if event.type == QUIT: terminate() # 绘制背景 DISPLAYSURF.fill((0,0,0)) DISPLAYSURF.blit(background, (0,0)) # 更新所有精灵 for entity in all_sprites: DISPLAYSURF.blit(entity.image, entity.rect) entity.move() # 碰撞检测与重置 if pygame.sprite.spritecollideany(P1, enemies): showTextScreen('Game Over') # 重置游戏状态 SPEED = 5 E1.reset_pos() P1.rect.center = (260, 480) pygame.time.delay(500) pygame.display.flip() FramePerSec.tick(FPS)
内容的提问来源于stack exchange,提问作者beginnerPython
相关产品推荐
相关产品推荐

