You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:15:36