mirror of
https://github.com/knightfox75/nds_nflib.git
synced 2025-06-18 16:55:32 -04:00
121 lines
2.9 KiB
C
121 lines
2.9 KiB
C
// SPDX-License-Identifier: CC0-1.0
|
|
//
|
|
// SPDX-FileContributor: NightFox & Co., 2009-2011
|
|
//
|
|
// Simple wave effect
|
|
// http://www.nightfoxandco.com
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <nds.h>
|
|
#include <filesystem.h>
|
|
|
|
#include <nf_lib.h>
|
|
|
|
// Variables
|
|
u16 mapa[32][24]; // Almacena el mapa
|
|
s16 bgx[192]; // Posicion X de cada linea
|
|
s8 i[192]; // Control de movimiento de cada linea
|
|
|
|
// Function that runs after a scanline is drawn. By modifying the values of the
|
|
// scroll registers it's possible to add a wave effect.
|
|
void hblank_handler(void)
|
|
{
|
|
u32 vline = REG_VCOUNT; // Get the current line
|
|
|
|
if (vline < 192)
|
|
{
|
|
// If this is a line inside the screen, handle the effect
|
|
bgx[vline] += i[vline];
|
|
|
|
if ((bgx[vline] < 1) || (bgx[vline] > 63))
|
|
i[vline] *= -1;
|
|
|
|
NF_ScrollBg(1, 3, ((bgx[vline] >> 3) - 4), 0);
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
// 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();
|
|
|
|
// Initialize NitroFS and set it as the root folder of the filesystem
|
|
nitroFSInit(NULL);
|
|
NF_SetRootFolder("NITROFS");
|
|
|
|
// Initialize 2D engine in both screens and use mode 0
|
|
NF_Set2D(0, 0);
|
|
NF_Set2D(1, 0);
|
|
|
|
// Initialize tiled backgrounds system
|
|
NF_InitTiledBgBuffers(); // Initialize storage buffers
|
|
NF_InitTiledBgSys(0); // Top screen
|
|
NF_InitTiledBgSys(1); // Bottom screen
|
|
|
|
// Load background files from NitroFS
|
|
NF_LoadTiledBg("bg/nfl", "nfl", 256, 256);
|
|
|
|
// Create top screen background
|
|
NF_CreateTiledBg(0, 3, "nfl");
|
|
|
|
// Create bottom screen background
|
|
NF_CreateTiledBg(1, 3, "nfl");
|
|
|
|
// Flip vertically all the tiles in the map of the bottom screen, and copy
|
|
// them to a temporary buffer
|
|
for (int y = 0; y < 24; y ++)
|
|
{
|
|
for (int x = 0; x < 32; x ++)
|
|
{
|
|
NF_SetTileVflip(1, 3, x, y);
|
|
mapa[x][y] = NF_GetTileOfMap(1, 3, x, y);
|
|
}
|
|
}
|
|
|
|
// Now copy the tiles in reverse order to flip the image correctly
|
|
for (int y = 0; y < 24; y ++)
|
|
{
|
|
for (int x = 0; x < 32; x ++)
|
|
{
|
|
NF_SetTileOfMap(1, 3, x, (23 - y), mapa[x][y]);
|
|
}
|
|
}
|
|
|
|
// Finally, update the copy of the map in VRAM
|
|
NF_UpdateVramMap(1, 3);
|
|
|
|
// Initialize the wave effect
|
|
s8 inc = 1;
|
|
int x = 0;
|
|
|
|
for (int y = 0; y < 192; y ++)
|
|
{
|
|
x += inc;
|
|
bgx[y] = x;
|
|
|
|
if ((x < 1) || (x > 63))
|
|
inc *= -1;
|
|
|
|
i[y] = inc;
|
|
}
|
|
|
|
// Register a function to be called after a screen line has been drawn (when
|
|
// the horizontal blanking period starts)
|
|
irqSet(IRQ_HBLANK, hblank_handler);
|
|
irqEnable(IRQ_HBLANK);
|
|
|
|
while (1)
|
|
{
|
|
// Wait for the screen refresh
|
|
swiWaitForVBlank();
|
|
}
|
|
|
|
return 0;
|
|
}
|