Controller-Fix: Joystick-Objekte wurden nach dem Namens-Auslesen freigegeben, dadurch lieferte SDL keine Events mehr. Jetzt offen halten + Hotplug. Neu: tools/controller_check.py zur Diagnose, Tests fuer Tastenbelegung (62).

This commit is contained in:
Project Bridge committed 2026-11-01 13:10:43 +00:00
1 parent a088c23a09
commit 5237b0a39c
7 files changed
+343 -17

No files matched your search

+137
View File
@@ -0,0 +1,137 @@
#!/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())