Hola chicos,
En este sencillo juego que programo me encontrado con mi primera piedra en las colisiones. He mirado todos los post del foro pero no he encontrado bien-bien lo que busco, aunque tambien os agradezco muchisimo si podeis hacerme ver la luz con otra técnica más sencilla. He leido el tutorial de PAlib y facilita los ejemplos de colisiones circulares y rectangulares, las cuales creo que entiendo, y pretendo utilizar la colision rectangular para el juego de naves.
Mi idea es utilizar esta colision rectangular para detectar una distancia corta entre naves (la mia y alguna de las enemigas), así cuando los rectangulos se toquen quiero entrar en un procedimiento que verifique que ambos objetos se tocan para producir la colisión. O sea la colision se da en dos pasos, acercamiento, y verificación de choque de pixels.
Para esto entiendo que debo hacer una matriz de tres estados [pixelDesactivado, pixelActivado, choque] 64x64 ,por ejemplo, segun el tamaño, que englobe los dos sprites que pueden chocar (dos naves o una nave y un disparo..., una nave con un cacho de meteorito,.. etc...). Decidme si me equivoco.
http://www.fotoranking.es/show.php?img=65630_colisiones.JPG.html
A esto creo que lo llamais los que habeis programado algún juego (no es mi caso todavia), MASCARAS, y creo que consiste en coger el sprite, binarizarlo y meterlo en una matriz. Pues bien esto es lo que pretendo, pero me he sorprendido por el formato del nave_sprite del directorio bin que se me ha creado con el PAGFX. Esperaba que el mapa de bytes tuviera cierto parecido a la nave como ocurre si coges un bmp con un editor hexadecimal pero no, en cambio veo valores sin mucho sentido, imagino que es el formato de la DS y punto.
http://www.fotoranking.es/show.php?img=65634_hexaNave.JPG.html
Otra cosa que puedo hacer es utilizar PA_GetSpritePixel (u8 screen, u8 sprite, u8 x, u8 y), para crear esta mascara. Sin embargo, genero este código (Hay un sprite de una nave en la pantalla inferior en la posicion (0,0)) y en la pantalla superior me da todo valores 0 con el siguiente algoritmo, ¿porque?
int main(){
PA_Init();
PA_InitVBL();
PA_InitText(1,0);
u8 matriz[32][32];
PA_LoadSpritePal(0,0,(void*)nave3_32x32_Pal);
PA_CreateSprite(0,0,(void*)nave3_32x32_Sprite, OBJ_SIZE_32X32, 1,0,0, 0);
u8 i= 0;
u8 j= 0;
while(i<32)
{
while(j<32)
{
matriz[j][i] = PA_GetSpritePixel(0,0,j,i);
if (matriz[j][i] > 0 ) matriz [j][i] = 1;
PA_OutputText(1, j, i , "%d", matriz[j][i]);
j++;
}
j = 0;
i++;
}
while(1){
PA_WaitForVBL();
}
}
Luego tengo pensada otra opcion controlando la interseccion de tres puntos de cada nave (al ser casi triangulares...).
En fin, os agradecería si me pudierais dar alguna idea..., tal vez hay alguna función que me lo hace todo, no se.
Gracias por leer hasta aquí.
EDITO: por que no puedo pegar las imagenes que me interesan?
se genera el siguiente codigo html, he mirado en la ayuda pero no lo he encontrado:
<img src="http://www.fotoranking.es/show.php?img=65634_hexaNave.JPG.html" mce_src="http://www.fotoranking.es/show.php?img=65634_hexaNave.JPG.html" alt="hexNave" style="float: left;" mce_style="float: left;" width="62" height="46">
Ahora he conseguido
Ahora he conseguido añadiendo al principio la funcion PA_InitAllSpriteDraw() que se vea algo pero no consigo ver el sprite como yo queria, tan solo las 8 primeras filas.
http://www.fotoranking.es/show.php?img=65669_naveBinarizada.JPG.html
Saludos.
EDITO: he conseguido lo que queria pero el codigo me queda así:
http://www.fotoranking.es/show.php?img=65677_naveBinarizada.JPG.html
int main(){
PA_Init();
PA_InitVBL();
PA_InitText(1,0);
PA_InitAllSpriteDraw();
u8 matriz[32][32];
PA_LoadSpritePal(0,0,(void*)nave3_32x32_Pal);
PA_CreateSprite(0,25,(void*)nave3_32x32_Sprite, OBJ_SIZE_32X32, 1,0,0, 0);
u8 i= 0;u8 j= 0;
while(i<8)
{
while(j<32)
{
matriz[j][i] = PA_GetSpritePixel(0,25,j,i);
if (matriz[j][i] > 0 ) matriz [j][i] = 1;
PA_OutputText(1, j, i , "%d", matriz[j][i]);
j++;
}
j = 0;
i++;
}
while(i<16)
{
while(j<32)
{
matriz[j][i] = PA_GetSpritePixel(0,25,j+24,i); // j+24¿?¿?¿?
if (matriz[j][i] > 0 ) matriz [j][i] = 1;
PA_OutputText(1, j, i , "%d", matriz[j][i]);
j++;
}
j = 0;
i++;
}
while(i<24)
{
while(j<32)
{
matriz[j][i] = PA_GetSpritePixel(0,25,j+48,i); // j+48¿?¿?¿?
if (matriz[j][i] > 0 ) matriz [j][i] = 1;
PA_OutputText(1, j, i , "%d", matriz[j][i]);
j++;
}
j = 0;
i++;
}
while(1){
PA_WaitForVBL();
}
}
No se si me he hecho un lio con la matriz bidimensional...
Saludos
Visita mi blog. Zenit + 5 will win