Analoge Joystick Steuerung in/mit/auf SDL.


LecramOS

Member
Joined
Feb 20, 2010
Messages
121
Age
39
Location
Pandora.
LOCATION
Pandora.
Hi @ Alle. :slap:

Ich habe nun einen USB Joystick an meinen PC angeschlossen, der wie der PlayStation2 Controller ist.

Wie kann ich nun auf die Achse des Analog Sticks zugreifen und diese auch wie einen Analogstick benutzen ?

Normale Steuerung nach oben, unten, links, rechts habe ich mit SDL_JOYAXISMOTION schon hin bekommen aber leider nicht nach linksOben,rechtsOben,linksUnten,rechtsUnten... Ich möchte wirklich eine Analog Steuerung haben und nicht nur diesen Standard in 4 oder 8 Ecken. Ich weiß, dass ich SDL_JOYHATMOTION für diese Bewegungen im 8 Eck nutzen kann, möchte aber wie gesagt eine Richtige Analoge Steuerung und soviel ich weiß sollte das doch irgendwie mit SDL_JOYAXISMOTION möglich sein, oder? Das problem, was ich jetzt mit "event.jaxis.axis" habe ist, dass ich ja nur eine von den beiden Achsen ansprechen kann entweder "Vertikal == 0" oder "Horizontal == 1" und beide gleichzeitig anzusprechen geht ja nicht und das ist blöd, weil ich deswegen ja auch nicht linksOben, rechtsOben, linksUnten oder rechtsUnten in die Ecken bewegen kann..........arrrrrrrggggg X-( I am going crazy with this .

Werde gleich mal alles auf JOYHATMOTION Umändern. Das soll aber nur übergangsweise so sein, denn ich möchte ja die Analogogogoge Steuerung...

Ich programmiere in/auf/mit C++ und SDL und möchte später auch die Nubs von der Pandora nutzen können und das wirklich um 360 grad nicht nur 8 Ecken.

Kann mich jemand hilfen. Help please.... someone help meeeeeeee
Over here.....Someooooneeee Heeeelp me please.... ^_^
 
http://www.libsdl.org/cgi/docwiki.cgi/Handling_Joysticks + http://www.libsdl.org/cgi/docwiki.cgi/SDL_JoystickGetAxis
Und dann gibt es keine "Ecken", sondern so ein tolles Mathematisches Konzept namens "Achsen": http://de.wikipedia.org/wiki/Kartesisches_Koordinatensystem

Guck da erstmal rein.

Ich kann dir die Bücher "Focus on SDL" und "Linux Game Programming" empfehlen. Ersteres ist eine kurze aber gute Einführung in alle wichtigen Teile von SDL und diverser SDL_* Erweiterungen. "LGP" ist umfassender und geht über eine Einführung hinaus und enthält fortgeschrittene Konzepte. Allgemein bin ich sowieso der Typ 1. Informieren (Lesen Internet/Bücher) 2. Üben (Ausprobieren). 3. Anwenden
 
Die ersten beiden Seiten von SDL habe ich schon geguckt gehabt, weil du mir ja schon oft bei deinen Antworten auch einen link mitgeschickt hattest, der mich zu dieser Seite "SDL" gebracht hat.
:)

Ich habe auch schon nach SDL_Bücher geguckt, bei Amazone und so, kein Deutsches dabei nur englisch. Das Buch was du mir vorgeschlagen hast habe ich auch dort gesehen ,doch ich dachte mir da SDL so "public:" ist und echt viele Englische Informationsquellen hat, warum sollte ich mir dann noch ein Englisches Buch darüber Kaufen, aber wenn du das sagst, dann werde ich mir den Englichen Schinken vielleicht mal bestellen obwohl doch wirklich viel im Internet an Infos und Tutorials vorhanden ist.

Aber gibt es denn jetzt keine Lösung zu den Problemchen, dass ich habe oder willst du mir das verschweigen, weil du möchtest, dass ich Eigeninitiative zeige !?!?
:confused:??

Ich poste auch gerne mit solchen Fragen hier im Forum, weil sich dann auch viele Antworten Sammeln, die dem nächsten C++ Lehrling auf die Sprünge helfen werden.

Ist fast wie ein Dokumentierter Werdegang von einer NULL zum C++ Profi :p

