[Pygame] Gamepad als Input nutzen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Benutzeravatar
Patsche
User
Beiträge: 43
Registriert: Samstag 23. Oktober 2021, 00:17

Hi!

Ich bekomme es einfach nicht hin, dass Controllereingaben erkannt werden.
Hier mal ein paar Code-Schnipsel:

Code: Alles auswählen

# initialisieren von pygame
pygame.init()
print(pygame.joystick.get_init())
print(pygame.joystick.get_count())
Also Joystick wird erkannt (True).
Anzahl: 1

Jetzt versuche ich die Eingabe so abzufangen:

Code: Alles auswählen

# Schleife Hauptprogramm
while spielaktiv:
    
    # Überprüfen, ob Nutzer eine Aktion durchgeführt hat
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            spielaktiv = False
            print("Spieler hat Quit-Button angeklickt")
            
        # zum Starten der Spielerbewegung (Abfrage:GamePad)    
        if event.type == pygame.JOYBUTTONDOWN:
            print("Gamepadtaste gedrückt")
            if  event.button == 3:
                print("Spieler 1 hat Gamepad Y gedrückt")
                spielfigur_1_bewegung = -6
            elif  event.button == 0:
                print("Spieler 1 hat Gamepad A gedrückt")
                spielfigur_1_bewegung = 6
                
            
        # zum Starten der Spielerbewegung (Abfrage: TASTE-DOWN)
        if event.type == pygame.KEYDOWN:
            print("Spieler hat Taste gedrückt")

            if event.key == pygame.K_ESCAPE:
                spielaktiv = False
                print("Spieler hat das Spiel mit ESC beendet")

            # Taste für Spieler 1
            if event.key == pygame.K_w:
                print("Spieler 1 hat w gedrückt")
                spielfigur_1_bewegung = -6
            elif event.key == pygame.K_s:
                print("Spieler 1 hat s gedrückt")
                spielfigur_1_bewegung = 6
Die Tastatureingaben werden erkannt, aber die Gamepad eingabe nicht. Mache ich das falsch?
Kann mir jemand helfen?
Vielen Dank im vorraus !
Benutzeravatar
grubenfox
User
Beiträge: 432
Registriert: Freitag 2. Dezember 2022, 15:49

Was steht den drin in 'event.type' und 'event.button' wenn man auf dem GamePad rumtippt? Wenn es offenbar nicht JOYBUTTONDOWN bzw. 3 oder 0 ist, muss da ja was anderes drinstehen....

Code: Alles auswählen

print(str(event.type))
print(str(event.button))
(ich bin nicht sicher ob das 'str()' nicht überflüssig ist, aber vorsichtshalber...)
Benutzeravatar
snafu
User
Beiträge: 6742
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

grubenfox hat geschrieben: Sonntag 9. Juli 2023, 23:05 (ich bin nicht sicher ob das 'str()' nicht überflüssig ist, aber vorsichtshalber...)
Ja, ist es. str() wird bei print() immer implizit aufgerufen.

Beispiel:

Code: Alles auswählen

class Test:
    def __str__(self):
        return "Dies ist ein Test"

print(Test())
Auch nachlesbar in der Doku zu print() im zweiten Absatz:
All non-keyword arguments are converted to strings like str() does (...)
Benutzeravatar
Patsche
User
Beiträge: 43
Registriert: Samstag 23. Oktober 2021, 00:17

Danke erstmal für die Hilfestellung!
grubenfox hat geschrieben: Sonntag 9. Juli 2023, 23:05 Was steht den drin in 'event.type' und 'event.button' wenn man auf dem GamePad rumtippt? Wenn es offenbar nicht JOYBUTTONDOWN bzw. 3 oder 0 ist, muss da ja was anderes drinstehen....
Es steht leider absolut gar nichts drin, deswegen verstehe ich das nicht.....


Edit:
Habe hier etwas gefunden:
https://python-forum.io/thread-36380.html

Wenn ich meinen Code am Anfang so abändere, wird die Eingabe erkannt:

Code: Alles auswählen

# initialisieren von pygame
pygame.init()
print(pygame.joystick.get_init())
print(pygame.joystick.get_count())
joystick_0 = pygame.joystick.Joystick (0)
joystick_0 .init()
Scheinbar muss das Gamepad noch dem Joystick 0 zugewiesen und initalisiert werden?
Sollte das nicht schon von dem einfachen

Code: Alles auswählen

pygame.init()
gemacht werden?
Benutzeravatar
grubenfox
User
Beiträge: 432
Registriert: Freitag 2. Dezember 2022, 15:49

