[NDS] Rotar Matriz Sprite

Hola de nuevo chicos, necesito ayuda urgentemente.

Llevo semana y media con esto y ya no se que hacer.

Vereis, estoy haciendo un juego de coches en 2d (como ya he dicho varias veces).

El caso es que mi sprite es una imagen del coche en vertical, pero solo una imagen, para rotar la imagen y poder mover el coche en cualquier dirección uso la función PA_SetRotsetNoZoom() de la palib y me va perfecto.

El problema está en las colisiones.

Como el coche está convertido con PAGC a un vector me he creado un vector auxiliar donde pongo un 0 al color transparente y un 1 al coche.

Esto lo hago con la función PA_GetSpritePixel() que me da el color del sprite inicial.

Entonces, mi matriz sería esta inicialmente
0110
0110
0110
0110

He de aclarar que el sprite es de 32x32 no de 4x4 pero lo pongo así para simplificar un poco la explicación.

Ahora cuando muevo el coche en la pantalla se mueve, gracias a la función que mencioné antes, pero la matriz auxiliar sigue en el estado anterior porque tengo que modificarla los grados que he movido el coche (1 grado).

Esto no se como hacerlo, lo he intentado de muchas maneras, la matriz de rotación no se como aplicarla aquí porque es de 4x4 y el sprite es de 32x32.

BlueFrenzy ha intentado explicarme algunas soluciones pero soy torpe y no consigo hacer que funcione.

Ayuda plizzz sin esto no puedo seguir.

Supongo yo que alguien habrá hecho un juego en 2d donde su sprite se modifique, no?

Gracias a todos
Hola, ya leei tu problema en el foro de desarrollo(o almenos habia un caso igual, no se si era el tuyo), y no vas a tener mas cojones que pasarlo a sprite con la rotacion incluida... yo eso he hecho en el que estoy desarrollando para las diagonales...

salu2
Pues mira, puedes hacer esto (doy por hecho que sabes como multiplicar matrices):
R * (X1,Y1)  = (X2,Y2)

/cos(angulo) -sen(angulo)\   = R
\sen(angulo)  cos(angulo)/   

Donde (X1,Y1) es el pixel original que quieres ver, y (X2,Y2) el que te toca ver en realidad. Igual en lugar de ángulo tienes que poner -ángulo, pero bueno... Siento ponerlo desencajado, pero no me deja poner espacios asta juntar las 2 partes de la matriz de rotación... Además, las matrices con las coordenadas deberían estar puestas verticales... [+risas]

EDIT: Aunque igual te toca hacer algún otro apaño por ahí, no se...
Vamos a ver, que me aclare yo.

Plata tu me sugieres que tenga un gif con todas las posiciones posibles? Eso sería tener 360 imágenes, es una pasada... no crees.

Por cierto, si era yo el del otro post,jeje

Por otro lado, lo que me comenta AntonioND ya me lo habían comentado, pero no lo entiendo muy bien, porque eso sirve para modificar la posición en pantalla (x,y) pero la posición en pantalla ya se modifica sola con la función PA_SetRotsetNoZoom(), el problema es la matriz auxiliar, no se si me explico.

Gracias por la ayuda

P.D: No se si os preguntareis porqué hago el sprite con una sola imagen, pues porque con más de una imagen los movimientos no son muy naturales que digamos, además es más simple añadir otros coches. La idea la cogí del juego gratuito para PC Mini Racing Online (MRO), pero ellos no saben darme una explicación a las colisiones, o yo no se explicarselo.
Lo que ANTONIOND ha contestado es matemática, parte de "Vectores", para rotarlos... lo cual es correcto :)

Veamos, si tenemos la siguiente matriz:

( 1 0 )
( 0 0 )

Sería "una raya" en el eje x (horizontal) que iria de la posicion "1 0" a la "0 0", sí? (atención, cada punto = columna, no fila!)

Ahora, si queremos rotarla, la multiplicamos por la matriz que te ha dicho Antonio, con el angulo, por ejemplo, de 90º

(cos(90) -sin(90)) (1 0)
(sen(90) cos(90))x(0 0)

Da como resultado (cos(90) es 0, y el sin es 1!)
(0 0)
(1 0)
Que es una linea vertical, que va de "0 1" a "0 0", como puedes ver, se ha rotado 90º :)

PD: para las operaciones con coseno y seno, debes pasarlo a radianes( es decir, 90= pi/2, 180 = pi, 360 = 2pi, etc!)
EDIT: Si no te queda claro, cuando llegue a casa te hago un ejemplo con mathcad (pa que veas los gráficos) y así quedará más claro :)
Si eso si que lo tengo claro, pero creo que no es lo que necesito.

Vamos a ver, aquí hay dos aspectos a diferenciar.