GP2X Rules.. :rotfl:

;)
Danke.


EDIT: Aaaarrrrgggg.... Meine Augen sind getrübt, Ich habe die zweite von den beiden Seiten überflogen und SDL_JoystickGetAxis verwechselt mit etwas anderem. Ich "Glaube" da ist die Lösung versteckt. Wenn ich die Lösung habe poste ich sie.. Sorry.. Hab ich übersehen.

-- Sa Apr 10, 2010 00:12 --

Ich dreh am Rad.... X-(
Bekomme das nicht hin.

-- Sa Apr 10, 2010 00:50 --

Habe mir jetzt das Buch Focus on SDL besorgt... Danke für den Buchtip Herr Azrael :ph34r:
 
Naja, wenn du ein Haus bauen möchtest, dann solltest du vielleicht erstmal das Handwerkszeug dafür lernen. Das hilft schon beim Planen. Ansonsten find ich persönlich viele kleine Testprogramme hilfreich. Ein programm für Mausabfragen, ein anderes für I/O, das nächste für links drehende pinke Dreiecke, usw. Ärzte üben ja auch nicht am (noch) lebenden Patienten. Und mit Englisch wirst du ein bisschen abfinden müssen.

Wenn du zufällig gerade Code Complete 2 "griffbereit" hast, dann schau dir mal auf Seite 17+18 die oberen Bilder an ;)

Ich schreib morgen abend noch was zum Joystickproblem.



"Ist fast wie ein Dokumentierter Werdegang von einer NULL zum C++ Profi"
Eher von 0 gegen die Betonmauer in unter 5sek ;)
 
Also. Das Joystickproblem ist fuer das erste geloest. Ich kann nun auf allen Achsen Bewegen und das auch gleichzeitig. Also ein schraeg nach oben geht oder schraeg nach unten ist jetzt moeglich.

Es handelt sich aber immer noch nicht um eine "echte" Analoge Steuerung, wo die Bewegung noch feiner sein muesste.

Aber so wie es jetzt ist bin ich schon mal ganz zufrieden und es laesst sich auch mit Nubs spielen. (Am PS 2 Controller getestet).

Es ist immer wieder gut zu hoeren wie du das machst Evil Azrael, denn ich habe wirklich immer direkt am Patienten selbst operiert anstatt erst mal an einem weniger komplexen Testobjekt.

Durch den uebergang, auf ein kleines Testprojekt und das finden einer bestimmten Internetseite (Nein, nicht durch das Buch :p ), ist es mir gelungen dieses kleine aber fuer mich doch schon nervenaufreibende Problem fast komplett zu loesen.

Ich verrate an dieser Stelle aber nicht genau wie, weil der naechste der nach diesem Problem sucht die gleichen qualen erleiden soll wie ich .

:O

Nein. Scherz.

Anstatt sich an nach den meisten Tutorials zu richten(die nur das nach oben,unten,links,rechts erklaeren) und mit SDL_JOYAXISMOTION und event.jaxis.value handeln, nehmen wir nur eine Priese hiervon " SDL_JoystickGetAxis() " und beobachten , was hier passiert " http://www.devmaster.net/forums/showthread.php?t=13130 ".

Nach c.a. 10 - 20 min. sollte der Code serviert werden.

Natuerlich handelt es sich hier nicht um eine "echte" Analoge Steuerung (um echten Kaviar) sondern nur um ein Produkt, das so aehnlich ist und als Uebergang dienen soll, bis Chefkoch Azrael uns erklaert wie man es wirklich richtig macht.

Bon Appetit :-D .



EDIT: Ich bin eher so der "learning by doing" Typ. Natürlich Lese ich auch, aber probiere mehr aus und gucke was passiert. Wenn ich Chemielaborant wäre, hätte ich wohl schon viele Laboreinrichtungen in die Luft gesprengt.
:confused:??
 
konnte das jetzt nicht testen, die akkus im joystick sind natürlich leer.
Code:
#include <stdio.h>
#include <SDL/SDL.h>

