diff --git a/examples/3dsprites/setlayer/source/main.c b/examples/3dsprites/setlayer/source/main.c index 9753500..0bb6c9b 100644 --- a/examples/3dsprites/setlayer/source/main.c +++ b/examples/3dsprites/setlayer/source/main.c @@ -1,213 +1,179 @@ // SPDX-License-Identifier: CC0-1.0 // // SPDX-FileContributor: NightFox & Co., 2009-2011 +// +// Example of setting the layer of 3D sprites. +// http://www.nightfoxandco.com -/* -------------------------------------------------- - - NightFox's Lib Template - Ejemplo de seleccion de capa en 3D Sprites - - Requiere DevkitARM - Requiere NightFox's Lib - - Codigo por NightFox - http://www.nightfoxandco.com - Inicio 10 de Octubre del 2009 - -------------------------------------------------- -*/ - - - - - -/* -------------------------------------------------- - Includes -------------------------------------------------- -*/ - -// Includes C #include #include -// Includes propietarios NDS #include #include -// Includes librerias propias #include - - - - -/* -------------------------------------------------- - Main() - Bloque general del programa -------------------------------------------------- -*/ - #define SPRITEMAXNUM 32 -int main(int argc, char **argv) { +int main(int argc, char **argv) +{ + // Set random seed based on the current time + srand(time(NULL)); - // Inicializa el random - srand(time(NULL)); + // Prepare a NitroFS initialization screen + NF_Set2D(0, 0); + NF_Set2D(1, 0); + consoleDemoInit(); + printf("\n NitroFS init. Please wait.\n\n"); + printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); + swiWaitForVBlank(); - // Pantalla de espera inicializando NitroFS - NF_Set2D(0, 0); - NF_Set2D(1, 0); - consoleDemoInit(); - printf("\n NitroFS init. Please wait.\n\n"); - printf(" Iniciando NitroFS,\n por favor, espere.\n\n"); - swiWaitForVBlank(); + // Initialize NitroFS and set it as the root folder of the filesystem + nitroFSInit(NULL); + NF_SetRootFolder("NITROFS"); - // Define el ROOT e inicializa el sistema de archivos - nitroFSInit(NULL); - NF_SetRootFolder("NITROFS"); // Define la carpeta ROOT para usar NITROFS + // Initialize 3D engine in bottom screens in mode 0 + NF_Set3D(0, 0); - // Inicializa el motor 3D - NF_Set3D(0, 0); // Modo 3D_0 en la pantalla superior + // Initialize 2D engine in bottom screens in mode 0 + NF_Set2D(1, 0); - // Inicializa el motor 2D - NF_Set2D(1, 0); // Modo 2D_0 en la pantalla inferior + // Initialize tiled backgrounds system + NF_InitTiledBgBuffers(); // Initialize storage buffers + NF_InitTiledBgSys(0); // Top screen + NF_InitTiledBgSys(1); // Bottom screen - // Inicializa los fondos tileados - NF_InitTiledBgBuffers(); // Inicializa los buffers para almacenar fondos - NF_InitTiledBgSys(0); // Inicializa los fondos Tileados para la pantalla superior - NF_InitTiledBgSys(1); // Inicializa los fondos Tileados para la pantalla inferior + // Initialize 3D sprite system + NF_InitSpriteBuffers(); // Initialize storage buffers + NF_Init3dSpriteSys(); - // Inicializa los buffers de los Sprites - NF_InitSpriteBuffers(); // Inicializa los buffers para almacenar sprites y paletas + // Load background files from NitroFS + NF_LoadTiledBg("bg/nfl", "nfl", 256, 256); + NF_LoadTiledBg("bg/bg3", "bg3", 256, 256); + NF_LoadTiledBg("bg/bg2", "bg2", 1536, 256); + NF_LoadTiledBg("bg/bg1", "bg1", 2048, 256); - // Inicializa el sistema de Sprites en 3D y OpenGL - NF_Init3dSpriteSys(); + // Load sprite files from NitroFS + for (int n = 0; n < SPRITEMAXNUM; n ++) + NF_LoadSpriteGfx("sprite/numbers", n, 16, 16); - // Carga los fondos tileados - NF_LoadTiledBg("bg/nfl", "nfl", 256, 256); - NF_LoadTiledBg("bg/bg3", "bg3", 256, 256); - NF_LoadTiledBg("bg/bg2", "bg2", 1536, 256); - NF_LoadTiledBg("bg/bg1", "bg1", 2048, 256); + NF_LoadSpritePal("sprite/numbers", 0); + // Transfer the required sprites to VRAM + for (int n = 0; n < SPRITEMAXNUM; n ++) + NF_Vram3dSpriteGfx(n, n, true); - // Carga los graficos de los Sprites - u8 n = 0; - for (n = 0; n < SPRITEMAXNUM; n ++) { - NF_LoadSpriteGfx("sprite/numbers", n, 16, 16); - } - NF_LoadSpritePal("sprite/numbers", 0); + NF_Vram3dSpritePal(0, 0); + // Create backgrounds of both screens + NF_CreateTiledBg(0, 3, "bg3"); + NF_CreateTiledBg(0, 2, "bg2"); + NF_CreateTiledBg(0, 1, "bg1"); + NF_CreateTiledBg(1, 3, "nfl"); - // Manda los graficos y paletas a la VRAM - for (n = 0; n < SPRITEMAXNUM; n ++) { - NF_Vram3dSpriteGfx(n, n, true); - } - NF_Vram3dSpritePal(0, 0); + // Variables + int x[SPRITEMAXNUM]; + int y[SPRITEMAXNUM]; + int ix[SPRITEMAXNUM]; + int iy[SPRITEMAXNUM]; + u32 timer[SPRITEMAXNUM]; + u32 frame[SPRITEMAXNUM]; - // Crea los fondos en ambas pantallas - NF_CreateTiledBg(0, 3, "bg3"); - NF_CreateTiledBg(0, 2, "bg2"); - NF_CreateTiledBg(0, 1, "bg1"); - NF_CreateTiledBg(1, 3, "nfl"); + int bg_x = 128; + int bg_speed = 1; + int layer = 0; + // Inicializa las variables + for (int n = 0; n < SPRITEMAXNUM; n ++) + { + x[n] = rand() % 239; + y[n] = rand() % 175; + timer[n] = rand() % 20; + frame[n] = rand() % 10; - // Variables - s16 x[SPRITEMAXNUM]; - s16 y[SPRITEMAXNUM]; - s8 ix[SPRITEMAXNUM]; - s8 iy[SPRITEMAXNUM]; - u16 timer[SPRITEMAXNUM]; - u8 frame[SPRITEMAXNUM]; - s16 bg_x = 128; - s8 bg_move = 1; - s8 layer = 0; + if ((rand() % 100) > 50) + ix[n] = 1; + else + ix[n] = -1; - // Inicializa las variables - for (n = 0; n < SPRITEMAXNUM; n ++) { - x[n] = (((int)(rand() % 239))); - y[n] = (((int)(rand() % 175))); - timer[n] = (((int)(rand() % 20))); - frame[n] = (((int)(rand() % 10))); - if ((rand() % 100) > 50) { - ix[n] = 1; - } else { - ix[n] = -1; - } - if ((rand() % 100) > 50) { - iy[n] = 1; - } else { - iy[n] = -1; - } - // Crea los Sprites 3D - NF_Create3dSprite(n, n, 0, x[n], y[n]); - NF_Set3dSpriteFrame(n, frame[n]); - } + if ((rand() % 100) > 50) + iy[n] = 1; + else + iy[n] = -1; - // Y ordenalos en la cola segun su ID (El mas bajo tiene prioridad) - NF_Sort3dSprites(); + // Create 3D sprites + NF_Create3dSprite(n, n, 0, x[n], y[n]); + NF_Set3dSpriteFrame(n, frame[n]); + } - // Variable para la lectura del teclado - u16 keys = 0; + // Sort their priorites based on their IDs (lower IDs have higher priority) + NF_Sort3dSprites(); - // Bucle (repite para siempre) - while(1) { + while (1) + { + scanKeys(); // Read keypad + u16 keys = keysHeld(); // Keys currently pressed - // Lee el teclado - scanKeys(); - keys = keysDown(); + // Move all sprites + for (int n = 0; n < SPRITEMAXNUM; n ++) + { + x[n] += ix[n]; + if ((x[n] < 0) || (x[n] > (255 - NF_3DSPRITE[n].width))) + ix[n] = -ix[n]; + y[n] += iy[n]; + if ((y[n] < 0) || (y[n] > (191 - NF_3DSPRITE[n].height))) + iy[n] = -iy[n]; - // Mueve todos los Sprites - for (n = 0; n < SPRITEMAXNUM; n ++) { - x[n] += ix[n]; - if ((x[n] < 0) || (x[n] > (255 - NF_3DSPRITE[n].width))) ix[n] = -ix[n]; - y[n] += iy[n]; - if ((y[n] < 0) || (y[n] > (191 - NF_3DSPRITE[n].height))) iy[n] = -iy[n]; - timer[n] ++; - if (timer[n] > 19) { - timer[n] = 0; - frame[n] ++; - if (frame[n] > 9) frame[n] = 0; - } - NF_Move3dSprite(n, x[n], y[n]); - NF_Set3dSpriteFrame(n, frame[n]); - } + timer[n]++; + if (timer[n] > 19) + { + timer[n] = 0; + frame[n]++; + if (frame[n] > 9) + frame[n] = 0; + } - // Calcula el movimiento del fondo - bg_x += bg_move; - if ((bg_x < 1) || (bg_x > 1662)) bg_move = -bg_move; + NF_Move3dSprite(n, x[n], y[n]); + NF_Set3dSpriteFrame(n, frame[n]); + } - // Cambia la capa en la que se dibujan los Sprites 3D - if (keys & KEY_A) { - layer ++; - if (layer > 2) layer = 2; - NF_3dSpritesLayer(layer); - } - if (keys & KEY_B) { - layer --; - if (layer < 0) layer = 0; - NF_3dSpritesLayer(layer); - } + // Move background + bg_x += bg_speed; + if ((bg_x < 1) || (bg_x > 1662)) + bg_speed = -bg_speed; - // Dibuja los 3D Sprites - NF_Draw3dSprites(); + // Change the layer where the 3D sprites are being drawn + if (keys & KEY_A) + { + layer++; + if (layer > 2) + layer = 2; + NF_3dSpritesLayer(layer); + } + if (keys & KEY_B) + { + layer--; + if (layer < 0) + layer = 0; + NF_3dSpritesLayer(layer); + } - // Actualiza la escena 3D, si no lo haces, no se mostrara en pantalla - glFlush(0); + // Draw 3D sprites + NF_Draw3dSprites(); - // Espera al sincronismo vertical - swiWaitForVBlank(); + // Tell the GPU to draw the scene and wait until it's done + glFlush(0); - // Actualiza las texturas de los 3D Sprites animados con KEEPFRAMES == TRUE - NF_Update3dSpritesGfx(); + // Wait for the screen refresh + swiWaitForVBlank(); - // Actualiza el Scroll de las capas fondos tileados - NF_ScrollBg(0, 1, bg_x, 0); - NF_ScrollBg(0, 2, ((int)(bg_x / 1.5)), 0); + // Update textures of any 3D sprite with "keepframes == true" + NF_Update3dSpritesGfx(); - } - - return 0; + // Update background scroll during vertical blanking to avoid tearing + NF_ScrollBg(0, 1, bg_x, 0); + NF_ScrollBg(0, 2, bg_x / 1.5, 0); + } + return 0; }