[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 编码查看转换 | 代码下载 | 常见问题及讨论 | Python游戏编程讨论 | 《深入解析ASP核心技术》 | Python游戏编程教程 | HEIC转JPG工具
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]手柄Pygame SDL2 Controller API 测试程序

上一篇:[备忘]SDL 的 GameController mapping database
下一篇:[备忘]看近处到底需要戴眼镜不?

添加日期:2026/8/9 7:28:53 快速返回   返回列表 阅读109次
下面是一个 Pygame SDL2 Controller API 测试程序,功能:

显示:
GUID
名称
控制器数量

测试:
A/B/X/Y
LB/RB
Start/Back
摇杆轴
LT/RT
十字方向键(D-pad)

注意:

需要 pygame 2.x
需要 SDL2 controller 支持
不同 Pygame 编译版本可能没有 _sdl2.controller


import pygame
from pygame._sdl2 import controller


pygame.init()

screen = pygame.display.set_mode((900, 600))
pygame.display.set_caption("SDL2 Controller Test")

font = pygame.font.SysFont(None, 28)

clock = pygame.time.Clock()

# 初始化 controller
controller.init()

controllers = []

for i in range(controller.get_count()):
    c = controller.Controller(i)
    controllers.append(c)


print(
    "Controller count:", len(controllers))


# 当前控制器
ctrl = controllers[0] if controllers else None

joystick = pygame.joystick.Joystick(0)
joystick.init()


def text(surface, msg, x, y):
    img = font.render(msg, True, (255, 255, 255))
    surface.blit(img, (x, y))


running = True

while running:

    screen.fill((20, 20, 20))


    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False


        # -----------------------
        # 按钮按下
        # -----------------------
        if event.type == pygame.CONTROLLERBUTTONDOWN:

            print(
                "BUTTON DOWN:",
                event.button
            )
            if event.button==pygame.CONTROLLER_BUTTON_A:
                print(
                    "press A")
            if event.button==pygame.CONTROLLER_BUTTON_B:
                print(
                    "press B")
            if event.button==pygame.CONTROLLER_BUTTON_LEFTSHOULDER:
                print(
                    "press LB")
            if event.button==pygame.CONTROLLER_BUTTON_RIGHTSHOULDER:
                print(
                    "press RB")

        if event.type == pygame.JOYBUTTONDOWN:
            print(
                "JOY BUTTON DOWN:",
                event.button
            )
            if event.button == 0:
                print(
                    "joy press A")
            if event.button == 1:
                print(
                    "joy press B")
            if event.button == 4:
                print(
                    "joy press LB")
            if event.button == 5:
                print(
                    "joy press RB")
        if event.type == pygame.CONTROLLERBUTTONUP:

            print(
                "BUTTON UP:",
                event.button
            )


        # -----------------------
        # 摇杆轴
        # -----------------------
        if event.type == pygame.CONTROLLERAXISMOTION:

            print(
                "AXIS:",
                event.axis,
                event.value
            )


        # -----------------------
        # 设备连接
        # -----------------------
        if event.type == pygame.CONTROLLERDEVICEADDED:

            print(
                "Controller added:",
                event.device_index
            )


        if event.type == pygame.CONTROLLERDEVICEREMOVED:

            print(
                "Controller removed:",
                event.instance_id
            )


    y = 20


    if ctrl:

        text(
            screen,
            "Name: " + ctrl.name,
            20,
            y
        )

        y += 35


        text(
            screen,
            "GUID: " + joystick.get_guid(),
            20,
            y
        )

        y += 35


        text(
            screen,
            "Attached: " + str(ctrl.attached()),
            20,
            y
        )

        y += 50


        # -----------------------
        # 读取按钮状态
        # -----------------------

        buttons = [
            (
                "A",
             pygame.CONTROLLER_BUTTON_A),

            (
                "B",
             pygame.CONTROLLER_BUTTON_B),

            (
                "X",
             pygame.CONTROLLER_BUTTON_X),

            (
                "Y",
             pygame.CONTROLLER_BUTTON_Y),

            (
                "LB",
             pygame.CONTROLLER_BUTTON_LEFTSHOULDER),

            (
                "RB",
             pygame.CONTROLLER_BUTTON_RIGHTSHOULDER),

            (
                "BACK",
             pygame.CONTROLLER_BUTTON_BACK),

            (
                "START",
             pygame.CONTROLLER_BUTTON_START),

            (
                "DPAD UP",
             pygame.CONTROLLER_BUTTON_DPAD_UP),

            (
                "DPAD DOWN",
             pygame.CONTROLLER_BUTTON_DPAD_DOWN),

            (
                "DPAD LEFT",
             pygame.CONTROLLER_BUTTON_DPAD_LEFT),

            (
                "DPAD RIGHT",
             pygame.CONTROLLER_BUTTON_DPAD_RIGHT),
        ]


        text(
            screen,
            "Buttons:",
            20,
            y
        )

        y += 35


        for name, button in buttons:

            state = ctrl.get_button(button)

            text(
                screen,
                f"{name}: {state}",
                40,
                y
            )

            y += 25



        # -----------------------
        # Axis
        # -----------------------

        x = 450
        y = 120


        text(
            screen,
            "Axes:",
            x,
            y
        )

        y += 35


        axes = [

            (
                "LEFT X",
             pygame.CONTROLLER_AXIS_LEFTX),

            (
                "LEFT Y",
             pygame.CONTROLLER_AXIS_LEFTY),

            (
                "RIGHT X",
             pygame.CONTROLLER_AXIS_RIGHTX),

            (
                "RIGHT Y",
             pygame.CONTROLLER_AXIS_RIGHTY),

            (
                "LT",
             pygame.CONTROLLER_AXIS_TRIGGERLEFT),

            (
                "RT",
             pygame.CONTROLLER_AXIS_TRIGGERRIGHT),
        ]


        for name, axis in axes:

            value = ctrl.get_axis(axis)

            text(
                screen,
                f"{name}: {value}",
                x,
                y
            )

            y += 30



    else:

        text(
            screen,
            "No controller detected",
            20,
            20
        )


    pygame.display.flip()

    clock.tick(60)


pygame.quit()

 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved