Aplicación de dibujo isométrico para nds
- Samir Ramirez
- 14 may 2009
- 2 Min. de lectura
Probando PALib para la consola de Nintendo nds, he programado esta sencilla aplicación para dibujar piezas simples en perspectiva isométrica. (Más información sobre programar nds en nuestra sección). El código fuente es el siguiente:
#include <PA9.h>
// PAGfx Include #include “gfx/all_gfx.c” #include “gfx/all_gfx.h” #include “moneda.h” #include “zippo.h” int i; char posx; s32 distanciax, distanciay, distancia; typedef struct { char aparece; s16 x,y,centrox,centroy; } unidad;
unidad linea1[30]; unidad linea2[30]; unidad linea3[30];
//Fonction principale du code int main(void){
PA_Init(); //Initialision of PAlib PA_InitVBL();
PA_InitText(0,0); PA_InitText(1, 2); //Inicializamos sonido AS_Init(AS_MODE_SURROUND | AS_MODE_16CH ); AS_SetDefaultSettings(AS_PCM_8BIT, 11025, AS_SURROUND);
PA_EasyBgLoad(0, // screen 1, // background number (0-3) cuboisometrico); // Background name, used by PAGfx… PA_EasyBgLoad(1, 3, superior); // Same thing, but on the top screen… PA_LoadSpritePal(0, // Screen 0, // Palette number (void*)linea1a_Pal); // Palette name
//Creamos los sprites fuera de la pantalla for (i=0;i<30;i++) { linea1[i].aparece=0; PA_CreateSprite(0, i,(void*)linea1a_Sprite, OBJ_SIZE_16X16,1, 0, 300, 0); }
for (i=0;i<30;i++) { linea2[i].aparece=0; PA_CreateSprite(0, i+30,(void*)linea2a_Sprite, OBJ_SIZE_16X16,1, 0, 300, 0); }
for (i=0;i<30;i++) { linea3[i].aparece=0; PA_CreateSprite(0, i+60,(void*)linea3a_Sprite, OBJ_SIZE_16X16,1, 0, 300, 0); }
//Definimos las coordenadas x y de cada linea una a una //linea1
linea1[0].x=78; linea1[0].y=90; linea1[1].x=78; linea1[1].y=74; linea1[2].x=78; linea1[2].y=58;
linea1[3].x=92; linea1[3].y=98; linea1[4].x=92; linea1[4].y=82; linea1[5].x=92; linea1[5].y=66; linea1[6].x=92; linea1[6].y=50;
linea1[7].x=106; linea1[7].y=106; linea1[8].x=106; linea1[8].y=90; linea1[9].x=106; linea1[9].y=74; linea1[10].x=106; linea1[10].y=58; linea1[11].x=106; linea1[11].y=42;
linea1[12].x=120; linea1[12].y=114; linea1[13].x=120; linea1[13].y=98; linea1[14].x=120; linea1[14].y=82; linea1[15].x=120; linea1[15].y=66; linea1[16].x=120; linea1[16].y=50; linea1[17].x=120; linea1[17].y=34;
linea1[18].x=134; linea1[18].y=106; linea1[19].x=134; linea1[19].y=90; linea1[20].x=134; linea1[20].y=74; linea1[21].x=134; linea1[21].y=58; linea1[22].x=134; linea1[22].y=42;
linea1[23].x=148; linea1[23].y=98; linea1[24].x=148; linea1[24].y=82; linea1[25].x=148; linea1[25].y=66; linea1[26].x=148; linea1[26].y=50;
linea1[27].x=162; linea1[27].y=90; linea1[28].x=162; linea1[28].y=74; linea1[29].x=162; linea1[29].y=58; //linea2
linea2[0].x=86; linea2[0].y=90; linea2[1].x=86; linea2[1].y=74; linea2[2].x=86; linea2[2].y=58; linea2[3].x=86; linea2[3].y=42;
linea2[4].x=100; linea2[4].y=98; linea2[5].x=100; linea2[5].y=82; linea2[6].x=100; linea2[6].y=66; linea2[7].x=100; linea2[7].y=50; linea2[8].x=100; linea2[8].y=34;
linea2[9].x=114; linea2[9].y=106; linea2[10].x=114; linea2[10].y=90; linea2[11].x=114; linea2[11].y=74; linea2[12].x=114; linea2[12].y=58; linea2[13].x=114; linea2[13].y=42; linea2[14].x=114; linea2[14].y=26;
linea2[15].x=128; linea2[15].y=114; linea2[16].x=128; linea2[16].y=98; linea2[17].x=128; linea2[17].y=82; linea2[18].x=128; linea2[18].y=66; linea2[19].x=128; linea2[19].y=50; linea2[20].x=128; linea2[20].y=34;
linea2[21].x=142; linea2[21].y=106; linea2[22].x=142; linea2[22].y=90; linea2[23].x=142; linea2[23].y=74; linea2[24].x=142; linea2[24].y=58; linea2[25].x=142; linea2[25].y=42;
linea2[26].x=156; linea2[26].y=98; linea2[27].x=156; linea2[27].y=82; linea2[28].x=156; linea2[28].y=66; linea2[29].x=156; linea2[29].y=50; //linea3
linea3[0].x=86; linea3[0].y=106; linea3[1].x=86; linea3[1].y=90; linea3[2].x=86; linea3[2].y=74; linea3[3].x=86; linea3[3].y=58;
linea3[4].x=100; linea3[4].y=114; linea3[5].x=100; linea3[5].y=98; linea3[6].x=100; linea3[6].y=82; linea3[7].x=100; linea3[7].y=66; linea3[8].x=100; linea3[8].y=50;
linea3[9].x=114; linea3[9].y=122; linea3[10].x=114; linea3[10].y=106; linea3[11].x=114; linea3[11].y=90; linea3[12].x=114; linea3[12].y=74; linea3[13].x=114; linea3[13].y=58; linea3[14].x=114; linea3[14].y=42;
linea3[15].x=128; linea3[15].y=114; linea3[16].x=128; linea3[16].y=98; linea3[17].x=128; linea3[17].y=82; linea3[18].x=128; linea3[18].y=66; linea3[19].x=128; linea3[19].y=50; linea3[20].x=128; linea3[20].y=34;
linea3[21].x=142; linea3[21].y=106; linea3[22].x=142; linea3[22].y=90; linea3[23].x=142; linea3[23].y=74; linea3[24].x=142; linea3[24].y=58; linea3[25].x=142; linea3[25].y=42;
linea3[26].x=156; linea3[26].y=98; linea3[27].x=156; linea3[27].y=82; linea3[28].x=156; linea3[28].y=66; linea3[29].x=156; linea3[29].y=50;
//definimos el centro de las lineas
for (i=0;i<30;i++) { linea1[i].centrox=linea1[i].x+8; linea1[i].centroy=linea1[i].y+8;
}
for (i=0;i<30;i++) { linea2[i].centrox=linea2[i].x+7; linea2[i].centroy=linea2[i].y+12;
}
for (i=0;i<30;i++) { linea3[i].centrox=linea3[i].x+7; linea3[i].centroy=linea3[i].y+4;
}
//codigo principal
while(1){ // Main loop if (Stylus.Newpress) { //comprobamos boton borrar distanciax=(Stylus.X-128)*(Stylus.X-128); distanciay=(Stylus.Y-162)*(Stylus.Y-162); distancia=distanciax+distanciay;
if (distancia<144) { for (i=0;i<30;i++) { PA_SetSpriteXY(0, i, 300, 0); PA_SetSpriteXY(0, i+30, 300, 0); PA_SetSpriteXY(0, i+60, 300, 0); linea1[i].aparece=0; linea2[i].aparece=0; linea3[i].aparece=0; PA_PlaySimpleSound(zippo); } }
//comprobamos para linea1 for (i=0;i<30;i++) { distanciax=(Stylus.X-linea1[i].centrox)*(Stylus.X-linea1[i].centrox); distanciay=(Stylus.Y-linea1[i].centroy)*(Stylus.Y-linea1[i].centroy); distancia=distanciax+distanciay;
if (distancia<25) { PA_PlaySimpleSound(moneda); //PA_OutputText(1, 0, 0, “distancia: %d “, distancia); //PA_SetSpriteXY(0,i,linea1[i].x,linea1[i].y); // PA_SetSpriteXY(0,i,5,5); //lo de arriba son pruebas if (linea1[i].aparece == 0) { linea1[i].aparece=1; PA_SetSpriteXY(0, // screen i, // sprite linea1[i].x, // x position linea1[i].y); // y…
}
else if (linea1[i].aparece == 1) { linea1[i].aparece=0; PA_SetSpriteXY(0, // screen i, // sprite 300, // x position 0); // y…
} }//cierro if distancia }//cierro bucle for //comprobamos para linea2 for (i=0;i<30;i++) { distanciax=(Stylus.X-linea2[i].centrox)*(Stylus.X-linea2[i].centrox); distanciay=(Stylus.Y-linea2[i].centroy)*(Stylus.Y-linea2[i].centroy); distancia=distanciax+distanciay; if (distancia<16) { PA_PlaySimpleSound(moneda); if (linea2[i].aparece == 0) { linea2[i].aparece=1; PA_SetSpriteXY(0, // screen i+30, // sprite linea2[i].x, // x position linea2[i].y); // y…
}
else if (linea2[i].aparece == 1) { linea2[i].aparece=0; PA_SetSpriteXY(0, // screen i+30, // sprite 300, // x position 0); // y…
} }//cierro if distancia }//cierro bucle for //comprobamos para linea3 for (i=0;i<30;i++) { distanciax=(Stylus.X-linea3[i].centrox)*(Stylus.X-linea3[i].centrox); distanciay=(Stylus.Y-linea3[i].centroy)*(Stylus.Y-linea3[i].centroy); distancia=distanciax+distanciay; if (distancia<16) { PA_PlaySimpleSound(moneda); if (linea3[i].aparece == 0) { linea3[i].aparece=1; PA_SetSpriteXY(0, // screen i+60, // sprite linea3[i].x, // x position linea3[i].y); // y…
}
else if (linea3[i].aparece == 1) { linea3[i].aparece=0; PA_SetSpriteXY(0, // screen i+60, // sprite 300, // x position 0); // y…
} }//cierro if distancia }//cierro bucle for
PA_WaitForVBL();
}//cierro if de presionar stylus }//cierro while return 0; }
Comentarios