#!/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())