Noviembre 13, 2014, 12:33:15 AM Ultima modificación: Noviembre 14, 2014, 08:29:07 PM por DarkKRuleR
Buenash! Veréis, mirado desde arriba, tengo al personaje, con su variable pDir, y la cámara, con cDir. Indican, respectivamente, a dónde mira el personaje y la cámara, ambos entre 0 y 360. Si, por ejemplo, cDir = 90 (cámara), mira hacia arriba, al moverme a la derecha pDir = 0, y a la izquierda pDir = 180. Si cDir = 180, al moverme a la derecha pDir = 90, atrás pDir = 0... digamos, la dirección del personaje cambia dinámicamente según la de la cámara. La cámara es en tercera persona.

Quiero que, al girar la cámara, detecte a dónde está mirando para cambiar su sprite. Tengo 4 sprites, mirando abajo, arriba y a cada lado (8 en el futuro). Quiero que, al girar la cámara a su alrededor, los sprites cambien. Si el PJ mira a la derecha, y muevo la cámara colocándome a su frente, el sprite del personaje debería cambiar a mirando hacia abajo. Es decir, al girar la cámara a su alrededor, que el sprite cambie, para que se vean en tiempo real todos los ángulos del personaje (arriba, abajo, laterales...).

Tal como está ahora, por ejemplo, si tengo al personaje mirando hacia abajo, y muevo la cámara 180º a su alrededor, no cambia, cuando debería cambiar al sprite que mira hacia arriba. Igual que si, mirando el PJ hacia abajo, giro la cámara 90º en sentido antihorario, me pongo a su derecha, es decir, el personaje cambia y su sprite pasa a mirar a la izquierda.

tengo algo así:

if (abs(objCam.dir-dirMira) < 45) sprite_index = sprIreUStill;
    else if (abs(objCam.dir-dirMira) < 135) {
        sprite_index = sprIreRStill; if (dirMira < objCam.dir) image_xscale = 1; else image_xscale = -1;
    } else sprite_index = sprIreDStill;


Pero hay conflicto cuando pasas del 0 al 360 y viceversa, y no acaba de funcionar... usando la dirección de la cámara y del personaje debería ser suficiente. En general, si ambas direcciones son < 45 significa que el personaje mira en la misma dirección que la cámara, y como es tercera persona, pues el personaje mira hacia arriba (UStill de UP). Luego tengo RStill de Right (para left hago image_xscale = -1), y DStill de Down. Cómo iría bien?

PD: no puedo rotar un sprite. DEBEN ser 4 sprites distintos (3, pues el lateral hago image_xscale = -1), ya que en realidad son sprites distintos, pues es vista de RPG, no de top shooter, por ejemplo)


Hice un pequeño ejemplo en el que se compara el ángulo relativo del personaje respecto a la cámara y se asigna una imagen para cada intervalo. Gira la vista con las flechas izquierda y derecha. Espero que te ayude.

Normalizar la resta de ángulos... no se me había ocurrido, tenía la función normalizar pero no la usaba ahí, aunque tu versión con whiles es mejor, incluye casos de a > 720 y tal al ejecutar más de una resta si se sale del rango :D Muchas gracias, va genial!