PyGame平台跳跃游戏实现垂直相机移动时出现屏幕持续下沉问题
问题根因
- 你没有将垂直动量
self.vermo应用到玩家自身的Y坐标更新上,仅移动了所有精灵的位置模拟相机偏移,导致碰撞检测逻辑持续判定玩家处于悬空状态,不断给self.vermo累加0.4,触发碰撞后又被重置为0,就出现了你观测到的0、0.4、0.8、1.2的循环数值。 - 玩家处于地面状态(
self.onGround == True)时,没有重置self.vermo为0,残留的正动量会错误触发下落判定。 - 相机移动逻辑在跳跃、下落分支重复编写,冗余逻辑容易带来判定冲突。
修复方案
- 先更新玩家自身的Y坐标,再处理相机偏移逻辑,保证碰撞检测的坐标正确
- 地面状态下强制重置垂直动量为0,避免残留动量干扰判定
- 合并相机移动的重复逻辑,只要玩家处于非地面状态就同步偏移所有精灵,不需要分开判断跳跃和下落
修改后的代码示例
# 垂直动量计算 if self.onGround == False: # 下落状态累加动量 self.vermo += 0.4 if self.vermo > 10: # 下落速度上限 self.vermo = 10 # 跳跃逻辑 if keys[pygame.K_SPACE] and self.onGround == True: self.vermo = -12 self.jump = True # 先更新玩家自身位置,保证碰撞检测正确 self.rect.y += self.vermo # 此处保留你原有碰撞检测逻辑即可,碰撞后会修正self.onGround、self.rect.y等值 if self.onGround == True: self.jump = False self.fall = False self.vermo = 0 # 新增:地面状态重置动量 # 下落状态判定 if self.vermo > 0 and self.collideWithBlock == False: self.fall = True # 合并后的相机移动逻辑:非地面状态就同步偏移所有精灵 if not self.onGround: for sprite in self.game.all_sprites: sprite.rect.y -= self.vermo
内容的提问来源于stack exchange,提问作者kecenr
相关产品推荐
相关产品推荐

