SDL und Joystick
-
Ich glaube du lernst besser erstmal C/C++.
Bye, TGGC \-/
-
Herzlichen Dank, das hilft mir ungemein weiter!
Da Du ja offensichtlich hier der Experte bist, sollte es Dir ja nicht schwerfallen, einem Anfänger nach einem kurzen Blick auf den Code auf seine überaus offensichtlichen Fehler hinweisen zu können...
Spaß beiseite, daß das hier nicht läuft, habe ich auch schon gemerkt, aber das hilft mir z.Zt. nicht weiter. Ich will ja auch nichts großartiges programmieren, sondern "nur" den Joystick abfragen... Sollte mit etwas Hilfe wohl möglich sein, finde ich!
-
void SDL_JoystickUpdate(void);
sollte so aussehen
SDL_JoystickUpdate();
zum joystick http://sdldoc.csn.ul.ie/guideinput.php#AEN163 hier steht so ziemlich alles
ps: du solltest auch irgendwo deine nachrichten schleife verlassen zb: keydown = esc
-
Hallo,
danke für die Tips.
Stimmt, da hatte ich wohl die Funktionsdeklaration kopiert und nicht bearbeitet.
Leider bleibt das Problem. Ich werde aber die Hilfeseite mal genauer konsultieren; dummerweise habe ich genau von da einen Teil des Codes kopiert. Der Zeiger auf meinen Joystick ist ja auch gültig und belegt und ich bekomme den Joysticknamen; ich bekomme mit dem Zeiger aber keine Daten ausgelesen...
Habe mich schon gefragt, ob der Joystick (Baujahr 1988, klappt aber noch) bzw. die Anbindung des Joysticks an DirectX vielleicht nicht funktionieren; unter dem Win2000-Eingabegeräte-Test klappt jedoch alles bestens und der Joystick liefert Werte...
-
hat moveX und moveY einen wert ?
-
Hallo miller_m,
da genau liegt das Problem: eben nicht! moveX und moveY werden nicht belegt! Daraus folgt wohl, daß der Aufruf SDL_JoystickGetAxis() kein Ergebnis liefert. Da ich davon ausgehe, daß die Funktion korrekt arbeitet, müßte entweder der joystick-Zeiger oder die Achse (0 oder 1) falsch sein - aber wieso sollte da was verkehrt sein?
Während der Aufruf
printf("%s\n", SDL_JoystickName(i));
noch ein Ergbebnis liefert ("The names of the joysticks are: 2-Achsen 2-Button-Joystick" wird ausgegeben), liefern die nächsten Zeilen
printf("\nAxen: ", SDL_JoystickNumAxes(joystick)); printf("\nTrackballs: ", SDL_JoystickNumBalls(joystick)); printf("\nButtons: ", SDL_JoystickNumButtons(joystick));
nur die folgende Ausgabe:
"Axen:
Trackballs:
Buttons:"Also ist der Zeiger an der Stelle schon unbrauchbar - aber warum? Ist doch alles nach Lehrbuch, soweit ich das überblicken kann...
Gruß & Danke für Eure Mühe,
Tobias
-
probier mal das
SDL_Joystick *joy; if(SDL_NumJoysticks()>0) { joy=SDL_JoystickOpen(0); if(joy) { printf("Opened Joystick 0\n"); printf("Name: %s\n", SDL_JoystickName(0)); printf("Number of Axes: %d\n", SDL_JoystickNumAxes(joy)); printf("Number of Buttons: %d\n", SDL_JoystickNumButtons(joy)); printf("Number of Balls: %d\n", SDL_JoystickNumBalls(joy)); } else printf("Couldn't open Joystick 0\n"); if(SDL_JoystickOpened(0)) SDL_JoystickClose(joy); }
-
Hallo, miller_m
also, Dein Codebeispiel liefert mir tatsächlich die Joystickeigenschaften zurück - wieso macht mein Code das eigentlich nicht? Bis auf die (immer erfüllten?) if-Abfragen ist doch kein Unterschied...
Naja, ich habe den Code etwas erweitert, um nun eeeendlich meine Joystickausschläge zu bekommen - NIX. Es kommt immer Null raus, egal wie ich am Joystick drücke und ziehe. Oder ist der Datentyp Sint16 nicht als int ausdruckbar...?
Hier der Code:
//SDL starten SDL_Init(SDL_INIT_JOYSTICK); //Joystick rein SDL_Joystick *joy; if(SDL_NumJoysticks()>0){ joy=SDL_JoystickOpen(0); if(joy) { printf("Opened Joystick 0\n"); printf("Name: %s\n", SDL_JoystickName(0)); printf("Number of Axes: %d\n", SDL_JoystickNumAxes(joy)); printf("Number of Buttons: %d\n", SDL_JoystickNumButtons(joy)); printf("Number of Balls: %d\n", SDL_JoystickNumBalls(joy)); printf("xAxis: %i\n", SDL_JoystickGetAxis(joy, 0)); printf("yAxis: %i\n", SDL_JoystickGetAxis(joy, 1)); } else printf("Couldn't open Joystick 0\n"); if(SDL_JoystickOpened(0)) SDL_JoystickClose(joy); } //SDL beenden printf("Quiting SDL.\n"); SDL_Quit(); printf("Quiting....\n"); return 0;
und hier das Ergebnis:
Opened Joystick 0 Name: 2-Achsen, 2-Tasten-Joystick Number of Axes: 2 Number of Buttons: 2 Number of Balls: 0 xAxis: 0 yAxis: 0 Quiting SDL. Quiting.... Press any key to continue
-
und jetzt weitermachen
SDL_Event event; SDL_Joystick *joy; SDL_JoystickEventState(SDL_ENABLE); joy = SDL_JoystickOpen(0); while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_KEYDOWN: if(event.key.keysym.sym == SDLK_ESCAPE) SDL_Quit(); break; case SDL_JOYAXISMOTION: if ( ( event.jaxis.value < -3200 ) || (event.jaxis.value > 3200 ) ) { if( event.jaxis.axis == 0) { printf("left/right: %d\n", event.jaxis.value); } if( event.jaxis.axis == 1) { printf("up/down: %d\n", event.jaxis.value); } } break; case SDL_JOYBUTTONDOWN: if ( event.jbutton.button == 0 ) { printf("joy btn 0 down\n"); } break; case SDL_JOYBUTTONUP: if ( event.jbutton.button == 0 ) { printf("joy btn 0 up\n"); } break; case SDL_QUIT: if(SDL_JoystickOpened(0)) SDL_JoystickClose(joy); break; } }
tronaccount schrieb:
Oder ist der Datentyp Sint16 nicht als int ausdruckbar...?
er ist als int ausdruckbar.
siehe sdl_types.htypedef signed short Sint16;
-
Hallo,
super, et läuft!
Habe das Ganze auch irgendwie mit GetAxis ans Laufen gebracht; ich wollte auf die Ereignissteuerung verzichten, weil die vom übergeordneten Programm aus erfolgt!
Herzlichen Dank an miller_m; super, daß es Leute gibt, die sich die Zeit nehmen...
Gruß,
Tobias