int main(int argc, char **argv)
{
	if(SDL_NumJoysticks() == 0)
		{
			printf("kein joystick gefunden\n");
			return 0; 
		}
	printf("versuche '%s' zu öffnen\n", SDL_JoystickName(0));
	SDL_Joystick *joy = SDL_JoystickOpen(0);	
	if(!joy)
		{
			printf("konnte joystick nicht öffnen\n"); 
			return 0; 
		}
	while(1) 
	{
		printf("%d %d\n", SDL_JoystickGetAxis(joy, 0), SDL_JoystickGetAxis(joy, 1)); 
		SDL_Delay(200); 
	}
	return 0; 	
}
einfach mal vorsichtig am joystick wackeln, die werte sollten sich ändern.

-- So Apr 11, 2010 11:53 --
Code:
#include <stdio.h>
#include <SDL/SDL.h>

char* funk()
{
}

int main(int argc, char **argv)
{
	if(SDL_Init(SDL_INIT_VIDEO |SDL_INIT_JOYSTICK))
		{
			printf("konnte joystick subsystem nicht initialisieren\n");
			return 0;
		}
	if(SDL_NumJoysticks() == 0)
		{
			printf("kein joystick gefunden\n");
			return 0; 
		}
	printf("versuche '%s' zu öffnen\n", SDL_JoystickName(0));
	SDL_Joystick *joy = SDL_JoystickOpen(0);	
	if(!joy)
		{
			printf("konnte joystick nicht öffnen\n"); 
			return 0; 
		}
	while(1) 
	{
		SDL_JoystickUpdate();		
		printf("%i %i\n", (int) SDL_JoystickGetAxis(joy, 0), (int) SDL_JoystickGetAxis(joy, 1)); 
		SDL_Delay(200); 
	}
	return 0; 	
}

So, das funktioniert ohne Events. Hab gerade wie blöd den fehler gesucht, warum immer 0 Werte rauskam, bis mir aufgefallen war, dass der Stick wieder im Schlafmodus war....
 
:confused:?? Hast du deine Uhr schon auf "Sommerzeit" in deinen Privaten Einstellungen umgestellt ?

Ich habe das auch mal getestet mit den "Joystick Achsen Werte Test Programm" und man könnte dann bei der Steuerung der Figur genau nach den Zwischenwerten zwischen -32768 und 32767 abfragen um die Figur "laufen" zu lassen
"schnell gehen" zu lassen oder "rennen" zu lassen, doch jetzt kommt das "aber".

Aber wie sieht es den mit den Zwischenwerten zwischen den Achsen aus.

Es gibt zwei Achsen. Die X und die Y Achse.
Um eine Schrägbewegung hin zu bekommen muss man nur die beiden Achsen abfragen.
Machen wir das haben wir insgesamt acht Bewegungen.

//--------------------+
// 1. oben. |
// 2. unten. |
// 3. links. |
// 4. rechts. |
// |
// 5. oben/rechts. |
// 6. oben/links. |
// 7. unten/rechts. |
// 8. unten/links. |
//--------------------+

Wie bekommt man jedoch diese Zwischenbewegung hin, die sich z.B. zwischen "links" und "oben/links" befinden müsste um eine wirkliche 360 grad Steuerung zu erhalten. ???

Also anstatt 8 "punkte" müssten es 360 sein :O

Bild dazu.

joystick.png


:ph34r:
 
joystick.png

Naja so kompliziert muss es nicht sein..
Zuerst berechnest du die Entfernung von 0, dann hast du die Geschwindigkeit, dann musst du den winkel berechnen. wie das geht, das steht ja auch in dem wiki artikel. für weitere informationen wirst du dich durch die wikipedia oder ein mathebuch hangeln müssen, wenn du das noch nicht verstanden hast.

für abgestufte geschwindigkeiten wirst du schwellenwerte benutzen müssen. im allgemeinen ist es oft sinnvoll einen totbereich zu definieren, in dem nix passiert. das hat den hintergrund dass die potentiometer oft was empfindlich sind. statt nem kreis um den nullpunkt kannst du auch einfach einen fixen wert für jede achse nehmen, sagen wir mal 200. letzteres hätte den vorteil, dass wenn der benutzer den joystick ganz zur seite reisst, keine wackler nach oben oder unten drin wären.
letztes ist bei zu empfindlichen joysticks oder total ausgelutschten eine notwendigkeit.
 
Back
Top