Python Kivy游戏开发:如何实现多按键同时触发?
解决Kivy中WASD多按键同时触发移动的问题
你的问题根源在于没有跟踪当前按住的所有按键状态,而是每次按键按下时只单独处理一次移动,而且那个keycode[1] == 'w' and keycode[1] == 'd'的判断完全无效——一个变量不可能同时等于两个不同的值。
正确的做法是维护一个集合来记录当前处于按下状态的按键,然后在每帧的更新逻辑里,根据集合中的所有按键来计算角色的移动方向。
修改后的代码如下:
from kivy.uix.relativelayout import RelativeLayout from kivy.graphics import Color, Ellipse from kivy.core.window import Window from kivy.clock import Clock from kivy.metrics import dp class MainScreen(RelativeLayout): def __init__(self, **kwargs): super().__init__(**kwargs) self.guy_size = dp(50) self.velocity = 3 self.acceleration = 0.5 with self.canvas: Color(1, 0, 0) self.guy = Ellipse(pos=(100, 400), size=(self.guy_size, self.guy_size)) self._keyboard = Window.request_keyboard(self.keyboard_closed, self) self._keyboard.bind(on_key_down=self.on_keyboard_down) self._keyboard.bind(on_key_up=self.on_keyboard_up) # 新增:用于跟踪当前按住的按键 self.pressed_keys = set() Clock.schedule_interval(self.move_guy, 1/60) def keyboard_closed(self): self._keyboard.unbind(on_key_down=self.on_keyboard_down) self._keyboard.unbind(on_key_up=self.on_keyboard_up) self._keyboard = None def on_keyboard_down(self, keyboard, keycode, text, modifiers): # 将按下的按键加入集合 self.pressed_keys.add(keycode[1]) return True def on_keyboard_up(self, keyboard, keycode): # 松开按键时从集合移除 if keycode[1] in self.pressed_keys: self.pressed_keys.remove(keycode[1]) def move_guy(self, dt): x, y = self.guy.pos move_speed = 5 # 可以换成self.velocity相关的计算 # 根据当前所有按住的按键计算移动 if 'w' in self.pressed_keys: y += move_speed if 's' in self.pressed_keys: y -= move_speed if 'a' in self.pressed_keys: x -= move_speed if 'd' in self.pressed_keys: x += move_speed self.guy.pos = (x, y)
关键修改点说明:
- 新增
self.pressed_keys集合,用来存储当前所有处于按下状态的按键 on_keyboard_down不再直接调用移动逻辑,而是把按键加入集合;on_keyboard_up负责移除按键move_guy改为每帧检查集合中的所有按键,同时处理多个方向的移动- 移除了无效的多按键判断逻辑,以及原来的
partial传参,因为现在不需要每次传方向参数
这样修改后,同时按住W和D时,角色会向右上方斜向移动,完全支持多按键同时触发的需求。
内容的提问来源于stack exchange,提问作者Joel Mentz
相关产品推荐
相关产品推荐

