下面是一个 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()
|