138 lines
4.2 KiB
Python
138 lines
4.2 KiB
Python
#!/usr/bin/env python3
|
||
"""Controller-Diagnose: zeigt, was pygame vom Gamepad sieht.
|
||
|
||
Aufruf im Projektordner::
|
||
|
||
.venv/bin/python tools/controller_check.py
|
||
|
||
Drücke ein paar Tasten und bewege das D-Pad. Was hier ankommt, kommt auch im
|
||
Spiel an. Beenden mit Esc oder durch Schliessen des Fensters.
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import pathlib
|
||
import sys
|
||
|
||
sys.path.insert(0, str(pathlib.Path(__file__).resolve().parent.parent))
|
||
|
||
import pygame
|
||
|
||
from loader_game import input_map
|
||
|
||
WIDTH, HEIGHT = 1000, 520
|
||
MAX_LINES = 12
|
||
|
||
|
||
def describe(stick: pygame.joystick.Joystick) -> str:
|
||
return (
|
||
f"{stick.get_name()} · Tasten {stick.get_numbuttons()}"
|
||
f" · Achsen {stick.get_numaxes()}"
|
||
f" · Hats {stick.get_numhats()}"
|
||
)
|
||
|
||
|
||
def main() -> int:
|
||
pygame.init()
|
||
screen = pygame.display.set_mode((WIDTH, HEIGHT))
|
||
pygame.display.set_caption("Controller-Test – Esc beendet")
|
||
|
||
font = pygame.font.SysFont(None, 28)
|
||
small = pygame.font.SysFont(None, 22)
|
||
|
||
input_map.open_controllers()
|
||
names = input_map.controller_names()
|
||
print("Gefundene Controller:", names or "keiner")
|
||
for stick in input_map.opened_controllers():
|
||
print(" -", describe(stick))
|
||
print(" GUID:", stick.get_guid())
|
||
|
||
lines: list[str] = []
|
||
events_seen = 0
|
||
quiet = 0.0
|
||
clock = pygame.time.Clock()
|
||
running = True
|
||
|
||
while running:
|
||
quiet += clock.tick(60) / 1000.0
|
||
|
||
for event in pygame.event.get():
|
||
if event.type == pygame.QUIT:
|
||
running = False
|
||
break
|
||
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
|
||
running = False
|
||
break
|
||
if input_map.is_device_event(event):
|
||
input_map.open_controllers()
|
||
text = "Controller-Wechsel: " + (", ".join(input_map.controller_names()) or "keiner mehr")
|
||
lines.append(text)
|
||
print(text)
|
||
quiet = 0.0
|
||
continue
|
||
|
||
if event.type == pygame.JOYBUTTONDOWN:
|
||
events_seen += 1
|
||
quiet = 0.0
|
||
text = f"Taste {event.button} gedrückt (joy={event.joy})"
|
||
lines.append(text)
|
||
print(text)
|
||
elif event.type == pygame.JOYHATMOTION:
|
||
events_seen += 1
|
||
quiet = 0.0
|
||
text = f"D-Pad/Hat {event.hat} = {event.value} (joy={event.joy})"
|
||
lines.append(text)
|
||
print(text)
|
||
elif event.type == pygame.JOYAXISMOTION and abs(event.value) > 0.5:
|
||
events_seen += 1
|
||
quiet = 0.0
|
||
text = f"Achse {event.axis} = {event.value:+.2f} (joy={event.joy})"
|
||
lines.append(text)
|
||
print(text)
|
||
|
||
for action in input_map.actions_from_event(event):
|
||
text = f" → Spiel-Aktion: {action.name}"
|
||
lines.append(text)
|
||
print(text)
|
||
|
||
lines = lines[-MAX_LINES:]
|
||
|
||
screen.fill((20, 20, 24))
|
||
screen.blit(font.render("Controller-Test", True, (255, 255, 255)), (24, 20))
|
||
|
||
current = input_map.controller_names()
|
||
if current:
|
||
for index, text in enumerate(current):
|
||
screen.blit(small.render("✓ " + describe_short(text, input_map), True, (120, 230, 120)), (24, 64 + index * 26))
|
||
else:
|
||
screen.blit(small.render("Kein Controller gefunden.", True, (240, 120, 120)), (24, 64))
|
||
|
||
y = 140
|
||
for text in lines:
|
||
screen.blit(small.render(text, True, (220, 220, 220)), (24, y))
|
||
y += 26
|
||
|
||
if quiet > 5.0 and events_seen == 0:
|
||
hint = "Noch keine Controller-Eingabe empfangen – Taste drücken oder Kabel prüfen."
|
||
screen.blit(small.render(hint, True, (240, 200, 80)), (24, HEIGHT - 40))
|
||
|
||
screen.blit(
|
||
small.render("Esc beendet den Test.", True, (150, 150, 150)),
|
||
(24, HEIGHT - 70),
|
||
)
|
||
pygame.display.flip()
|
||
|
||
pygame.quit()
|
||
return 0
|
||
|
||
|
||
def describe_short(name: str, module) -> str:
|
||
for stick in module.opened_controllers():
|
||
if stick.get_name() == name:
|
||
return describe(stick)
|
||
return name
|
||
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|