Inputprobleme mit dem Joystick

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
bird_of_prey
User
Beiträge: 5
Registriert: Montag 3. September 2012, 17:59
Wohnort: Wien

Hallo zusammen!

Ich bin gerade frisch in das Thema Pyhton eingestiegen, da ich es für ein HTL-Maturaprojekt benötige.
So nun aber zu meinem Problem.... :|
Ich hab mir einen Joystick ausgeliehen & wollte mich gleich langsam herantasten.
Die einfachen Dinge haben eigentlich sofort funktioniert (Joystick wurde erkannt, Anzahl der Achsen abfragen, etc.).
Nur mit dem Auslesen der Achsenposition haut es nicht recht gut hin....
Ich hab es mit Joystick.get_axis probiert (von http://www.pygame.org/docs/ref/joystick.html)
Da bekomme ich ständig eine 0 zurück.
Gibt es vllt. andere Wege die Position abzufragen bzw. was hab ich falsch gemacht?

Herzliche Grüße,
bird_of_prey :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo und Willkommen im Forum!
bird_of_prey hat geschrieben: Gibt es vllt. andere Wege die Position abzufragen bzw. was hab ich falsch gemacht?
Ja, Du hast uns keinen Quellcode gepostet :-P Ohne Code können wir wenig dazu sagen - es kann ja an allem möglichen liegen...

Also: Poste doch mal fix ein minimales lauffähiges Beispiel! :-)

(Wir haben spezielle Python-Code-Tags dafür!)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
bird_of_prey
User
Beiträge: 5
Registriert: Montag 3. September 2012, 17:59
Wohnort: Wien

So schaut der lauffähige Teil aus:

Code: Alles auswählen

import pygame
pygame.init()
j = pygame.joystick.Joystick(0)
print("",j)
j.init()
print("initialisiert:",bool(j.get_init()))
print("Mein Joystick heißt:",j.get_name(),"")
Wie schon gesagt, ich habs langsam angegangen^^

Danach hab ich eben versucht über eine Endlosschleife die Position auszulesen (sicher die denkbar schlechteste Methode :/)

Code: Alles auswählen

while 1:
print ("Position", j.get_axis(1))
Mfg,
bird_of_prey
deets

Das kann nicht gehen, da auch joysticks (so wie die Tastatur) events brauchen, um abgefragt zu werden. Und darum musst du sowas wie zB pygame.event.get() in deine Schleife mit aufnehmen.
bird_of_prey
User
Beiträge: 5
Registriert: Montag 3. September 2012, 17:59
Wohnort: Wien

Auf jeden Fall vielen Dank für den Tipp, Deets! :)
Ich hab das mal so umgesetzt:

Code: Alles auswählen

while True:
    e = pygame.event.wait()
    print("", e.type)
    print("", pygame.JOYAXISMOTION)
    if (e.type == pygame.JOYAXISMOTION):
        print("Eingabe von", e.dict['axis'])
    else:
        print("Keine Eingabe")
        time.sleep(1)
Es scheint recht gut zu funktionieren. Ich werde versuchen das Programm in den nächsten Tagen noch auszubauen.
Ich hätte nur noch eine Verständisfrage: Was macht eigentlich das ".type" genau?
Habt ihr noch Tipps, worauf ich bei diesen Events aufpassen soll?

Lg,
bird_of_prey
BlackJack

@bird_of_prey: Der Punktoperator wird benutzt um auf Attribute von Objekten zuzugreifen. Der linke Operand ist das Objekt und der rechte ist der Name des Attributs. Bei Deinem ``e . type` wird also das `type`-Attribut von dem Ereignisobjekt welches an `e` gebunden ist, abgefragt.
bird_of_prey
User
Beiträge: 5
Registriert: Montag 3. September 2012, 17:59
Wohnort: Wien

Klingt einleuchtend, vor allem in Kombination mit dem Codebeispiel ;) Danke Black Jack!
Wenn ich das 'e.type' mittels print auslese, waurm kommt dann eigentlich eine Ganzezahl heraus? Hat das noch eine Bedeutung?

Mfg,
bird_of_prey

P.S.: Ich weiß, dass ich ziemlich viele Fragen stelle, aber ich möchte auch verstehen was ich mache. :)
BlackJack

@bird_of_prey: Das Attribut ist halt eine Ganzzahl. Damit man das Programm nicht voll mit unverständlichen „magischen” Zahlen hat, gibt es die Konstanten die Namen auf diese Zahlen abbilden.

Zahlen für so etwas zu nehmen hat seinen Ursprung darin, dass der Rechner nur mit Zahlen arbeitet und es die Aufgabe des Menschen/Programmierers ist, diesen Zahlen eine Bedeutung zuzuweisen. In Programmiersprachen wie C — in der die Simple Directmedia Library (SDL) geschrieben ist, auf der Pygame aufbaut — definiert man verständlichere Namen für die Zahlen, die aber vom Compiler dann wieder durch die Zahlen ersetzt werden. Deshalb sieht man auch in Python die Zahlen. Wenn man das in Python schreiben würde, dann würde man wahrscheinlich eigene Datentypen oder zumindest Zeichenketten verwenden, damit ein ``print`` keine unverständliche, mehrdeutige Zahl ausgibt.
bird_of_prey
User
Beiträge: 5
Registriert: Montag 3. September 2012, 17:59
Wohnort: Wien

So eigentlich würde die ganze Sache laufen...
Nur hab ich Probleme mit meinem Joystick. Meine Achsen sind leicht verdreht & kein schönes Kreuz :?
Habt ihr vllt. Empfehlungen für einen Joystick?

Übrigens hier mein Code:

Code: Alles auswählen

import pygame
pygame.init()

import time
import serial

#ser = serial.Serial ('COM4', 9600)

pygame.display.init()
joy = pygame.joystick.Joystick(0)
joy.init()
print("Initialisierung: ",bool(joy.get_init()))

while True:
    
    e = pygame.event.wait()
    if (e.type == pygame.JOYAXISMOTION):
        axis = "unbekannt"
        if (e.dict['axis'] == 0):  
            axis = "X"
            if e.dict['value'] > 0.1:
                        #ser.write(b'w')
                        print("", e.dict['value'], e.dict['axis'])
                       
            if e.dict['value'] < 0.1:
                        #ser.write(b's')
                        print("", e.dict['value'], e.dict['axis'])
                       
            else:
                        #ser.write(b' ')
                        print("", e.dict['value'], e.dict['axis'])
                        
                        
        if (e.dict['axis'] == 1):  
            axis = "Y"  
            if e.dict['value'] < 0.1:
                        #ser.write(b'a')
                        print("", e.dict['value'], e.dict['axis'])
                      
            if e.dict['value'] > 0.1:
                        #ser.write(b'd')
                        print("", e.dict['value'], e.dict['axis'])
                        
            else:
                        #ser.write(b' ')
                        print("", e.dict['value'], e.dict['axis'])
                        
                        
    else:
        print("Keine Eingabe")
        time.sleep(1)
Liebe Grüße,
bird_of_prey
Antworten