Pygame开发求助:游戏角色无法移动问题
解决你的Pygame角色无法移动问题
别担心,新手遇到这种问题太正常了,咱们一步步拆解问题、搞定它:
问题1:角色位置被循环强制重置
你把manX、manY这些角色位置变量的定义放在了游戏循环内部,这意味着每次循环执行时,这些变量都会被重新赋值为初始值(220,520)——哪怕你通过按键移动了位置,下一次循环直接就给你打回原点了。
修复方法:把角色属性的定义移到游戏循环外面,也就是while not game_over:之前:
# 把这些放到游戏循环上方! manR = 80 manX = 220 manY = 520 manSpeed = 30
问题2:键盘事件判断不在事件循环内
你的按键处理代码if event.type == pygame.KEYDOWN:写在了for event in pygame.event.get()循环的外面,这时候event已经是事件列表里的最后一个事件了,大概率不是KEYDOWN事件,自然不会触发移动逻辑。
修复方法:把按键判断逻辑完整放进事件循环里面:
while not game_over: for event in pygame.event.get(): if event.type == QUIT: game_over = True # 把按键判断移到这里! if event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: manX += manSpeed if event.key == pygame.K_LEFT: manX -= manSpeed
额外优化:避免重复加载背景图
你每次循环都重新加载并缩放背景图,这会严重拖慢游戏运行效率,应该把背景图的加载和缩放操作放到游戏循环外面:
# 游戏设置阶段,循环外完成背景图处理 backgroundIMG = pygame.image.load('crossyRoadBG.png') backgroundIMG = pygame.transform.scale(backgroundIMG, (game_window_width, game_window_height)) # 游戏循环内只做绘制操作 while not game_over: # ...其他代码 game_window.blit(backgroundIMG, (0, 0))
修复后的完整代码
# pygame import import pygame from pygame import * pygame.init() # game window game_window_width = 800 game_window_height = 600 # colour red = 255, 0, 0 orange = 255, 128, 0 yellow = 255, 255, 0 green = 0, 255, 0 darkGreen = 0, 128, 0 blue = 0, 0, 255 darkBlue = 0, 0, 128 purple = 200, 0, 255 pink = 255, 60, 203 white = 255, 255, 255 black = 0, 0, 0 grey = 128, 128, 128 brown = 100, 80, 30 color = 0 # game setup game_window = display.set_mode((game_window_width, game_window_height)) display.set_caption('gameTemplate') print('outside game loop') clock = pygame.time.Clock() game_over = False # 角色属性移到循环外 manR = 80 manX = 220 manY = 520 manSpeed = 30 # 背景图加载移到循环外 backgroundIMG = pygame.image.load('crossyRoadBG.png') backgroundIMG = pygame.transform.scale(backgroundIMG, (game_window_width, game_window_height)) # game loop while not game_over: for event in pygame.event.get(): if event.type == QUIT: game_over = True # 按键处理放在事件循环内 if event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: manX += manSpeed if event.key == pygame.K_LEFT: manX -= manSpeed print('inside game loop') # 绘制背景 game_window.blit(backgroundIMG, (0, 0)) # 绘制角色 draw.rect(game_window, brown, (manX, manY, manR, manR)) # 控制帧率 clock.tick(30) # 更新画面 display.update() # game exit pygame.quit()
现在运行修改后的代码,你的角色应该就能正常左右移动啦!
内容的提问来源于stack exchange,提问作者flinnzos
相关产品推荐
相关产品推荐

