Advertisement
NightFox

NFlib Pixel Perfect collision example

Sep 3rd, 2012
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.63 KB | None | 0 0
  1. /*
  2. -------------------------------------------------
  3.  
  4.     NightFox's Lib Template
  5.     Ejemplo de mapas de colisiones por pixels
  6.     en superficies inclinadas
  7.  
  8.     Requiere DevkitARM
  9.     Requiere NightFox's Lib
  10.  
  11.     Codigo por NightFox
  12.     http://www.nightfoxandco.com
  13.     Inicio 10 de Octubre del 2009
  14.  
  15.     (c)2009 - 2011 NightFox & Co.
  16.  
  17. -------------------------------------------------
  18. */
  19.  
  20.  
  21.  
  22.  
  23.  
  24. /*
  25. -------------------------------------------------
  26.     Includes
  27. -------------------------------------------------
  28. */
  29.  
  30. // Includes C
  31. #include <stdio.h>
  32.  
  33. // Includes propietarios NDS
  34. #include <nds.h>
  35.  
  36. // Includes librerias propias
  37. #include <nf_lib.h>
  38.  
  39.  
  40.  
  41.  
  42.  
  43. /*
  44. -------------------------------------------------
  45.     Main() - Bloque general del programa
  46. -------------------------------------------------
  47. */
  48.  
  49. int main(int argc, char **argv) {
  50.  
  51.     // Pantalla de espera inicializando NitroFS
  52.     NF_Set2D(0, 0);
  53.     NF_Set2D(1, 0);
  54.     consoleDemoInit();
  55.     iprintf("\n NitroFS init. Please wait.\n\n");
  56.     iprintf(" Iniciando NitroFS,\n por favor, espere.\n\n");
  57.     swiWaitForVBlank();
  58.  
  59.     // Define el ROOT e inicializa el sistema de archivos
  60.     NF_SetRootFolder("NITROFS");    // Define la carpeta ROOT para usar NITROFS
  61.  
  62.     // Inicializa el motor 2D
  63.     NF_Set2D(0, 0);             // Modo 2D_0 en la pantalla superior
  64.  
  65.     // Inicializa los fondos tileados
  66.     NF_InitTiledBgBuffers();    // Inicializa los buffers para almacenar fondos
  67.     NF_InitTiledBgSys(0);       // Inicializa los fondos Tileados para la pantalla superior
  68.  
  69.     // Inicializa los Sprites
  70.     NF_InitSpriteBuffers();     // Inicializa los buffers para almacenar sprites y paletas
  71.     NF_InitSpriteSys(0);        // Inicializa los sprites para la pantalla superior
  72.  
  73.     // Inicializa los buffers de mapas de colisiones
  74.     NF_InitCmapBuffers();
  75.  
  76.     // Carga los archivos de fondo
  77.     NF_LoadTiledBg("bg/pdemo_bg", "bg3", 256, 256);     // Carga el fondo para la capa 3, pantalla superior
  78.  
  79.     // Carga los archivos de sprites
  80.     NF_LoadSpriteGfx("sprite/whiteball", 0, 16, 16);    // Pelota
  81.     NF_LoadSpritePal("sprite/whitepal", 0);
  82.  
  83.     // Carga el fondo de colisiones
  84.     NF_LoadColisionBg("maps/pdemo_colmap", 0, 256, 256);
  85.  
  86.     // Crea los fondos de la pantalla superior
  87.     NF_CreateTiledBg(0, 3, "bg3");
  88.  
  89.     // Transfiere a la VRAM los sprites necesarios
  90.     NF_VramSpriteGfx(0, 0, 0, true);    // Puntero
  91.     NF_VramSpritePal(0, 0, 0);
  92.  
  93.     // Variables de uso genereal
  94.     u8 b = 0;
  95.     u8 n = 0;
  96.  
  97.     // Crea el Sprite del puntero en la pantalla inferior
  98.     for (b = 0; b < 3; b ++) {
  99.         NF_CreateSprite(0, b, 0, 0, -16, -16);  // Crea el puntero en la pantalla inferior
  100.         NF_SpriteLayer(0, b, 3);                // Y la capa sobre la que se dibujara
  101.     }
  102.  
  103.     // Variables para el control de movimiento
  104.     s16 x[3];
  105.     s16 y[3];
  106.     x[0] = 32;
  107.     y[0] = -16;
  108.     x[1] = 228;
  109.     y[1] = 32;
  110.     x[2] = 10;
  111.     y[2] = 100;
  112.  
  113.  
  114.     // Variables de control de colisiones, define todos los puntos de colision del sprite
  115.     s16 py[16];
  116.     py[0] = 11;
  117.     py[1] = 13;
  118.     py[2] = 14;
  119.     py[3] = 15;
  120.     py[4] = 15;
  121.     py[5] = 16;
  122.     py[6] = 16;
  123.     py[7] = 16;
  124.     py[8] = 16;
  125.     py[9] = 16;
  126.     py[10] = 16;
  127.     py[11] = 15;
  128.     py[12] = 15;
  129.     py[13] = 14;
  130.     py[14] = 13;
  131.     py[15] = 11;
  132.  
  133.     // Control de movimiento
  134.     bool down = false;
  135.     bool left = false;
  136.     bool right = false;
  137.  
  138.     // Bucle (repite para siempre)
  139.     while(1) {
  140.  
  141.         // Borra la pantalal de texto
  142.         consoleClear();
  143.  
  144.         // Bola a bola
  145.         for (b = 0; b < 3; b ++) {
  146.  
  147.             // Control de colisiones, caida
  148.             down = true;    // Flag de descenso arriba
  149.             // Busca pixel por pixel, si hay colisiones (pixel azul, nΒΊ4)
  150.             for (n = 0; n < 16; n ++) {
  151.                 if (NF_GetPoint(0, (x[b] + n), (y[b] + py[n])) == 4) down = false;
  152.             }
  153.  
  154.             // Control de colisiones, decide derecha o izquierda
  155.             right = true;   // Flag de movimiento lateral arriba
  156.             left = true;
  157.             // Caida a izquierda
  158.             if (NF_GetPoint(0, (x[b] - 1), (y[b] + 16)) == 4) left = false;
  159.             // Caida a derecha
  160.             if (NF_GetPoint(0, (x[b] + 16), (y[b] + 16)) == 4) right = false;
  161.             // Si hay caida libre, no te muevas en horizontal
  162.             if (left && right) {
  163.                 right = false;
  164.                 left = false;
  165.             }
  166.  
  167.             // Si es necesario, caida libre
  168.             if (down) y[b] ++;
  169.             // Muevete a la derecha
  170.             if (right) x[b] ++;
  171.             // Muevete a la izquierda
  172.             if (left) x[b] --;
  173.  
  174.             // Recoloca la pelota si sale de los limites de pantalla
  175.             if (y[b] > 192) {
  176.                 x[b] = 32;
  177.                 y[b] = -16;
  178.             }
  179.  
  180.             // Posicion del Sprite
  181.             NF_MoveSprite(0, b, x[b], y[b]);
  182.  
  183.             // Imprime la posicion de la pelota
  184.             iprintf("x:%03d  y:%03d\n", x[b], y[b]);
  185.  
  186.         }
  187.  
  188.         NF_SpriteOamSet(0);             // Actualiza el Array del OAM
  189.  
  190.         swiWaitForVBlank();             // Espera al sincronismo vertical
  191.  
  192.         oamUpdate(&oamMain);            // Actualiza a VRAM el OAM Secundario
  193.    
  194.     }
  195.  
  196.     return 0;
  197.  
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement