Pues eso, que he acabado mi primer programa con el palib. Es muy simple y sólo sirve para mover al personaje por la pantalla y que suenen cuatro sonidos de na, pero me hacía ilu ponerlo aquí  
![sonrisa [sonrisa]](/images/smilies/nuevos/risa_ani1.gif) 
  Descargar ¡Mueve a Zippo!
Descargar ¡Mueve a Zippo!// Includes
#include <PA9.h>       // Include for PA_Lib
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"
#include "choque.h"
#include "moonlight.h"
#include "zippo.h"
// Function: main()
int main(int argc, char ** argv)
{
   PA_Init();    // Initializes PA_Lib
   PA_InitVBL(); // Initializes a standard VBL
   PA_InitSound(); // Inicia sonido
   PA_SetSoundVol(200);
   PA_PlaySimpleSound (1,moonlight);
   PA_InitText (0,0); // Inicia Texto
   PA_SetTextTileCol (0,2); //color texto
      
   //cargamos fondos
   PA_EasyBgLoad(0,3,bg0);
   PA_Init16bitBg(1,3);
   PA_Load16bitBitmap(1,bg1_Bitmap);
   
   // variables x, y para posición de sprites
   s32 x=112, y=80;
   bool up=true, down=false, left=false, right=false, select=false, bgs = true;
   int counter = 0;
   
   //cargamos paletas
   PA_LoadSpritePal(0,0,(void*)zippopal_Pal);
   
   
   //cargamos sprite inicial y animamos
   PA_CreateSprite(0,0,(void*)zippo_Sprite,OBJ_SIZE_32X32,1,0,x,y);
   PA_SetSpritePrio(0,0,2); // coloca el sprite en la capa 2 para que quede detrás del texto
   PA_StartSpriteAnim(0,0,0,1,5);
   
   
   // Infinite loop to keep the program running
   while (1)
   {
      while (Pad.Held.Down){  // bajar 
            //animamos y actualizamos posición
            if (down == false){
               down=true;
               up=false;
               left=false;
               right=false;
               PA_StopSpriteAnim(0,0);
               PA_StartSpriteAnim(0,0,0,1,5);
            }
            
            if (x<=224 && y<=160 && x>=0 && y>=0){    //evitamos que se salga de la pantalla
               y+=1;
               PA_SetSpriteXY(0,0,x,y);
            }else{
               PA_PlaySimpleSound(0,choque);
               if (x>224)   x=224;
               if (y>160)   y=160;
               if (x<0)      x=0;
               if (y<0)      y=0;
            }                  
            //salimos del while
            break;      
      }
      
      while (Pad.Held.Up){  // subir 
            //animamos y actualizamos posición
            if (up == false){
               down=false;
               up=true;
               left=false;
               right=false;
               PA_StopSpriteAnim(0,0);
               PA_StartSpriteAnim(0,0,2,3,5);
            }
            
            if (x<=224 && y<=160 && x>=0 && y>=0){            
               y-=1;
               PA_SetSpriteXY(0,0,x,y);
            }else{
               PA_PlaySimpleSound(0,choque);
               if (x>224)   x=224;
               if (y>160)   y=160;
               if (x<0)      x=0;
               if (y<0)      y=0;
            }         
            //salimos del while
            break;      
      }
      
      while (Pad.Held.Left){  // izquierda 
            //animamos y actualizamos posición
            if (left == false){
               down=false;
               up=false;
               left=true;
               right=false;
               PA_StopSpriteAnim(0,0);
               PA_StartSpriteAnim(0,0,4,5,5);
            }
            
            if (x<=224 && y<=160 && x>=0 && y>=0){         
               x-=1;
               PA_SetSpriteXY(0,0,x,y);
            }else{
               PA_PlaySimpleSound(0,choque);
               if (x>224)   x=224;
               if (y>160)   y=160;
               if (x<0)      x=0;
               if (y<0)      y=0;
            }         
            //salimos del while
            break;      
      }
      
      while (Pad.Held.Right){  // derecha 
            //animamos y actualizamos posición
            if (right == false){
               down=false;
               up=false;
               left=false;
               right=true;
               PA_StopSpriteAnim(0,0);
               PA_StartSpriteAnim(0,0,6,7,5);
            }
            
            if (x<=224 && y<=160 && x>=0 && y>=0){            
               x+=1;
               PA_SetSpriteXY(0,0,x,y);
            }else{
               PA_PlaySimpleSound(0,choque);
               if (x>224)   x=224;
               if (y>160)   y=160;
               if (x<0)      x=0;
               if (y<0)      y=0;
            }         
            //salimos del while
            break;      
      }
      if (Pad.Newpress.Select){
         // Mostramos creditos
         if (select == false){
            select=true;
            x = 190; y = 73;
            PA_SetSpriteXY(0,0,x,y);
            PA_OutputSimpleText (0,1,1,"Musica:");
            PA_OutputSimpleText (0,1,2,"  Walking under the Moonlight");
            PA_OutputSimpleText (0,1,3,"  por Eglomer");
            PA_OutputSimpleText (0,1,5,"Voz de Zippo:");
            PA_OutputSimpleText (0,1,6,"  Tsuki");
            PA_OutputSimpleText (0,1,8,"Graficos:");
            PA_OutputSimpleText (0,1,9,"  Eglomer");
            PA_OutputSimpleText (0,1,11,"Programacion:");
            PA_OutputSimpleText (0,1,12,"  Eglomer");
            PA_OutputSimpleText (0,1,14,"Basado en:");
            PA_OutputSimpleText (0,1,15,"  Kaizoku no Nikki");
            PA_OutputSimpleText (0,9,16,"  (Diario de un Pirata)");
            PA_OutputSimpleText (0,1,17,"www.kaizokunonikki.blogspot.com");
         }else{
            select=false;
            PA_ClearTextBg(0);   
         }         
      }         
      
      if (Pad.Newpress.Start){
         x = 190; y = 73;
         PA_SetSpriteXY(0,0,x,y);
         PA_ClearTextBg(0); // por si están los créditos activos    
         PA_StopSpriteAnim(0,0);
         PA_OutputSimpleText (0,12,11,"PAUSA"); 
         PA_WaitFor(Pad.Newpress.Start); //pausamos hasta que vuelva a apretar y después reanudamos
         if (down == true)   PA_StartSpriteAnim(0,0,0,1,5);
         else if (up == true)   PA_StartSpriteAnim(0,0,2,3,5);
         else if (left == true)   PA_StartSpriteAnim(0,0,4,5,5);
         else if (right == true)   PA_StartSpriteAnim(0,0,6,7,5);
         PA_ClearTextBg(0);
      }
                  
      
      if (Pad.Newpress.L)
         if (bgs == true){ 
            PA_StopSound (1);
            PA_SetTextTileCol (0,3);
            PA_OutputSimpleText (0,1,1,"Cancion detenida"); //Bucle para esperar unos seg antes de borrar el texto
            for (counter = 0; counter < 40; counter++)
               PA_WaitForVBL();
            PA_SetTextTileCol (0,2);
            PA_ClearTextBg(0);
            bgs = false;
         }         
         
      if (Pad.Newpress.R)
         if (bgs == false){ 
            PA_PlaySimpleSound (1,moonlight);
            PA_SetTextTileCol (0,3);
            PA_OutputSimpleText (0,1,1,"Walking under the Moonlight");
            for (counter = 0; counter < 40; counter++)  //Bucle para esperar unos seg antes de borrar el texto
               PA_WaitForVBL();
            PA_SetTextTileCol (0,2);
            PA_ClearTextBg(0);
            bgs = true;
         }   
      
      
      if (Pad.Newpress.A || Pad.Newpress.B || Pad.Newpress.X || Pad.Newpress.Y)
         PA_PlaySimpleSound(2,zippo);
      
            
      while (Stylus.Held){
         // Actualizamos la posición del sprite con la del pad 
         PA_MoveSprite(0);
         x=Stylus.X-16;
         y=Stylus.Y-16;
         PA_SetSpriteXY(0,0,x,y);   
      }   
      
      
      PA_CheckLid(); // Pausa el juego si se cierra la pantalla de la DS
      PA_WaitForVBL();
   }
   
   return 0;
} // End of main()