Seite 1 von 1

[Pygame] Gamepad als Input nutzen

Verfasst: Sonntag 9. Juli 2023, 22:42
von Patsche
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 !

Re: [Pygame] Gamepad als Input nutzen

Verfasst: Sonntag 9. Juli 2023, 23:05
von grubenfox
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...)

Re: [Pygame] Gamepad als Input nutzen

Verfasst: Montag 10. Juli 2023, 03:23
von snafu
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 (...)

Re: [Pygame] Gamepad als Input nutzen

Verfasst: Montag 10. Juli 2023, 08:22
von Patsche
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?

Re: [Pygame] Gamepad als Input nutzen

Verfasst: Montag 10. Juli 2023, 09:02
von grubenfox
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

Re: [Pygame] Gamepad als Input nutzen

Verfasst: Montag 10. Juli 2023, 09:04
von __blackjack__
@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

Re: [Pygame] Gamepad als Input nutzen

Verfasst: Montag 10. Juli 2023, 09:51
von Patsche
__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.