Ver la versión completa : Joystick SDL
JimmySlam
30/05/2006, 03:52
fijo ke ya se ha hablao pero no lo encuentro. Cuales son las definiciones de las teclas de la gp2x pa porgramar en SDL y poder hacer eventos pulsando los botones / pad de la consola.?
En el Wiki de GP32Spain tienes la info:
http://wiki.gp32spain.com/index.php/Mapeo_del_joystick_en_SDL
Además de por SDL también se puede controlar usando las Minilib y por el dispositivo /dev/GPIO del sistema Linux de la GP2X :)
Y para probarlo en el teclao como se haria? Con las SDL estas de GPH
Gracias ;)
Y para probarlo en el teclao como se haria? Con las SDL estas de GPH
Gracias ;)Si te refieres al teclado para probar los juegos en tu PC, es lo mismo salvo el tipo de evento que controlas, es decir, en el caso de la GP2X controlas eventos del Joystick, como pulsar un botón (SDL_JOYBUTTONDOWN) o soltarlo (SDL_JOYBUTTONUP) y luego controlas el que botón en concreto se ha pulsado (comprobando el valor de event.jbutton.button por ejemplo compruebas si se ha pulsado el botón A que está definido con la constante GP2X_BUTTON_A de valor 12 en decimal como se ve en el Wiki) para realizar una acción determinada.
En el caso de querer hacerlo con el teclado en el PC controlas eventos de tipo (event.type) teclado, por ejemplo, si se pulsa (SDL_KEYDOWN) o se suelta una tecla (SDL_KEYUP) se puede realizar una determina acción en función de la tecla que se pulse (comparando el simbolo devuelto por esa tecla con event.key.keysym.sym por uno de los valores predefinidos en la enumeración SDLKey).
En el Wiki de GP32Spain hay referencias a tutoriales para usar la librería SDL en general así como en el Wiki oficial de SDL.
P.D: Que yo sepa las SDL de GPH no tienen nada de especial, salvo algún cambio quizás para adaptarlas mejor a la GP2X.
Es que probe a cambiar SDL_KEYDOWN por SDLK_DOWN y no detecta esa pulsacion :S.
Gracias Uncanny aver si consigo hacerlo xD
Es que probe a cambiar SDL_KEYDOWN por SDLK_DOWN y no detecta esa pulsacion :S.
Gracias Uncanny aver si consigo hacerlo xDEs que SDL_KEYDOWN es un valor para el miembro type de la estructura SDL_Event (http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fEvent) mientras que SDLK_DOWN es un valor para el simbolo (http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fkeysym) de la tecla (sym) correspondiente a la tecla "flecha direccional abajo" del teclado, que como dije antes está definido en la enumeración SDLKey (http://www.libsdl.org/cgi/docwiki.cgi/SDLKey). Por tanto primero controlas el tipo de evento y luego, en función del evento (ya sea de teclado o de joystick) controlas cual es el botón/tecla que se pulsa/suelta para realizar una acción concreta :)
Y ya por ultimo, con lo siguiente hago que una imagen se mueva hacia la derecha o izq pero tengo que levantar la tecla para que me la vuelva a pillar, ¿como se hace para incrementar "X" sin tener que quitar el deo de la tecla? Gracias denuevo :)
while (!done)
{
SDL_FillRect(screen,&dest, SDL_MapRGB(screen->format,0,0,0));
dest.x =x;
dest.y = y;
dest.w = image->w;
dest.h=image->h;
SDL_BlitSurface(image, NULL, screen, &dest);
SDL_Flip(screen);
SDL_Event event;
keys = SDL_GetKeyState(NULL);
SDL_JoystickUpdate();
/* Leemos las pulsaciones*/
while(SDL_PollEvent(&event))
{
if (event.key.keysym.sym == SDLK_LEFT ){x=x-1;} /*|| event.jbutton.button == GP2X_BUTTON_UP*/
if (event.key.keysym.sym == SDLK_RIGHT){x=x+1;} /*|| event.jbutton.button == GP2X_BUTTON_RIGHT){*/
if (event.key.keysym.sym == SDLK_ESCAPE || event.type == SDL_QUIT) {done=1;}
}
/* Processing */
}
JimmySlam
30/05/2006, 06:28
xD eso iba a preguntar yo ahora :D
Eso lo hace la librearia de rlyeh automaticamente pero debe haber alguna manera de matar el event para ke lo vuelve a detectar o yo ke se. Agluno sabe?
Por cierto Dwarf, no se si vas mu avanzado con esto del SDL pero vamos yo estoy aprendiendo SDL. Si te parece nos podemos ayudar uno al otro ahora al principio y eso. Creo ke aprenderiamos el doble de rapido. Yo estaba haciendo pruebas para mover un grafico con el joystick y tuve el mismo problema al mismo tiempo ke tu practicamente. Creo que seria probechoso darnos soporte entre nosotros y asi no damos mucho la paliza por aki. Que te parece.
¿Matar el evento? Que cruel, pobre evento xDDD
Es más sencillo que eso, hay varias formas "a lo artesanal" por ejemplo controlando el estado de la tecla si aun está pulsada o se ha soltado (ayudados de una variable contador) durante un cierto tiempo podemos realizar una acción o la misma, aunque para los eventos de teclado está una función llamada SDL_EnableKeyRepeat() (http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fEnableKeyRepeat), en este (http://www.gp32spain.com/foros/showthread.php?t=23333&page=2) hilo teneis más info.
Si es para el joystick, la cosa se parece a lo que digo al principio del otro parrafo, ya que SDL_EnableKeyRepeat() solo vale para los eventos de teclado, y en este (http://www.gp32spain.com/foros/showthread.php?t=31098) hilo discutimos algunas formas de hacerlo, una de ellas puede ser leer el miembro state de la estructura SDL_JoyButtonEvent (http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fJoyButtonEvent) de para el evento de joystick que controlemos, ya que con state podemos saber si la tecla aun está pulsada y si lo está podemos controlar (mediante un bucle y un contador que compruebe el estado cada cierto tiempo) esto y que se repita una acción mientras ese botón está pulsado.
JimmySlam
30/05/2006, 07:52
he intentao:
cuando se entra en el bucle verifica si la ultime tecla pulsada es la misma , si lo es, entra en esta if.
Intento hacer creer ke la tecla pulsada ha cambiado, pero no parece funcionar...
if (cleanKey==1){
printf(" event.jbutton.state: ", event.jbutton.state);
//event.jbutton.state=0;
event.jbutton.button=99;
prevKey=99;
};
tmb intento cambiar el state pero va a ser ke no, any idea???
asias!!
he intentao:
cuando se entra en el bucle verifica si la ultime tecla pulsada es la misma , si lo es, entra en esta if.
Intento hacer creer ke la tecla pulsada ha cambiado, pero no parece funcionar...
[...]
tmb intento cambiar el state pero va a ser ke no, any idea???
asias!!No entiendo muy bien es que pretendes hacer, es decir, se que has dicho que pretendes hacer creer al programa que la tecla pulsada a cambiado pero a su vez si entras en ese if es porque se ha cumplido la condición de que se ha pulsado una tecla, pero luego quieres "cambiarla" a mano por otra :confused:
Lo que me cuesta entender es porque pretendes cambiar el valor de state o de button en el código, cuando los valores de estos miembros de la estructura SDL_Event están hechos para controlar el valor que tienen y en función de ellos hacer algo, así que si puedes explicar mejor que pretendes hacer quizás pueda ayudarte :)
Puck2099
30/05/2006, 15:57
Mirad mi respuesta en el hilo que ha puesto Uncanny, para mi es la mejor forma de controlarlo.
Saludos
Mirad mi respuesta en el hilo que ha puesto Uncanny, para mi es la mejor forma de controlarlo.
SaludosPor algún motivo nunca caigo en esta función SDL_JoystickGetButton (http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fJoystickGetButton) cuando si uso la analoga para el teclado (SDL_GetKeyState (http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fGetKeyState)), pero Puck tiene razón es la forma más limpia de controlarlo y encima te la proporciona la propia librería SDL :p
JimmySlam
30/05/2006, 19:36
Ok asias to both peopole. Tios eske no puedo entrar en el **** IRC leches y me toca preguntar aki. Sorry men.
Puck2099
30/05/2006, 19:37
Ok asias to both peopole. Tios eske no puedo entrar en el **** IRC leches y me toca preguntar aki. Sorry men.
Tranquilo, yo estoy en el trabajo, así que tampoco me encontrarías en el irc a estas horas :p
JimmySlam
30/05/2006, 19:39
ya pero esta duda la tengo desde ayer por la noite. Yo tmb en el curro estoy y me jode porke no puedo testear. pero ya lo hare luego cuando llegue a home.
Sigo con el problema este ... esto de empezar a programar videojuegos ... xD
if (SDL_JoyGetButton(joystick, GP2X_BUTTON_RIGHT)) {x=x+1};
Para usar SDL_JoyGetButton hay que declarar algo antes? :S
Gracias
JimmySlam
31/05/2006, 05:04
Dwarf leete lo ke te puse antes.
por cierto en vez de poner x=x+1; pon x++; es mas optimo.
y otra cosa mas leete [ebook]Programacion de videojuegos con SDL ke te vendra de perlas yo estoy con el y la verdad es muy bueno pa aprender.
Por algún motivo nunca caigo en esta función SDL_JoystickGetButton (http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fJoystickGetButton) cuando si uso la analoga para el teclado (SDL_GetKeyState (http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fGetKeyState)), pero Puck tiene razón es la forma más limpia de controlarlo y encima te la proporciona la propia librería SDL :p
Si dicen que esa funcion es la mejor pa que usar ifeses xD?
Yo tengo el libro ese de hace tiempo y comprao en papel ;)
EDITAO
GRRRRRRRR en el otro hilo pusieron SDL_JoyGetButton y es SDL_JoystickGetButton !!!!!!!!! [chuck1]
< - >
Segun Puck es haria asi ....
while(SDL_PollEvent(&event))
{
if (SDL_JoystickGetButton(joystick, GP2X_BUTTON_RIGHT)) {x++;}
if (SDL_JoystickGetButton(joystick, GP2X_BUTTON_LEFT)) {x--;}
if (event.key.keysym.sym == SDLK_ESCAPE || event.type == SDL_QUIT) {done=1;}
}
Pero a mi solo me detecta una pulsacion :(
Gracias JimmySlam por recordarme el x++, el x=x+1 se me ha quedao por culpa del VB6
Puck2099
31/05/2006, 06:07
Segun Puck es haria asi ....
while(SDL_PollEvent(&event))
{
if (SDL_JoystickGetButton(joystick, GP2X_BUTTON_RIGHT)) {x++;}
if (SDL_JoystickGetButton(joystick, GP2X_BUTTON_LEFT)) {x--;}
if (event.key.keysym.sym == SDLK_ESCAPE || event.type == SDL_QUIT) {done=1;}
}
Pero a mi solo me detecta una pulsacion :(
Con ese código es normal que solo te detecte una pulsación, pues solo hay un evento que fue cuando pulsaste el botón.
Quita el while(SDL_PollEvent(&event)) que no hace falta ;)
while (!done) {
if (SDL_JoystickGetButton(joystick, GP2X_BUTTON_RIGHT)) x++;
if (SDL_JoystickGetButton(joystick, GP2X_BUTTON_LEFT)) x--;
...
...
...
...
while(SDL_PollEvent(&event))
{
if (event.key.keysym.sym == SDLK_ESCAPE || event.type == SDL_QUIT) {done=1;}
}
}
Muchas gracias ;), ahora si
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.