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

基于Kivy开发赛车游戏:无法添加键盘事件的技术求助

Kivy赛车游戏添加键盘控制解决方案

问题描述

已基于Kivy完成赛车游戏的道路、汽车绘制及鼠标按钮控制(移动+调速),但无法添加键盘事件控制汽车。

解决方案

在Kivy中实现键盘控制需通过请求键盘输入并绑定按键事件处理函数,同时确保布局能获取焦点以接收键盘事件。以下是修改后的代码:

修改后的main.py代码

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.graphics import Rectangle
from kivy.core.window import Window
from kivy.metrics import dp
from kivy.lang import Builder

class CarGame(FloatLayout):
    
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.speed_factor = 10
        screen_height = Window.size[1]
        with self.canvas.after:
            self.car = Rectangle(source='READYGOredcar.png', size=[58, 104], pos=[10, (screen_height / 2) - 50])
        
        # 请求键盘并绑定事件
        self._keyboard = Window.request_keyboard(self._keyboard_closed, self)
        self._keyboard.bind(on_key_down=self._on_key_down)
        # 确保布局获取焦点以接收键盘事件
        self.focus = True

    def _keyboard_closed(self):
        # 键盘关闭时解绑事件
        self._keyboard.unbind(on_key_down=self._on_key_down)
        self._keyboard = None

    def _on_key_down(self, keyboard, keycode, text, modifiers):
        # 处理按键按下事件
        key = keycode[1]
        # 方向键+WASD控制移动
        if key == 'left' or key == 'a':
            self.go_left()
        elif key == 'right' or key == 'd':
            self.go_right()
        elif key == 'up' or key == 'w':
            self.go_up()
        elif key == 'down' or key == 's':
            self.go_down()
        # +/-键控制速度
        elif key == 'plus' or key == 'equal':
            self.speed_up()
        elif key == 'minus':
            self.speed_down()
        # 返回True表示已处理该事件
        return True

    def go_left(self):
        x, y = self.car.pos
        if x > 0:
            x -= dp(self.speed_factor)
            self.car.pos = [x, y]

    def go_right(self):
        x, y = self.car.pos
        screen_width = Window.size[0]
        car_width = self.car.size[0]
        if x < screen_width - car_width:
            x += dp(self.speed_factor)
            self.car.pos = [x, y]

    def go_up(self):
        x, y = self.car.pos
        screen_height = Window.size[1]
        if y < screen_height * 0.65:
            y += dp(self.speed_factor)
            self.car.pos = [x, y]

    def go_down(self):
        x, y = self.car.pos
        screen_height = Window.size[1]
        if y > screen_height * 0.18:
            y -= dp(self.speed_factor)
            self.car.pos = [x, y]

    def speed_up(self):
        if self.speed_factor < 100:
            self.speed_factor += 5

    def speed_down(self):
        if self.speed_factor > 5:
            self.speed_factor -= 5


class MainApp(App):
    def build(self):
        return Builder.load_file('main.kv')

if __name__ == "__main__":
    MainApp().run()

main.kv代码(可选添加焦点设置)

<CtrlBtn@Button>
    size_hint: [None, None]
    size: ['35dp', '35dp']

CarGame:
    focus: True  # 可选,确保布局默认获取焦点
    Image:
        source: 'rszd-newroad.jpg'
        allow_stretch: False
        keep_ratio: True

    CtrlBtn:
        text: "L"
        pos_hint: {'x': 0.05, 'y': 0.03}
        on_press: root.go_left()

    CtrlBtn:
        text: "R"
        pos_hint: {'x': 0.15, 'y': 0.03}
        on_press: root.go_right()

    CtrlBtn:
        text: "U"
        pos_hint: {'x': 0.25, 'y': 0.03}
        on_press: root.go_up()

    CtrlBtn:
        text: "D"
        pos_hint: {'x': 0.35, 'y': 0.03}
        on_press: root.go_down()

    CtrlBtn:
        text: "Speed Up"
        size: ['100dp', '20dp']
        pos_hint: {'x': 0.85, 'y': 0.01}
        on_press: root.speed_up()

    CtrlBtn:
        text: "Speed Down"
        size: ['100dp', '20dp']
        pos_hint: {'x': 0.85, 'y': 0.05}
        on_press: root.speed_down()

关键说明

  1. 键盘事件绑定:通过Window.request_keyboard获取键盘实例,绑定on_key_down事件处理函数捕获按键输入。
  2. 多按键支持:同时适配方向键和WASD键控制移动,+/-键控制速度,覆盖不同操作习惯。
  3. 焦点处理:设置focus = True确保布局能接收键盘事件,避免按键无响应。
  4. 资源清理:实现_keyboard_closed方法,在键盘关闭时解绑事件,防止内存泄漏。

内容的提问来源于stack exchange,提问作者Ronaldo Ribeiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:20:17