h1

Aplicación de dibujo isométrico para nds

Mayo 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 fichero nds con esta aplicación se puede descargar desde aquí. 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;
}

8 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.



Dejar un comentario