Patsche hat geschrieben: Montag 10. Juli 2023, 08:22 Danke erstmal für die Hilfestellung!
grubenfox hat geschrieben: Sonntag 9. Juli 2023, 23:05 Was steht den drin in 'event.type' und 'event.button' wenn man auf dem GamePad rumtippt? Wenn es offenbar nicht JOYBUTTONDOWN bzw. 3 oder 0 ist, muss da ja was anderes drinstehen....
Es steht leider absolut gar nichts drin, deswegen verstehe ich das nicht.....
Damit bin ich dann raus... habe zwar Pygame installiert, mangels Joystick kann ich hier aber nichts reproduzieren.
Die Initialisierung ist wohl notwendig: https://www.pygame.org/docs/ref/joystick.html
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Patsche: Du zeigst da etwas nicht, was aber notwendig ist. Hier ist die Dokumentation zum `joystick`-Modul: https://www.pygame.org/docs/ref/joystick.html
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Patsche
User
Beiträge: 43
Registriert: Samstag 23. Oktober 2021, 00:17

__blackjack__ hat geschrieben: Montag 10. Juli 2023, 09:04 @Patsche: Du zeigst da etwas nicht, was aber notwendig ist. Hier ist die Dokumentation zum `joystick`-Modul: https://www.pygame.org/docs/ref/joystick.html
Die Doku habe ich gelesen. Ich glaube ich habe im Startpost alles, was nötig ist, erwähnt,
Habe den Fehler ja auch schon gefunden.

Es fehlten die Zeilen:

Code: Alles auswählen

joystick_0 = pygame.joystick.Joystick (0)
joystick_0 .init()
Ich hatte nur gedacht, dass wird automatisch mit

Code: Alles auswählen

pygame.init()
gemacht.

-----------

So sieht jetzt der Anfang aus:

Code: Alles auswählen

# Importieren der Pygame-Bibliothek
import pygame, sys, os

# initialisieren von pygame
pygame.init()

# Gamepaderkennung
print(pygame.joystick.get_init())
print(pygame.joystick.get_count())
joystick_0 = pygame.joystick.Joystick (0)
joystick_0 .init()
print("Gamepad erkannt")
Und so die Eventabfrage:

Code: Alles auswählen

#Gamepad Buttonabfrage gedrückt        
        if event.type == pygame.JOYBUTTONDOWN:
            print("Joysticktaste gedrückt")
            if  event.button == 3:
                print("Spieler 1 hat Gamepad Y gedrückt")
                spielfigur_1_bewegung = -6
            elif  event.button == 0:
                print("Spieler 1 hat Gamepad A gedrückt")
                spielfigur_1_bewegung = 6
            elif  event.button == 7:
                print("Spieler 1 hat Gamepad START gedrückt")
                spielaktiv = False
                
        #Gamepad Buttonabfrage losgelassen        
        if event.type == pygame.JOYBUTTONUP:
            print("Joysticktaste gedrückt")
            if  event.button == 3:
                print("Spieler 1 hat Gamepad Y losgelassen")
                spielfigur_1_bewegung = 0
            elif  event.button == 0:
                print("Spieler 1 hat Gamepad A losgelassen")
                spielfigur_1_bewegung = 0
Funktioniert wunderbar.
Spieler 1 kann jetzt mittel Gamepad (Button"Y"/Button"A") in der Y-Achse bewegt werden.

----------

Ich hatte auch testweise mal den linken Stick genutzt.
Hier ist der Code dafür:

Code: Alles auswählen

#Gamepad STICK-Abfrage          
        if event.type == pygame.JOYAXISMOTION:
            print("L-STICK gedrückt")
            print(joystick_0.get_axis(0))
            if  joystick_0.get_axis(0) >= 0.1:
                print("Spieler 1 hat Gamepad LSTICK hoch bewegt")
                spielfigur_1_bewegung = -6
            elif  joystick_0.get_axis(0) <= -0.1:
                print("Spieler 1 hat Gamepad LSTICK runter bewegt")
                spielfigur_1_bewegung = 6
            elif  joystick_0.get_axis(0) <= 0.09 or joystick_0.get_axis(0) >= -0.09:
                print("Spieler 1 hat Gamepad LSTICK NICHT bewegt")
                spielfigur_1_bewegung = 0
Da habe ich aber das Problem, dass das ganze Spiel anfängt zu ruckeln.....so macht das kein Spaß.
Vielleicht hat da noch jemand einen Tipp?
Hatte auch mal mit den Werten gespielt, um die "Empfindlichkeit" einzustellen, aber die ständige Abfrage benötigt scheinbar zu viel Rechenleistung.
Antworten