Por un lado tenemos el coche que está pintado en pantalla, que se mueve a la perfección en cualquier dirección y se rota perfectamente.

Por otro lado tenemos una matriz auxiliar que representa al coche y que contiene su posición inicial con 0 y 1 para saber si es zona de colisión del coche.

Entonces el problema reside en que yo al girar el coche, se gira el coche pintado en pantalla, pero la matriz auxiliar sigue siendo la inicial.

Por lo que no necesito el cálculo de un nuevo punto x,y para que se vea girado, sino necesito algo para que la matriz auxiliar de 0 y 1 se modifique para que represente lo que actualmente se está mostrando por pantalla, por ello lo de ANTONIOND no creo que me valga.

Por poneros un ejemplo, el la matriz auxiliar del coche inicial está así (recuerdo que el coche es de 32x32 no de 4x4, esto es solo una representación)

0110
0110
0110
0110

y si yo lo giro a la derecha hasta llegar a los 0 grados la matriz auxiliar debería quedar de la siguiente manera

0000
1111
1111
0000

No se si me he explicado bien. El problema está en el control de las colisiones, los movimientos del coche en pantalla son perfectos.

Gracias
marioqn escribió:Si eso si que lo tengo claro, pero creo que no es lo que necesito.

Vamos a ver, aquí hay dos aspectos a diferenciar.

Por un lado tenemos el coche que está pintado en pantalla, que se mueve a la perfección en cualquier dirección y se rota perfectamente.

Por otro lado tenemos una matriz auxiliar que representa al coche y que contiene su posición inicial con 0 y 1 para saber si es zona de colisión del coche.

Entonces el problema reside en que yo al girar el coche, se gira el coche pintado en pantalla, pero la matriz auxiliar sigue siendo la inicial.

Por lo que no necesito el cálculo de un nuevo punto x,y para que se vea girado, sino necesito algo para que la matriz auxiliar de 0 y 1 se modifique para que represente lo que actualmente se está mostrando por pantalla, por ello lo de ANTONIOND no creo que me valga.

Por poneros un ejemplo, el la matriz auxiliar del coche inicial está así (recuerdo que el coche es de 32x32 no de 4x4, esto es solo una representación)

0110
0110
0110
0110

y si yo lo giro a la derecha hasta llegar a los 0 grados la matriz auxiliar debería quedar de la siguiente manera

0000
1111
1111
0000

No se si me he explicado bien. El problema está en el control de las colisiones, los movimientos del coche en pantalla son perfectos.

Gracias


Una matriz es un vector de dos dimensiones, podriamos decir que tiene forma rectangular, como tu lo has dibujado (aunque en realidad no se representan asi). No te entiendo muy bien, tu quieres que la matriz pase de

0110
0110
0110
0110

a

0011
0110
0110
1100

La unica manera que se me ocurre es hacer unas cuntas matrices preestablecidas (quizas de mayor tamaño, para que las colisiones sean mejores), y asignarlas a un rango de angulos. Espero que me hayas entendido. Te sirve esta solucion?
Hombre es una solución, aunque un tanto chapucera (no te lo tomes a mal, te agradezco la ayuda).

Pero creo que tendré que usarla, la lástima que me da es que van a quedar las colisiones un tanto irreales, pero probaré.

A no ser que alguien me dé otro tipo de solución.

Yo creo que esto es problema de las librerías de la DS, seguro que para PC es más sencillo.

La idea que yo tenía es poder recuperar la información de la VRAM, es decir, el coche que está pintado y lo está haciendo bien, pero parece ser que ese tipo de funciones no existen o nadie por aquí las conoce.

Yo las he buscado pero no veo nada.

Creo que mi idea es buena y sencilla, y me parecería lógico que hubiese ese tipo de funciones para estos casos, pero creo que las palib no las tienen.
marioqn escribió:Hombre es una solución, aunque un tanto chapucera (no te lo tomes a mal, te agradezco la ayuda).

Pero creo que tendré que usarla, la lástima que me da es que van a quedar las colisiones un tanto irreales, pero probaré.

A no ser que alguien me dé otro tipo de solución.

Yo creo que esto es problema de las librerías de la DS, seguro que para PC es más sencillo.

La idea que yo tenía es poder recuperar la información de la VRAM, es decir, el coche que está pintado y lo está haciendo bien, pero parece ser que ese tipo de funciones no existen o nadie por aquí las conoce.

Yo las he buscado pero no veo nada.

Creo que mi idea es buena y sencilla, y me parecería lógico que hubiese ese tipo de funciones para estos casos, pero creo que las palib no las tienen.


Ya se que es chapucera, pero te han dado ya una solución correcta con vectores y no quieres usarla.
No es que no quiera usarla, es que no me vale, o no lo entiendo yo bien.

Gracias por todo tio :)
9 respuestas