Arcade框架开放世界游戏角色移动速度随地面类型实时切换失效问题
Arcade框架开放世界游戏角色移动速度随地面类型实时切换失效问题
嗨,我完全懂你这个糟心的问题——角色在路径和草地之间切换时,非得松开按键再按一次才会变速度,玩起来肯定很别扭!
问题根源
你现在的逻辑是在按键按下时直接把角色的change_x/change_y设成了当时的self.speed值(比如踩路径时是2),之后哪怕update函数里根据地面类型把self.speed改成了1(踩草地),已经赋值的change_x/change_y不会自动更新,直到你松开按键再重新按下,才会用新的self.speed赋值。
解决方案:分离方向记录与速度计算
核心思路是:不要在按键事件里直接设置移动速度,而是只记录当前的移动方向;然后在每次游戏循环的update阶段,根据实时的self.speed(由地面类型决定)和记录的方向,动态计算角色的移动速度。
步骤1:初始化方向变量
在__init__或setup方法里添加两个变量,用来记录当前的移动方向(取值为-1、0、1):
def setup(self): # 你的其他初始化代码... self.move_dir_x = 0 # 水平方向:-1左,0静止,1右 self.move_dir_y = 0 # 垂直方向:-1下,0静止,1上 self.speed = 1 # 默认草地速度
步骤2:修改按键事件逻辑
只更新方向变量,不再直接设置change_x/change_y:
def on_key_press(self, key, modifiers): if key == arcade.key.UP: self.move_dir_y = 1 self.player_sprite.texture = arcade.load_texture(self.texture_paths["up"]) elif key == arcade.key.DOWN: self.move_dir_y = -1 self.player_sprite.texture = arcade.load_texture(self.texture_paths["down"]) elif key == arcade.key.LEFT: self.move_dir_x = -1 self.player_sprite.texture = arcade.load_texture(self.texture_paths["left"]) elif key == arcade.key.RIGHT: self.move_dir_x = 1 self.player_sprite.texture = arcade.load_texture(self.texture_paths["right"]) def on_key_release(self, key, modifiers): # 注意你原来的代码里少了空格:应该是`or`前后加空格,避免语法错误 if key == arcade.key.UP or key == arcade.key.DOWN: self.move_dir_y = 0 if key == arcade.key.LEFT or key == arcade.key.RIGHT: self.move_dir_x = 0
步骤3:在update里动态计算移动速度
每次update先检测地面更新速度,再根据方向和实时速度计算角色的移动值:
def update(self, deltatime): # 1. 检测当前地面类型,更新速度 ways_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.scene[LAYER_NAME_WAYS]) if ways_hit_list: self.speed = 2 # 路径速度加倍 else: self.speed = 1 # 草地默认速度 # 2. 动态计算角色移动速度(关键!每次update都会刷新) self.player_sprite.change_x = self.move_dir_x * self.speed self.player_sprite.change_y = self.move_dir_y * self.speed # 你的其他update逻辑(比如相机跟随) self.center_camera_to_player()
效果说明
这样修改后,每次游戏循环的update阶段都会重新计算角色的移动速度——不管你有没有按住按键,只要角色从路径走到草地(反过来也一样),self.speed会立刻更新,角色的移动速度也会同步变化,不需要松开按键再按啦!
备注:内容来源于stack exchange,提问作者LEONARD ROUVIERE
相关产品推荐
相关产品推荐

