[PSP] Mover un personaje (sprite) con el joystick

Antes de nada hola a todos!!
Me he vuelto a poner con el "desarrollo" con mi apreciada PSP, despues de un año.

BUeno, me gustaría que si me podeis ayudar, en hacer mover un personaje por la pantalla pero con el Joystick, no quiero hacerlo con las teclas, sino con el joystick.

He conseguido escribiur en pantalla las coordenadas cuando muevo el joystick (SDL_JOYAXISMOTION), pero me sale unos numeros del rango (32767 a -32767) tanto en coordenadas x como y.
1) ¿Puedo mover el personaje a partir de dcihas coordenadas?
2) ¿si la pantalla es de 480 x 272, como se corresponden esas coordenadas?

No se si me he explicado bien.

Muchas gracias y un saludo.
Bueno, lo primero que tienes que saber, es que ese rango no tiene nada que ver con la pantalla, si no con el movimiento del stick.

El rango ese, es bastante excesivo, así que no estaría mal rebajarlo con un desplazamiento (>>8) y de esa forma tendrías un rango de -128 a 127, donde 0 sería la posición central.

Sin embargo, los sticks analógicos tienen fluctuaciones en los valores devueltos, por lo que es conveniente definir una zona muerta de valores, para evitar que el mando responda por si solo, o por una pulsación muy leve del stick.

Por ejemplo, si comparamos de está forma, podriamos usar de forma "digital" el mando:

// suponemos que X e Y contienen las lecturas del stick.
// suponemos que mover_X, mover_y son las coordenadas de pantalla

X>>=8;Y>>=8; // dividimos entre 256


if(X<-32) {/* Izquierda pulsada*/ mover_x--;if(mover_x<0) mover_x=0;}
if(X>=32) {/* Derecha pulsada*/ mover_x++;if(mover_x>479) mover_x=479;}

/* para Y hacer lo mismo, pero con sus valores  (puede que tenga el eje invertido) */



Si el movimiento te parece suave, puedes hacer mover_x+=2; en vez de mover_x++; u otro valor

Y luego está el uso como analógico, que en este caso, también podrías definir un tope máximo de valores por si no llegan los valores al maximo.


X>>=11;Y>>=11; // dividimos entre 2048 (de esta forma limitamos también el rango mínimo)

/* Aqui tenemos un rango maximo de -16 a +15 para X e Y (para los maximos teoricos -32768 a 32767)*/

if(X<-8) X=-8; // esto limita el rango maximo
if(X>8) X=8;   // esto limita el rango maximo

if(Y<-8) Y=-8; // esto limita el rango máximo
if(Y>8) Y=8;   // esto limita el rango máximo

/* Aqui tenemos que X (o Y) ==0 si está en posición central y desde -8 a +8 nos marcaría el rango analógico (a mas valor por ejemplo, mas rápido aceleras o mas fuerte frenas) */

mover_x+=X;
if(mover_x<0) mover_x=0;
if(mover_x>479) mover_x=479;

/* para Y hacer lo mismo, pero con sus valores  (puede que tenga el eje invertido) */

Muchas gracias amigo por tu ayudaa.
Me pongo con ello y te cuento.

Te seguiré informando.
De nuevo muchas gracias.
Ya lo entendí.

TAmbien existe un evento (SDL_JOYHATMOTION) que según pone, devuelve 0,1,2,3,4,5,6,7.
o sea, up, up+down...etc ( o sea los 8 posibles), Según he leido, pero no lo he podido hacer funcionar ese evento.
¿Tambien podría ser buena opcion verdad?

Un saludo.
edelpuerto escribió:Muchas gracias amigo por tu ayudaa.
Me pongo con ello y te cuento.

Te seguiré informando.
De nuevo muchas gracias.
Ya lo entendí.

TAmbien existe un evento (SDL_JOYHATMOTION) que según pone, devuelve 0,1,2,3,4,5,6,7.
o sea, up, up+down...etc ( o sea los 8 posibles), Según he leido, pero no lo he podido hacer funcionar ese evento.
¿Tambien podría ser buena opcion verdad?

Un saludo.


Bueno, eso te devolvería el stick "digitalizado": seguramente tenga ya definido un rango de de valores como zona muerta de forma interna.

Si con eso te es suficiente, pues tira con ello ;). Lo que yo te he explicado, te vale para cualquier tipo de stick referenciado a 0
o si quieres utilizarlo en modo analógico.
Hermes muchas gracias.
Lo que me explicaste me sirvió perfectamente.
Quiero decir que me abriste los ojos.
NO lo sabía y me fué de superayuda.
O sea, que con lo que me dijiste puedo hacer funcionar lo que yo quería.

Lo del evento (SDL_JOYHATMOTION) no lo sabido aún hacer saltar.
NO se hacerlo funcionar.

POr otro lado si me gustaría poder sacar el nombre del evento cuando salte uno y escribirlo con un printf, como se haría? que tipo de dato es el evento?

Muchas gracias por tu ayuda hermes.
4 respuestas