h1

Aplicación de dibujo isométrico para nds

May 14, 2009


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;
}

9 comentarios

  1. Hola amigo. Veo que te gusta hacer HomeBrews para NDS, el caso es que el código que distes está incompleto. Porque usas gráficos y sonidos. Lo que debes hacer es añadir el proyecto entero(todas sus carpetas y archivos)para que con un simple doble click en build.bat compile. Puesto que la gente buscará hacer modificaciones de el. Por lo demas buen programa(segun NDS.Scenebeta.Com)


  2. @Almamu: acabo de subir la carpeta y subcarpetas source, pero de otra versión (esta versión ya no la tengo). Es básicamente igual solo que con el PAD iríamos eligiendo las piezas para dibujar (está pensado para dibujo técnico sencillo). Esta versión tiene sólo 5 piezas, tengo pensado hacer una con más, pero básicamente queda igual.

    El proyecto está aquí:

    http://www.box.net/shared/9ikfbxiymf

    saludos,

    raúl


  3. Vale, no pasa nada. He de decir que este Homebrew ha sido publicado en NDS.Scenebeta.Com(Gran web de la Scene de DS, Scene son los juegos de DS caseros(Homebrew))pasate por hay si quieres alguno.


  4. […] […]


  5. Gracias por el programa y sobre todo por publicar el código fuente. Hace poco intente hacer alguna cosa para la DS, curiosamente tambien en isómetrico, y la verdad me fue imposible siquiera hacer funcionar los compiladores. Siempre me daba algún error por falta de algún fichero o librería. Lo tuve que dejar ya desesperado. ¿Sabrías decirme algún tutorial para poder realizar bien la instalación de todos los programas necesarios y poder ponerme a programar un poco?


  6. @ Ger: pues yo creo que las instrucciones del wiki de palib están bastante bien, por ahí me guié yo:

    http://www.palib.info/wiki/doku.php?id=day1es

    suerte


  7. Gracias por la respuesta rápida. De ahí saque la información la primera vez. Haré un nuevo intento porque igual estaba espeso esos días.

    Como veo que eres profesor, te dejo una página para ti y tus alumnos sobre una herramienta para hacer principalmente juegos, aunque no exclusivamente. Se llama Gemix y es totalmente compatible con en el antiguo DIV que igual conoces.

    http://www.gemixstudio.com/forums/viewforum.php?f=38


  8. @Ger: gracias por el enlace y saludos.


  9. me gusta lo de las perspectivas de las figuras y que me toco utilizar en la figura de un cubo des afortunadamente no la pude hacer me gustaría que me digieran como la realizo y gracias por esta información.
    me gusta este tema de lo de dibujo tecnico



Deja un comentario