Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Apuntando hacia el cursor en mi juego (ver JPG)

Iniciado por Vandalism, 24 de Mayo de 2010, 06:14:08 AM

« anterior - próximo »

Vandalism

Buenas... se me ha presentado el siguiente problema. Como puede verse en el JPG adjunto, el canion dispara una bola cuando el usuario hace clic sobre el tablero.

La bola que dispara el canion (o especie de canion...) se dirige siempre hacia la posicion donde se encuentra el cursor cuando hacen clic. Ahora bien, lo que no me esta funcionando, es que la punta del canion deberia siempre mirar hacia el cursor.

He probado varias cosas, entre ellas:
- calcular el angulo en cada frame, detectando las coordenadas del cursor en cada evento de tipo mouse motion y calculando el arcotangente del angulo formado por el vector del canion hacia el cursor, y el vector "que divide la pantalla en 2" (perpendicular al eje x). Esto lo  voy sumando en una variable estatica para ir aumentando o decrementando el angulo, pero no funciona, no siempre el canion "mira hacia el cursor".

- incrementar el angulo de giro por cada vez que se mueve el cursor (esto va muy mal)

agradezco si alguien me puede echar una mano porque hace horas que estoy tratando de lograr que la punta del canion siempre este mirando hacia el cursor sin exito.

Datos que pueden interesar:
* el canion es FIJO, solo gira en su posicion
* se dispara al hacer clic, y la bola siempre se dirije hacia donde estaba el cursor cuando se hizo clic
* estoy usando OpenGL
* el juego es una especie de mod del PEGGLE (PopCap games)

Gracias de antemano




blau

Coges el vector director del cañon y sacas el angulo de giro

en XNA seria algo así:

P = (PosMouse - PosCañon);

angulo = Math.Atan2(P.Y, P.X);

donde Atan2 es una función arcotangente que tiene en cuenta los signos para darte correctamente el angulo.

luego rotas el cañon en base a ese angulo. ;)

Vandalism

#2
Gracias blau pero definitivamente no estoy dando pie con bola... aquí muestro cómo lo estoy implementando, he adaptado lo que me has dicho pero no he tenido éxito, pues el canion se mueve pero no siempre apunta hacia el cursor.

Por cierto, si no voy almacenando el ángulo de giro en la variable  "angle"  (estática al método), el canion no se mueve. De esta forma se mueve pero como dije antes no persigue al cursor:


                float posMousex = sdlMouseEvent->x;  // coordenada x del cursor
float posMousey = sdlMouseEvent->y;  // coordenada y del cursor

               float px= posMousex - canion->getPosX();   // nueva direccion para el canion
float py= posMousex - canion->getPosY();  
               int direction = 1;

if ((dx - (sdlMouseEvent->x )) < 0) {  // mouse hacia la derecha, dx mantiene el último valor de coordX del cursor
angule += atan2(py, px) ;   // angle es una variable estatica dentro del método
                       direction = -1;
}  // mouse hacia la izquierda
else {
angule -= atan2(py, px);
}

               dx = sdlMouseEvent->x ;

canion->setRot(0.f, 0.f,direction * angule);


Agradezco si alguien me puede echar algo de luz, seguramente esté aplicando mal algún concepto porque hace horas no lo puedo resolver.

Gracias de antemano.

Hechelion

#3
¿Para que sumas o restas el valor del ángulo si la función que te dieron arriba te entrega el valor final del ángulo?

Vandalism

Es que si no hago eso, el canion no se mueve...

El cálculo es por cada mouse motion, tal vez el ángulo en cada paso sea tan chico que ni siquiera mueve al canion. Por eso probé incrementarlo en cada paso, y de esa forma se mueve pero no siempre apunta al cursor.

Alguna idea? Esto me esta poniendo de mal humor  :-\

Hechelion

#5
Me late a que estás usando diferentes unidades entre el dibujo y el cálculo.

Te dejo un dibujo para que veas como se genera el ángulo, usando ArcoTangente normal eso sí, por que atan2(py, px) no sé que parámetros pide ni como devuelve el valor



Y asegúrate de usar  la misma unidad, o sea, si usas grados o radianes, pero no mezclar.

NOTA: Si te das cuenta, el vector P es el mismo que se genera con el ejemplo que te dieron arriba, así que el Vector P "apunta" hacia el mouse a partir del cañón que es lo que buscas.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.