mirror of
https://github.com/knightfox75/nds_nflib.git
synced 2025-06-18 16:55:32 -04:00
examples: Cleanup and translate more examples to English
This commit is contained in:
parent
2b4aab4ba8
commit
fa21c62ac4
@ -1,202 +1,156 @@
|
||||
// SPDX-License-Identifier: CC0-1.0
|
||||
//
|
||||
// SPDX-FileContributor: NightFox & Co., 2009-2011
|
||||
//
|
||||
// Example of per-pixel collisions.
|
||||
// http://www.nightfoxandco.com
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
|
||||
NightFox's Lib Template
|
||||
Ejemplo de mapas de colisiones por pixels
|
||||
en superficies inclinadas
|
||||
|
||||
Requiere DevkitARM
|
||||
Requiere NightFox's Lib
|
||||
|
||||
Codigo por NightFox
|
||||
http://www.nightfoxandco.com
|
||||
Inicio 10 de Octubre del 2009
|
||||
|
||||
-------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
Includes
|
||||
-------------------------------------------------
|
||||
*/
|
||||
|
||||
// Includes C
|
||||
#include <stdio.h>
|
||||
|
||||
// Includes propietarios NDS
|
||||
#include <nds.h>
|
||||
#include <filesystem.h>
|
||||
|
||||
// Includes librerias propias
|
||||
#include <nf_lib.h>
|
||||
|
||||
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 the top screen and use mode 0
|
||||
NF_Set2D(0, 0);
|
||||
|
||||
// Initialize tiled backgrounds system
|
||||
NF_InitTiledBgBuffers(); // Initialize storage buffers
|
||||
NF_InitTiledBgSys(0); // Top screen
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
Main() - Bloque general del programa
|
||||
-------------------------------------------------
|
||||
*/
|
||||
// Initialize sprite system
|
||||
NF_InitSpriteBuffers();
|
||||
NF_InitSpriteSys(0); // Top screen
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
// Initialize collision map buffers
|
||||
NF_InitCmapBuffers();
|
||||
|
||||
// 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();
|
||||
// Load background files from NitroFS
|
||||
NF_LoadTiledBg("bg/pdemo_bg", "bg3", 256, 256);
|
||||
|
||||
// Define el ROOT e inicializa el sistema de archivos
|
||||
nitroFSInit(NULL);
|
||||
NF_SetRootFolder("NITROFS"); // Define la carpeta ROOT para usar NITROFS
|
||||
// Load sprite files from NitroFS
|
||||
NF_LoadSpriteGfx("sprite/whiteball", 0, 16, 16);
|
||||
NF_LoadSpritePal("sprite/whiteball", 0);
|
||||
|
||||
// Inicializa el motor 2D
|
||||
NF_Set2D(0, 0); // Modo 2D_0 en la pantalla superior
|
||||
// Load collision map files from NitroFS
|
||||
NF_LoadCollisionBg("maps/pdemo_colmap", 0, 256, 256);
|
||||
|
||||
// Inicializa los fondos tileados
|
||||
NF_InitTiledBgBuffers(); // Inicializa los buffers para almacenar fondos
|
||||
NF_InitTiledBgSys(0); // Inicializa los fondos Tileados para la pantalla superior
|
||||
// Create top screen background
|
||||
NF_CreateTiledBg(0, 3, "bg3");
|
||||
|
||||
// Inicializa los Sprites
|
||||
NF_InitSpriteBuffers(); // Inicializa los buffers para almacenar sprites y paletas
|
||||
NF_InitSpriteSys(0); // Inicializa los sprites para la pantalla superior
|
||||
// Transfer the required sprites to VRAM
|
||||
NF_VramSpriteGfx(0, 0, 0, true);
|
||||
NF_VramSpritePal(0, 0, 0);
|
||||
|
||||
// Inicializa los buffers de mapas de colisiones
|
||||
NF_InitCmapBuffers();
|
||||
// Create sprites and set their priority layer
|
||||
for (int b = 0; b < 3; b ++)
|
||||
{
|
||||
NF_CreateSprite(0, b, 0, 0, -16, -16);
|
||||
NF_SpriteLayer(0, b, 3);
|
||||
}
|
||||
|
||||
// Carga los archivos de fondo
|
||||
NF_LoadTiledBg("bg/pdemo_bg", "bg3", 256, 256); // Carga el fondo para la capa 3, pantalla superior
|
||||
// Location of the sprites
|
||||
s16 x[3] = { 32, 228, 10 };
|
||||
s16 y[3] = { -16, 32, 100 };
|
||||
|
||||
// Carga los archivos de sprites
|
||||
NF_LoadSpriteGfx("sprite/whiteball", 0, 16, 16); // Pelota
|
||||
NF_LoadSpritePal("sprite/whiteball", 0);
|
||||
// Coordinates of the sprite that have to be used as collision points
|
||||
s16 py[16] = {
|
||||
11, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 15, 15, 14, 13, 11
|
||||
};
|
||||
|
||||
// Carga el fondo de colisiones
|
||||
NF_LoadCollisionBg("maps/pdemo_colmap", 0, 256, 256);
|
||||
while (1)
|
||||
{
|
||||
// Clear text console
|
||||
consoleClear();
|
||||
|
||||
// Crea los fondos de la pantalla superior
|
||||
NF_CreateTiledBg(0, 3, "bg3");
|
||||
bool down = false;
|
||||
bool left = false;
|
||||
bool right = false;
|
||||
|
||||
// Transfiere a la VRAM los sprites necesarios
|
||||
NF_VramSpriteGfx(0, 0, 0, true); // Puntero
|
||||
NF_VramSpritePal(0, 0, 0);
|
||||
// Handle collisions and fall of all balls
|
||||
for (int b = 0; b < 3; b ++)
|
||||
{
|
||||
down = true; // If this remains true, there is no collision
|
||||
|
||||
// Variables de uso genereal
|
||||
u8 b = 0;
|
||||
u8 n = 0;
|
||||
// Check all pixels of the lower half of the ball to see if there is
|
||||
// a collision.
|
||||
for (int n = 0; n < 16; n ++)
|
||||
{
|
||||
// Blue pixels are index 4
|
||||
if (NF_GetPoint(0, (x[b] + n), (y[b] + py[n])) == 4)
|
||||
down = false;
|
||||
}
|
||||
|
||||
// Crea el Sprite del puntero en la pantalla inferior
|
||||
for (b = 0; b < 3; b ++) {
|
||||
NF_CreateSprite(0, b, 0, 0, -16, -16); // Crea el puntero en la pantalla inferior
|
||||
NF_SpriteLayer(0, b, 3); // Y la capa sobre la que se dibujara
|
||||
}
|
||||
// Check for collisions left and right of the ball
|
||||
right = true;
|
||||
left = true;
|
||||
|
||||
// Variables para el control de movimiento
|
||||
s16 x[3];
|
||||
s16 y[3];
|
||||
x[0] = 32;
|
||||
y[0] = -16;
|
||||
x[1] = 228;
|
||||
y[1] = 32;
|
||||
x[2] = 10;
|
||||
y[2] = 100;
|
||||
// Falling to the left
|
||||
if (NF_GetPoint(0, (x[b] - 1), (y[b] + 16)) == 4)
|
||||
left = false;
|
||||
|
||||
// Falling to the right
|
||||
if (NF_GetPoint(0, (x[b] + 16), (y[b] + 16)) == 4)
|
||||
right = false;
|
||||
|
||||
// Variables de control de colisiones, define todos los puntos de colision del sprite
|
||||
s16 py[16];
|
||||
py[0] = 11;
|
||||
py[1] = 13;
|
||||
py[2] = 14;
|
||||
py[3] = 15;
|
||||
py[4] = 15;
|
||||
py[5] = 16;
|
||||
py[6] = 16;
|
||||
py[7] = 16;
|
||||
py[8] = 16;
|
||||
py[9] = 16;
|
||||
py[10] = 16;
|
||||
py[11] = 15;
|
||||
py[12] = 15;
|
||||
py[13] = 14;
|
||||
py[14] = 13;
|
||||
py[15] = 11;
|
||||
// On free fall, don't move on the X axis
|
||||
if (left && right)
|
||||
{
|
||||
right = false;
|
||||
left = false;
|
||||
}
|
||||
|
||||
// Control de movimiento
|
||||
bool down = false;
|
||||
bool left = false;
|
||||
bool right = false;
|
||||
// Free fall
|
||||
if (down)
|
||||
y[b] ++;
|
||||
|
||||
// Bucle (repite para siempre)
|
||||
while(1) {
|
||||
// Move right
|
||||
if (right)
|
||||
x[b] ++;
|
||||
|
||||
// Borra la pantalal de texto
|
||||
consoleClear();
|
||||
// Move left
|
||||
if (left)
|
||||
x[b] --;
|
||||
|
||||
// Bola a bola
|
||||
for (b = 0; b < 3; b ++) {
|
||||
// If the ball exits the screen from the bottom move it to the top
|
||||
if (y[b] > 192)
|
||||
{
|
||||
x[b] = 32;
|
||||
y[b] = -16;
|
||||
}
|
||||
|
||||
// Control de colisiones, caida
|
||||
down = true; // Flag de descenso arriba
|
||||
// Busca pixel por pixel, si hay colisiones (pixel azul, nº4)
|
||||
for (n = 0; n < 16; n ++) {
|
||||
if (NF_GetPoint(0, (x[b] + n), (y[b] + py[n])) == 4) down = false;
|
||||
}
|
||||
// Set the sprite position
|
||||
NF_MoveSprite(0, b, x[b], y[b]);
|
||||
|
||||
// Control de colisiones, decide derecha o izquierda
|
||||
right = true; // Flag de movimiento lateral arriba
|
||||
left = true;
|
||||
// Caida a izquierda
|
||||
if (NF_GetPoint(0, (x[b] - 1), (y[b] + 16)) == 4) left = false;
|
||||
// Caida a derecha
|
||||
if (NF_GetPoint(0, (x[b] + 16), (y[b] + 16)) == 4) right = false;
|
||||
// Si hay caida libre, no te muevas en horizontal
|
||||
if (left && right) {
|
||||
right = false;
|
||||
left = false;
|
||||
}
|
||||
// Print sprite coordinates
|
||||
printf("x:%03d y:%03d\n", x[b], y[b]);
|
||||
|
||||
// Si es necesario, caida libre
|
||||
if (down) y[b] ++;
|
||||
// Muevete a la derecha
|
||||
if (right) x[b] ++;
|
||||
// Muevete a la izquierda
|
||||
if (left) x[b] --;
|
||||
}
|
||||
|
||||
// Recoloca la pelota si sale de los limites de pantalla
|
||||
if (y[b] > 192) {
|
||||
x[b] = 32;
|
||||
y[b] = -16;
|
||||
}
|
||||
// Update OAM array
|
||||
NF_SpriteOamSet(0);
|
||||
|
||||
// Posicion del Sprite
|
||||
NF_MoveSprite(0, b, x[b], y[b]);
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
|
||||
// Imprime la posicion de la pelota
|
||||
printf("x:%03d y:%03d\n", x[b], y[b]);
|
||||
|
||||
}
|
||||
|
||||
NF_SpriteOamSet(0); // Actualiza el Array del OAM
|
||||
|
||||
swiWaitForVBlank(); // Espera al sincronismo vertical
|
||||
|
||||
oamUpdate(&oamMain); // Actualiza a VRAM el OAM Secundario
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
// Update OAM
|
||||
oamUpdate(&oamMain);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,178 +1,154 @@
|
||||
// SPDX-License-Identifier: CC0-1.0
|
||||
//
|
||||
// SPDX-FileContributor: NightFox & Co., 2009-2011
|
||||
//
|
||||
// Collision background example
|
||||
// http://www.nightfoxandco.com
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
|
||||
NightFox's Lib Template
|
||||
Ejemplo de fondos de colisiones
|
||||
|
||||
Requiere DevkitARM
|
||||
Requiere NightFox's Lib
|
||||
|
||||
Codigo por NightFox
|
||||
http://www.nightfoxandco.com
|
||||
Inicio 10 de Octubre del 2009
|
||||
|
||||
-------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
Includes
|
||||
-------------------------------------------------
|
||||
*/
|
||||
|
||||
// Includes C
|
||||
#include <stdio.h>
|
||||
|
||||
// Includes propietarios NDS
|
||||
#include <nds.h>
|
||||
#include <filesystem.h>
|
||||
|
||||
// Includes librerias propias
|
||||
#include <nf_lib.h>
|
||||
|
||||
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 the top screen and use mode 0
|
||||
NF_Set2D(0, 0);
|
||||
|
||||
// Initialize tiled backgrounds system
|
||||
NF_InitTiledBgBuffers(); // Initialize storage buffers
|
||||
NF_InitTiledBgSys(0); // Top screen
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
Main() - Bloque general del programa
|
||||
-------------------------------------------------
|
||||
*/
|
||||
// Initialize sprite system
|
||||
NF_InitSpriteBuffers();
|
||||
NF_InitSpriteSys(0); // Top screen
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
// Initialize collision map buffers
|
||||
NF_InitCmapBuffers();
|
||||
|
||||
// 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();
|
||||
// Load background files from NitroFS
|
||||
NF_LoadTiledBg("bg/ppc_bg", "bg3", 512, 512);
|
||||
|
||||
// Define el ROOT e inicializa el sistema de archivos
|
||||
nitroFSInit(NULL);
|
||||
NF_SetRootFolder("NITROFS"); // Define la carpeta ROOT para usar NITROFS
|
||||
// Load sprite files from NitroFS
|
||||
NF_LoadSpriteGfx("sprite/puntero", 0, 8, 8);
|
||||
NF_LoadSpritePal("sprite/puntero", 0);
|
||||
|
||||
// Inicializa el motor 2D
|
||||
NF_Set2D(0, 0); // Modo 2D_0 en la pantalla superior
|
||||
// Load collision map files from NitroFS
|
||||
NF_LoadCollisionBg("maps/ppc_cmap", 0, 512, 512);
|
||||
|
||||
// Inicializa los fondos tileados
|
||||
NF_InitTiledBgBuffers(); // Inicializa los buffers para almacenar fondos
|
||||
NF_InitTiledBgSys(0); // Inicializa los fondos Tileados para la pantalla superior
|
||||
// Create top screen background
|
||||
NF_CreateTiledBg(0, 3, "bg3");
|
||||
|
||||
// Inicializa los Sprites
|
||||
NF_InitSpriteBuffers(); // Inicializa los buffers para almacenar sprites y paletas
|
||||
NF_InitSpriteSys(0); // Inicializa los sprites para la pantalla superior
|
||||
// Transfer the required sprites to VRAM
|
||||
NF_VramSpriteGfx(0, 0, 0, true);
|
||||
NF_VramSpritePal(0, 0, 0);
|
||||
|
||||
// Inicializa los buffers de mapas de colisiones
|
||||
NF_InitCmapBuffers();
|
||||
// Create pointer sprite in the bottom screen and set its priority layer
|
||||
NF_CreateSprite(0, 0, 0, 0, 124, 92);
|
||||
NF_SpriteLayer(0, 0, 3);
|
||||
|
||||
// Carga los archivos de fondo
|
||||
NF_LoadTiledBg("bg/ppc_bg", "bg3", 512, 512); // Carga el fondo para la capa 3, pantalla superior
|
||||
// Movement variables
|
||||
s16 x = 128;
|
||||
s16 y = 96;
|
||||
s16 spr_x = 0;
|
||||
s16 spr_y = 0;
|
||||
s16 bg_x = 0;
|
||||
s16 bg_y = 0;
|
||||
|
||||
// Carga los archivos de sprites
|
||||
NF_LoadSpriteGfx("sprite/puntero", 0, 8, 8); // Puntero
|
||||
NF_LoadSpritePal("sprite/puntero", 0);
|
||||
while (1)
|
||||
{
|
||||
scanKeys(); // Read keypad
|
||||
u16 keys = keysHeld(); // Keys currently pressed
|
||||
|
||||
// Carga el fondo de colisiones
|
||||
NF_LoadCollisionBg("maps/ppc_cmap", 0, 512, 512);
|
||||
if (keys & KEY_UP)
|
||||
y --;
|
||||
if (keys & KEY_DOWN)
|
||||
y ++;
|
||||
if (keys & KEY_LEFT)
|
||||
x --;
|
||||
if (keys & KEY_RIGHT)
|
||||
x ++;
|
||||
|
||||
// Crea los fondos de la pantalla superior
|
||||
NF_CreateTiledBg(0, 3, "bg3");
|
||||
// Movement limits
|
||||
if (x < 0)
|
||||
x = 0;
|
||||
if (x > 511)
|
||||
x = 511;
|
||||
|
||||
// Transfiere a la VRAM los sprites necesarios
|
||||
NF_VramSpriteGfx(0, 0, 0, true); // Puntero
|
||||
NF_VramSpritePal(0, 0, 0);
|
||||
if (y < 0)
|
||||
y = 0;
|
||||
if (y > 511)
|
||||
y = 511;
|
||||
|
||||
// Crea el Sprite del puntero en la pantalla inferior
|
||||
NF_CreateSprite(0, 0, 0, 0, 124, 92); // Crea el puntero en la pantalla inferior
|
||||
NF_SpriteLayer(0, 0, 3); // Y la capa sobre la que se dibujara
|
||||
// Background position
|
||||
bg_x = x - 128;
|
||||
if (bg_x < 0)
|
||||
bg_x = 0;
|
||||
if (bg_x > 256)
|
||||
bg_x = 256;
|
||||
|
||||
// Variable para la lectura del keypad
|
||||
u16 keys = 0;
|
||||
bg_y = y - 96;
|
||||
if (bg_y < 0)
|
||||
bg_y = 0;
|
||||
if (bg_y > 320)
|
||||
bg_y = 320;
|
||||
|
||||
// Variables para el control de movimiento
|
||||
s16 x = 128;
|
||||
s16 y = 96;
|
||||
s16 spr_x = 0;
|
||||
s16 spr_y = 0;
|
||||
s16 bg_x = 0;
|
||||
s16 bg_y = 0;
|
||||
u8 pixel = 0;
|
||||
// Sprite position
|
||||
spr_x = (x - bg_x) - 4;
|
||||
spr_y = (y - bg_y) - 4;
|
||||
NF_MoveSprite(0, 0, spr_x, spr_y);
|
||||
|
||||
// Bucle (repite para siempre)
|
||||
while(1) {
|
||||
// Print pointer position
|
||||
consoleClear();
|
||||
printf("x:%03d y:%03d \n\n", x, y);
|
||||
|
||||
// Lee el teclado
|
||||
scanKeys();
|
||||
keys = keysHeld();
|
||||
if (keys & KEY_UP) y --;
|
||||
if (keys & KEY_DOWN) y ++;
|
||||
if (keys & KEY_LEFT) x --;
|
||||
if (keys & KEY_RIGHT) x ++;
|
||||
// Print pixel color
|
||||
u8 pixel = NF_GetPoint(0, x, y);
|
||||
switch (pixel)
|
||||
{
|
||||
case 1:
|
||||
printf("Tile: Negro / Black");
|
||||
break;
|
||||
case 2:
|
||||
printf("Tile: Rojo / Red");
|
||||
break;
|
||||
case 3:
|
||||
printf("Tile: Verde / Green");
|
||||
break;
|
||||
case 4:
|
||||
printf("Tile: Azul / Blue");
|
||||
break;
|
||||
default:
|
||||
printf("Value: %03d", pixel);
|
||||
break;
|
||||
}
|
||||
|
||||
// Limites del movimiento
|
||||
if (x < 0) x = 0;
|
||||
if (x > 511) x = 511;
|
||||
if (y < 0) y = 0;
|
||||
if (y > 511) y = 511;
|
||||
// Update OAM array
|
||||
NF_SpriteOamSet(0);
|
||||
|
||||
// Posicion del fondo
|
||||
bg_x = (x - 128);
|
||||
if (bg_x < 0) bg_x = 0;
|
||||
if (bg_x > 256) bg_x = 256;
|
||||
bg_y = (y - 96);
|
||||
if (bg_y < 0) bg_y = 0;
|
||||
if (bg_y > 320) bg_y = 320;
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
|
||||
// Posicion del Sprite
|
||||
spr_x = (x - bg_x) - 4;
|
||||
spr_y = (y - bg_y) - 4;
|
||||
NF_MoveSprite(0, 0, spr_x, spr_y);
|
||||
// Update OAM
|
||||
oamUpdate(&oamMain);
|
||||
|
||||
// Imprime la posicion del cursor
|
||||
consoleClear();
|
||||
printf("x:%03d y:%03d \n\n", x, y);
|
||||
|
||||
// Imprime el color del pixel
|
||||
pixel = NF_GetPoint(0, x, y);
|
||||
switch (pixel) {
|
||||
case 1:
|
||||
printf("Tile: Negro / Black");
|
||||
break;
|
||||
case 2:
|
||||
printf("Tile: Rojo / Red");
|
||||
break;
|
||||
case 3:
|
||||
printf("Tile: Verde / Green");
|
||||
break;
|
||||
case 4:
|
||||
printf("Tile: Azul / Blue");
|
||||
break;
|
||||
default:
|
||||
printf("Value: %03d", pixel);
|
||||
break;
|
||||
}
|
||||
|
||||
NF_SpriteOamSet(0); // Actualiza el Array del OAM
|
||||
|
||||
swiWaitForVBlank(); // Espera al sincronismo vertical
|
||||
|
||||
oamUpdate(&oamMain); // Actualiza a VRAM el OAM Secundario
|
||||
|
||||
NF_ScrollBg(0, 3, bg_x, bg_y); // Actualiza el scroll
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
// Update scroll
|
||||
NF_ScrollBg(0, 3, bg_x, bg_y);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,196 +1,174 @@
|
||||
// SPDX-License-Identifier: CC0-1.0
|
||||
//
|
||||
// SPDX-FileContributor: NightFox & Co., 2009-2011
|
||||
//
|
||||
// Collision map example.
|
||||
// http://www.nightfoxandco.com
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
|
||||
NightFox's Lib Template
|
||||
Ejemplo de mapas de colisiones
|
||||
|
||||
Requiere DevkitARM
|
||||
Requiere NightFox's Lib
|
||||
|
||||
Codigo por NightFox
|
||||
http://www.nightfoxandco.com
|
||||
Inicio 10 de Octubre del 2009
|
||||
|
||||
-------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
Includes
|
||||
-------------------------------------------------
|
||||
*/
|
||||
|
||||
// Includes C
|
||||
#include <stdio.h>
|
||||
|
||||
// Includes propietarios NDS
|
||||
#include <nds.h>
|
||||
#include <filesystem.h>
|
||||
|
||||
// Includes librerias propias
|
||||
#include <nf_lib.h>
|
||||
|
||||
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
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
Main() - Bloque general del programa
|
||||
-------------------------------------------------
|
||||
*/
|
||||
// Initialize sprite system
|
||||
NF_InitSpriteBuffers();
|
||||
NF_InitSpriteSys(0); // Top screen
|
||||
NF_InitSpriteSys(1); // Bottom screen
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
// Initialize text system
|
||||
NF_InitTextSys(0); // Top screen
|
||||
|
||||
// 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 collision map buffers
|
||||
NF_InitCmapBuffers();
|
||||
|
||||
// Define el ROOT e inicializa el sistema de archivos
|
||||
nitroFSInit(NULL);
|
||||
NF_SetRootFolder("NITROFS"); // Define la carpeta ROOT para usar NITROFS
|
||||
// Load background files from NitroFS
|
||||
NF_LoadTiledBg("bg/layer3", "moon", 256, 256);
|
||||
NF_LoadTiledBg("bg/colmap", "boxes", 768, 512);
|
||||
|
||||
// Inicializa el motor 2D
|
||||
NF_Set2D(0, 0); // Modo 2D_0 en ambas pantallas
|
||||
NF_Set2D(1, 0);
|
||||
// Load sprite files from NitroFS
|
||||
NF_LoadSpriteGfx("sprite/puntero", 0, 8, 8);
|
||||
NF_LoadSpritePal("sprite/puntero", 0);
|
||||
|
||||
// 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); // Iniciliaza los fondos Tileados para la pantalla inferior
|
||||
// Load text font files from NitroFS
|
||||
NF_LoadTextFont("fnt/default", "normal", 256, 256, 0);
|
||||
|
||||
// Inicializa los Sprites
|
||||
NF_InitSpriteBuffers(); // Inicializa los buffers para almacenar sprites y paletas
|
||||
NF_InitSpriteSys(0); // Inicializa los sprites para la pantalla superior
|
||||
NF_InitSpriteSys(1); // Inicializa los sprites para la pantalla inferior
|
||||
// Load collision map files from NitroFS
|
||||
NF_LoadCollisionMap("maps/cmap", 0, 768, 512);
|
||||
|
||||
// Inicializa el motor de texto
|
||||
NF_InitTextSys(0); // Inicializa el texto para la pantalla superior
|
||||
// Create top screen background
|
||||
NF_CreateTiledBg(0, 3, "moon");
|
||||
|
||||
// Inicializa los buffers de mapas de colisiones
|
||||
NF_InitCmapBuffers();
|
||||
// Create bottom screen backgrounds
|
||||
NF_CreateTiledBg(1, 3, "moon");
|
||||
NF_CreateTiledBg(1, 2, "boxes");
|
||||
|
||||
// Carga los archivos de fondo desde la FAT / NitroFS a la RAM
|
||||
NF_LoadTiledBg("bg/layer3", "moon", 256, 256); // Carga el fondo para la capa 3, pantalla inferior
|
||||
NF_LoadTiledBg("bg/colmap", "boxes", 768, 512); // Carga el fondo para la capa 2, pantalla inferior
|
||||
// Create a text layer
|
||||
NF_CreateTextLayer(0, 2, 0, "normal");
|
||||
|
||||
// Carga los archivos de sprites desde la FAT / NitroFS a la RAM
|
||||
NF_LoadSpriteGfx("sprite/puntero", 0, 8, 8); // Puntero
|
||||
NF_LoadSpritePal("sprite/puntero", 0);
|
||||
// Transfer the required sprites to VRAM
|
||||
NF_VramSpriteGfx(1, 0, 0, true);
|
||||
NF_VramSpritePal(1, 0, 0);
|
||||
|
||||
// Carga la fuente por defecto para el texto
|
||||
NF_LoadTextFont("fnt/default", "normal", 256, 256, 0);
|
||||
// Create pointer sprite in the bottom screen and set its priority layer
|
||||
NF_CreateSprite(1, 0, 0, 0, 124, 92);
|
||||
NF_SpriteLayer(1, 0, 2);
|
||||
|
||||
// Carga el mapa de colisiones
|
||||
NF_LoadCollisionMap("maps/cmap", 0, 768, 512);
|
||||
// Movement variables
|
||||
s16 x = 128;
|
||||
s16 y = 96;
|
||||
s16 spr_x = 0;
|
||||
s16 spr_y = 0;
|
||||
s16 bg_x = 0;
|
||||
s16 bg_y = 0;
|
||||
|
||||
// Crea los fondos de la pantalla superior
|
||||
NF_CreateTiledBg(0, 3, "moon");
|
||||
// Crea los fondos de la pantalla inferior
|
||||
NF_CreateTiledBg(1, 3, "moon");
|
||||
NF_CreateTiledBg(1, 2, "boxes");
|
||||
// Buffer de texto
|
||||
char mytext[32];
|
||||
|
||||
// Crea una capa de texto
|
||||
NF_CreateTextLayer(0, 2, 0, "normal");
|
||||
while (1)
|
||||
{
|
||||
scanKeys(); // Read keypad
|
||||
u16 keys = keysHeld(); // Keys currently pressed
|
||||
|
||||
// Transfiere a la VRAM los sprites necesarios
|
||||
NF_VramSpriteGfx(1, 0, 0, true); // Puntero
|
||||
NF_VramSpritePal(1, 0, 0);
|
||||
if (keys & KEY_UP)
|
||||
y --;
|
||||
if (keys & KEY_DOWN)
|
||||
y ++;
|
||||
if (keys & KEY_LEFT)
|
||||
x --;
|
||||
if (keys & KEY_RIGHT)
|
||||
x ++;
|
||||
|
||||
// Crea el Sprite del puntero en la pantalla inferior
|
||||
NF_CreateSprite(1, 0, 0, 0, 124, 92); // Crea el puntero en la pantalla inferior
|
||||
NF_SpriteLayer(1, 0, 2); // Y la capa sobre la que se dibujara
|
||||
// Limites del movimiento
|
||||
if (x < 0)
|
||||
x = 0;
|
||||
if (x > 767)
|
||||
x = 767;
|
||||
|
||||
// Variable para la lectura del keypad
|
||||
u16 keys = 0;
|
||||
if (y < 0)
|
||||
y = 0;
|
||||
if (y > 511)
|
||||
y = 511;
|
||||
|
||||
// Variables para el control de movimiento
|
||||
s16 x = 128;
|
||||
s16 y = 96;
|
||||
s16 spr_x = 0;
|
||||
s16 spr_y = 0;
|
||||
s16 bg_x = 0;
|
||||
s16 bg_y = 0;
|
||||
// Background position
|
||||
bg_x = x - 128;
|
||||
if (bg_x < 0)
|
||||
bg_x = 0;
|
||||
if (bg_x > 512)
|
||||
bg_x = 512;
|
||||
|
||||
// Buffer de texto
|
||||
char mytext[32];
|
||||
bg_y = y - 96;
|
||||
if (bg_y < 0)
|
||||
bg_y = 0;
|
||||
if (bg_y > 320)
|
||||
bg_y = 320;
|
||||
|
||||
// Sprite position
|
||||
spr_x = (x - bg_x) - 4;
|
||||
spr_y = (y - bg_y) - 4;
|
||||
NF_MoveSprite(1, 0, spr_x, spr_y);
|
||||
|
||||
// Print pointer position
|
||||
sprintf(mytext,"x:%d y:%d ", x, y);
|
||||
NF_WriteText(0, 2, 1, 1, mytext);
|
||||
|
||||
// Bucle (repite para siempre)
|
||||
while(1) {
|
||||
// Print tile number
|
||||
switch (NF_GetTile(0, x, y))
|
||||
{
|
||||
case 0:
|
||||
sprintf(mytext,"Tile: Vacio / Void ");
|
||||
break;
|
||||
case 1:
|
||||
sprintf(mytext,"Tile: Rojo / Red ");
|
||||
break;
|
||||
case 2:
|
||||
sprintf(mytext,"Tile: Verde / Green ");
|
||||
break;
|
||||
case 3:
|
||||
sprintf(mytext,"Tile: Azul / Blue ");
|
||||
break;
|
||||
}
|
||||
NF_WriteText(0, 2, 1, 3, mytext);
|
||||
|
||||
// Lee el teclado
|
||||
scanKeys();
|
||||
keys = keysHeld();
|
||||
if (keys & KEY_UP) y --;
|
||||
if (keys & KEY_DOWN) y ++;
|
||||
if (keys & KEY_LEFT) x --;
|
||||
if (keys & KEY_RIGHT) x ++;
|
||||
// Update text layers
|
||||
NF_UpdateTextLayers();
|
||||
|
||||
// Limites del movimiento
|
||||
if (x < 0) x = 0;
|
||||
if (x > 767) x = 767;
|
||||
if (y < 0) y = 0;
|
||||
if (y > 511) y = 511;
|
||||
// Update OAM array
|
||||
NF_SpriteOamSet(1);
|
||||
|
||||
// Posicion del fondo
|
||||
bg_x = (x - 128);
|
||||
if (bg_x < 0) bg_x = 0;
|
||||
if (bg_x > 512) bg_x = 512;
|
||||
bg_y = (y - 96);
|
||||
if (bg_y < 0) bg_y = 0;
|
||||
if (bg_y > 320) bg_y = 320;
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
|
||||
// Posicion del Sprite
|
||||
spr_x = (x - bg_x) - 4;
|
||||
spr_y = (y - bg_y) - 4;
|
||||
NF_MoveSprite(1, 0, spr_x, spr_y);
|
||||
// Update OAM
|
||||
oamUpdate(&oamSub);
|
||||
|
||||
// Imprime la posicion del cursor
|
||||
sprintf(mytext,"x:%d y:%d ", x, y);
|
||||
NF_WriteText(0, 2, 1, 1, mytext);
|
||||
|
||||
// Imprime el nº de tile
|
||||
switch (NF_GetTile(0, x, y)) {
|
||||
case 0:
|
||||
sprintf(mytext,"Tile: Vacio / Void ");
|
||||
break;
|
||||
case 1:
|
||||
sprintf(mytext,"Tile: Rojo / Red ");
|
||||
break;
|
||||
case 2:
|
||||
sprintf(mytext,"Tile: Verde / Green ");
|
||||
break;
|
||||
case 3:
|
||||
sprintf(mytext,"Tile: Azul / Blue ");
|
||||
break;
|
||||
}
|
||||
NF_WriteText(0, 2, 1, 3, mytext);
|
||||
|
||||
NF_UpdateTextLayers(); // Actualiza las capas de texto
|
||||
NF_SpriteOamSet(1); // Actualiza el Array del OAM
|
||||
|
||||
swiWaitForVBlank(); // Espera al sincronismo vertical
|
||||
|
||||
oamUpdate(&oamSub); // Actualiza a VRAM el OAM Secundario
|
||||
|
||||
NF_ScrollBg(1, 2, bg_x, bg_y); // Actualiza el scroll
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
// Update background scroll
|
||||
NF_ScrollBg(1, 2, bg_x, bg_y);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,200 +1,163 @@
|
||||
// SPDX-License-Identifier: CC0-1.0
|
||||
//
|
||||
// SPDX-FileContributor: NightFox & Co., 2009-2011
|
||||
//
|
||||
// "Reveal" effect
|
||||
// http://www.nightfoxandco.com
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
|
||||
NightFox's Lib Template
|
||||
Efecto de "revelado"
|
||||
|
||||
Requiere DevkitARM
|
||||
Requiere NightFox's Lib
|
||||
|
||||
Codigo por NightFox
|
||||
http://www.nightfoxandco.com
|
||||
Inicio 10 de Octubre del 2009
|
||||
|
||||
-------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
Includes
|
||||
-------------------------------------------------
|
||||
*/
|
||||
|
||||
// Includes C
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
|
||||
// Includes propietarios NDS
|
||||
#include <nds.h>
|
||||
#include <filesystem.h>
|
||||
|
||||
// Includes librerias propias
|
||||
#include <nf_lib.h>
|
||||
|
||||
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. Use mode 0 in the top screen, and
|
||||
// mode 5 in the bottom screen.
|
||||
NF_Set2D(0, 0);
|
||||
NF_Set2D(1, 5);
|
||||
|
||||
// Initialize tiled backgrounds system in the top screen
|
||||
NF_InitTiledBgBuffers(); // Initialize storage buffers
|
||||
NF_InitTiledBgSys(0);
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
Main() - Bloque general del programa
|
||||
-------------------------------------------------
|
||||
*/
|
||||
// Initialize bitmap backgrounds system in the bottom screen
|
||||
NF_Init8bitsBgBuffers(); // Initialize storage buffers
|
||||
NF_InitBitmapBgSys(1, 0); // Initialize 8-bit bitmap backgrounds
|
||||
NF_Init8bitsBackBuffer(1); // Initialize backbuffer
|
||||
NF_Enable8bitsBackBuffer(1); // Enable backbuffer
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
// Initialize sprite system in the bottom screen
|
||||
NF_InitSpriteBuffers(); // Initialize storage buffers
|
||||
NF_InitSpriteSys(1);
|
||||
|
||||
// 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();
|
||||
// Load tiled background files from NitroFS
|
||||
NF_LoadTiledBg("bg/nfl", "nfl", 256, 256);
|
||||
|
||||
// Define el ROOT e inicializa el sistema de archivos
|
||||
nitroFSInit(NULL);
|
||||
NF_SetRootFolder("NITROFS"); // Define la carpeta ROOT para usar NITROFS
|
||||
// Load bitmap background files from NitroFS
|
||||
NF_Load8bitsBg("bg/img8b_1", 0);
|
||||
NF_Load8bitsBg("bg/img8b_2", 1);
|
||||
|
||||
// Inicializa el motor 2D
|
||||
NF_Set2D(0, 0); // Modo 2D_0 en la pantalla superior
|
||||
NF_Set2D(1, 5); // Modo 2D_5 en la pantalla superior
|
||||
// Load sprite files from NitroFS
|
||||
NF_LoadSpriteGfx("spr/bola", 0, 32, 32);
|
||||
NF_LoadSpritePal("spr/bola", 0);
|
||||
|
||||
// Inicializa los fondos tileados (Pantalla superior)
|
||||
NF_InitTiledBgBuffers(); // Inicializa los buffers para almacenar fondos
|
||||
NF_InitTiledBgSys(0); // Inicializa los fondos Tileados para la pantalla superior
|
||||
// Create bottom screen background
|
||||
NF_CreateTiledBg(0, 3, "nfl");
|
||||
|
||||
// Inicializa los fondos en modo "BITMAP" (Pantalla inferior)
|
||||
NF_Init8bitsBgBuffers(); // Inicializa los buffers para almacenar fondos
|
||||
NF_InitBitmapBgSys(1, 0); // Inicializa los fondos bitmap de 8 bits
|
||||
NF_Init8bitsBackBuffer(1); // Inicializa el BackBuffer
|
||||
NF_Enable8bitsBackBuffer(1); // Habilita el BackBuffer en la pantalla inferior
|
||||
// Transfer image to the backbuffer of the top screen
|
||||
NF_Copy8bitsBuffer(1, 2, 1);
|
||||
// Transfer image to layer 3 of the top screen
|
||||
NF_Copy8bitsBuffer(1, 1, 0);
|
||||
// Copy backbuffer of the top screen to layer 2
|
||||
NF_Flip8bitsBackBuffer(1, 0);
|
||||
|
||||
// Inicializa los Sprites
|
||||
NF_InitSpriteBuffers(); // Inicializa los buffers para almacenar sprites y paletas
|
||||
NF_InitSpriteSys(1); // Inicializa los sprites para la pantalla inferior
|
||||
// Transfer the required sprites to VRAM
|
||||
NF_VramSpriteGfx(1, 0, 0, true);
|
||||
NF_VramSpritePal(1, 0, 0);
|
||||
|
||||
// Carga los archivos de tiles desde la FAT / NitroFS a la RAM
|
||||
NF_LoadTiledBg("bg/nfl", "nfl", 256, 256);
|
||||
// Set random seed based on the current time
|
||||
srand(time(NULL));
|
||||
|
||||
// Carga el archivo BITMAP de imagen en formato RAW a la RAM
|
||||
NF_Load8bitsBg("bg/img8b_1", 0);
|
||||
NF_Load8bitsBg("bg/img8b_2", 1);
|
||||
// State of the balls
|
||||
s16 bola_x[32];
|
||||
s16 bola_y[32];
|
||||
s8 bola_spx[32];
|
||||
s8 bola_spy[32];
|
||||
|
||||
// Carga los archivos de sprites desde la FAT / NitroFS a la RAM
|
||||
NF_LoadSpriteGfx("spr/bola", 0, 32, 32); // Bola azul
|
||||
NF_LoadSpritePal("spr/bola", 0);
|
||||
for (int n = 0; n < 32; n ++)
|
||||
{
|
||||
bola_x[n] = rand() % 223;
|
||||
bola_y[n] = rand() % 159;
|
||||
bola_spx[n] = (rand() % 3) + 1;
|
||||
bola_spy[n] = (rand() % 3) + 1;
|
||||
NF_CreateSprite(1, n, 0, 0, bola_x[n], bola_y[n]);
|
||||
NF_SpriteLayer(1, n, 3);
|
||||
}
|
||||
|
||||
// Crea los fondos de la pantalla superior
|
||||
NF_CreateTiledBg(0, 3, "nfl");
|
||||
while (1)
|
||||
{
|
||||
// Read keys and touchscreen
|
||||
scanKeys();
|
||||
touchPosition touchscreen;
|
||||
touchRead(&touchscreen);
|
||||
u16 keys_held = keysHeld();
|
||||
u16 keys_down = keysDown();
|
||||
|
||||
// Tranfiere las imagenes a la pantalla superior, backbuffer
|
||||
NF_Copy8bitsBuffer(1, 2, 1);
|
||||
// Tranfiere las imagenes a la pantalla superior, capa 3
|
||||
NF_Copy8bitsBuffer(1, 1, 0);
|
||||
// Copia el BackBuffer de la pantalla superior a la capa 2
|
||||
NF_Flip8bitsBackBuffer(1, 0);
|
||||
// Check if the touch screen is pressed
|
||||
if (keys_held & KEY_TOUCH)
|
||||
{
|
||||
int x = touchscreen.px - 8;
|
||||
if (x < 0)
|
||||
x = 0;
|
||||
if (x > 239)
|
||||
x = 239;
|
||||
|
||||
// Transfiere a la VRAM los sprites necesarios
|
||||
NF_VramSpriteGfx(1, 0, 0, true); // Bola (todos los frames en VRAM) Pantalla superior
|
||||
NF_VramSpritePal(1, 0, 0);
|
||||
int y = touchscreen.py - 8;
|
||||
if (y < 0)
|
||||
y = 0;
|
||||
if (y > 175)
|
||||
y = 175;
|
||||
|
||||
// Variables generales y inicializacion del random
|
||||
u8 n = 0;
|
||||
srand(time(NULL));
|
||||
// Draw a 16x16 block around the touchscreen coordinates in the
|
||||
// bottom screen.
|
||||
for (int dy = 0; dy < 16; dy ++)
|
||||
{
|
||||
for (int dx = 0; dx < 16; dx ++)
|
||||
{
|
||||
u16 idx = ((y + dy) << 8) + (x + dx);
|
||||
NF_8BITS_BACKBUFFER[1].data[idx] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Crea las bolas en la pantalla superior
|
||||
s16 bola_x[32];
|
||||
s16 bola_y[32];
|
||||
s8 bola_spx[32];
|
||||
s8 bola_spy[32];
|
||||
for (n = 0; n < 32; n ++) {
|
||||
bola_x[n] = (rand() % 223);
|
||||
bola_y[n] = (rand() % 159);
|
||||
bola_spx[n] = (rand() % 3) + 1;
|
||||
bola_spy[n] = (rand() % 3) + 1;
|
||||
NF_CreateSprite(1, n, 0, 0, bola_x[n], bola_y[n]);
|
||||
NF_SpriteLayer(1, n, 3);
|
||||
}
|
||||
// Press X to reload the top screen image
|
||||
if (keys_down & KEY_B)
|
||||
NF_Copy8bitsBuffer(1, 2, 1);
|
||||
|
||||
// Variables del control del touchpad
|
||||
u16 keys = 0;
|
||||
touchPosition touchscreen;
|
||||
s16 x = 0;
|
||||
s16 y = 0;
|
||||
// Copy bottom screen backbuffer to layer 2
|
||||
NF_Flip8bitsBackBuffer(1, 0);
|
||||
|
||||
// Control del dibujado
|
||||
u16 idx = 0;
|
||||
u16 dx = 0;
|
||||
u16 dy = 0;
|
||||
// Move the sprites
|
||||
for (int n = 0; n < 32; n ++)
|
||||
{
|
||||
bola_x[n] += bola_spx[n];
|
||||
if ((bola_x[n] < 0) || (bola_x[n] > 223))
|
||||
bola_spx[n] *= -1;
|
||||
|
||||
// Repite para siempre
|
||||
while (1) {
|
||||
bola_y[n] += bola_spy[n];
|
||||
if ((bola_y[n] < 0) || (bola_y[n] > 159))
|
||||
bola_spy[n] *= -1;
|
||||
|
||||
// Lectura de posicion del stylus
|
||||
scanKeys(); // Lee el touchpad via Libnds
|
||||
touchRead(&touchscreen);
|
||||
keys = keysHeld(); // Verifica el estado del touchscreen
|
||||
NF_MoveSprite(1, n, bola_x[n], bola_y[n]);
|
||||
}
|
||||
|
||||
// Si presionas sobre el keypad...
|
||||
if (keys & KEY_TOUCH) {
|
||||
// Update OAM array
|
||||
NF_SpriteOamSet(1);
|
||||
|
||||
// Lee el touchpad
|
||||
x = (touchscreen.px - 8);
|
||||
if (x < 0) x = 0;
|
||||
if (x > 239) x = 239;
|
||||
y = ((touchscreen.py - 8));
|
||||
if (y < 0) y = 0;
|
||||
if (y > 175) y = 175;
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
|
||||
// Borra un bloque de 16x16
|
||||
for (dy = 0; dy < 16; dy ++) {
|
||||
for (dx = 0; dx < 16; dx ++) {
|
||||
idx = ((y + dy) << 8) + (x + dx);
|
||||
// Pantalla inferior
|
||||
NF_8BITS_BACKBUFFER[1].data[idx] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Lee las teclas pulsadas
|
||||
keys = keysDown();
|
||||
|
||||
// Presiona X restaura imagen superior
|
||||
if (keys & KEY_B) NF_Copy8bitsBuffer(1, 2, 1);
|
||||
|
||||
// Copia el BackBuffer de la pantalla inferior a la capa 2
|
||||
NF_Flip8bitsBackBuffer(1, 0);
|
||||
|
||||
// Mueve las bolas
|
||||
for (n = 0; n < 32; n ++) {
|
||||
bola_x[n] += bola_spx[n];
|
||||
if ((bola_x[n] < 0) || (bola_x[n] > 223)) bola_spx[n] *= -1;
|
||||
bola_y[n] += bola_spy[n];
|
||||
if ((bola_y[n] < 0) || (bola_y[n] > 159)) bola_spy[n] *= -1;
|
||||
NF_MoveSprite(1, n, bola_x[n], bola_y[n]);
|
||||
}
|
||||
|
||||
// Actualiza el array de OAM
|
||||
NF_SpriteOamSet(1);
|
||||
|
||||
swiWaitForVBlank(); // Espera al sincronismo vertical
|
||||
|
||||
// Actualiza el OAM
|
||||
oamUpdate(&oamSub);
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
// Update OAM
|
||||
oamUpdate(&oamSub);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -137,7 +137,8 @@ int main(int argc, char **argv)
|
||||
angle -= 2048;
|
||||
}
|
||||
|
||||
swiWaitForVBlank(); // Wait for the screen refresh
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
|
||||
// Update parameters of the affine backgrounds
|
||||
for (int n = 0; n < 2; n ++)
|
||||
|
@ -60,7 +60,7 @@ int main(int argc, char **argv)
|
||||
while (1)
|
||||
{
|
||||
scanKeys(); // Read keypad
|
||||
uint16_t keys = keysHeld(); // Keys currently pressed
|
||||
u16 keys = keysHeld(); // Keys currently pressed
|
||||
|
||||
// If pressing left
|
||||
if (keys & KEY_LEFT)
|
||||
@ -82,7 +82,8 @@ int main(int argc, char **argv)
|
||||
bg_x[1] = (int)(bg_x[0] / 1.5);
|
||||
bg_x[2] = (int)(bg_x[1] / 1.5);
|
||||
|
||||
swiWaitForVBlank(); // Wait for the screen refresh
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
|
||||
// Update background scroll during vertical blanking to avoid tearing
|
||||
for (int n = 0; n < 4; n ++)
|
||||
|
@ -78,7 +78,8 @@ int main(int argc, char **argv)
|
||||
NF_Copy16bitsBuffer(1, 1, 0); // Background
|
||||
NF_Draw16bitsImage(1, 1, x, y, true); // Ball (magenta is transparent)
|
||||
|
||||
swiWaitForVBlank(); // Wait for the screen refresh
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
|
||||
// Send backbuffers to the screen
|
||||
NF_Flip16bitsBackBuffer(0);
|
||||
|
@ -36,7 +36,7 @@ int main(int argc, char **argv)
|
||||
NF_InitTiledBgSys(0); // Top screen
|
||||
NF_InitTiledBgSys(1); // Bottom screen
|
||||
|
||||
// Initialize sprite backgrounds system
|
||||
// Initialize sprite system
|
||||
NF_InitSpriteBuffers(); // Initialize storage buffers
|
||||
NF_InitSpriteSys(0); // Top screen
|
||||
NF_InitSpriteSys(1); // Bottom screen
|
||||
@ -134,7 +134,8 @@ int main(int argc, char **argv)
|
||||
NF_SpriteOamSet(0);
|
||||
NF_SpriteOamSet(1);
|
||||
|
||||
swiWaitForVBlank(); // Wait for the screen refresh
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
|
||||
// Update OAM
|
||||
oamUpdate(&oamMain);
|
||||
|
@ -93,7 +93,8 @@ int main(int argc, char **argv)
|
||||
NF_Draw16bitsImage(1, img2, 0, 0, false);
|
||||
}
|
||||
|
||||
swiWaitForVBlank(); // Wait for the screen refresh
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
|
||||
// Send backbuffers to the screen
|
||||
NF_Flip16bitsBackBuffer(0);
|
||||
|
@ -155,7 +155,8 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
swiWaitForVBlank(); // Wait for the screen refresh
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
|
||||
// Send backbuffer to the screen
|
||||
NF_Flip16bitsBackBuffer(0);
|
||||
|
@ -92,7 +92,8 @@ int main(int argc, char **argv)
|
||||
if (newpress & KEY_L)
|
||||
NF_PlayRawSound(0, 127, 0, false, 0);
|
||||
|
||||
swiWaitForVBlank(); // Wait for the screen refresh
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1,404 +1,350 @@
|
||||
// SPDX-License-Identifier: CC0-1.0
|
||||
//
|
||||
// SPDX-FileContributor: NightFox & Co., 2010
|
||||
//
|
||||
// Basic UDP communications example.
|
||||
// http://www.nightfoxandco.com
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
|
||||
NightFox's Lib Template
|
||||
Ejemplo basico comunicacion con el protocolo UDP
|
||||
|
||||
Requiere DevkitARM
|
||||
Requiere NightFox's Lib
|
||||
|
||||
Codigo por NightFox
|
||||
http://www.nightfoxandco.com
|
||||
Inicio 10 de Octubre del 2009
|
||||
|
||||
-------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
Includes
|
||||
-------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
// Includes propietarios NDS
|
||||
#include <nds.h>
|
||||
|
||||
// Includes C++
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
// Includes propios
|
||||
#include <nf_lib.h>
|
||||
#include "nf_wifi.h"
|
||||
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
Defines
|
||||
-------------------------------------------------
|
||||
*/
|
||||
#include <nf_wifi.h>
|
||||
|
||||
#define myport 22334
|
||||
|
||||
char server_ip[18]; // Guarda la IP del servidor
|
||||
char server_ip[18]; // Stores the IP of the server
|
||||
|
||||
bool _ConnectWIFI(void); // Conectate al punto de acceso por defecto
|
||||
u8 _SelectMode(void); // Servidor o cliente
|
||||
s16 _SendData(const char* mydata); // Envia datos por el canal abierto
|
||||
s16 _GetData(void); // Recibe datos por el canal abierto
|
||||
s16 _LookForServer(void); // Busca un servidor al que conectarse
|
||||
// Tries to connect to the default access point
|
||||
bool ConnectWIFI(void)
|
||||
{
|
||||
bool status = false;
|
||||
|
||||
printf("Conectando via WFC...\n\n");
|
||||
swiWaitForVBlank();
|
||||
|
||||
if (NF_WiFiConnectDefaultAp())
|
||||
{
|
||||
// Return connection parameters
|
||||
printf("Conexion realizada.\n\n");
|
||||
printf("IP : %s\n", inet_ntoa(NF_IP));
|
||||
printf("Gateway: %s\n", inet_ntoa(NF_GATEWAY));
|
||||
printf("Mask : %s\n", inet_ntoa(NF_MASK));
|
||||
printf("DNS1 : %s\n", inet_ntoa(NF_DNS1));
|
||||
printf("DNS2 : %s\n\n", inet_ntoa(NF_DNS2));
|
||||
|
||||
// Success
|
||||
status = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Error
|
||||
printf("Conexion no establecida\n");
|
||||
}
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
Main() - Bloque general del programa
|
||||
-------------------------------------------------
|
||||
*/
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
u8 modo = 0; // Cliente (1) - Servidor (2)
|
||||
u16 keys = 0; // Lectura del teclado
|
||||
|
||||
u32 contador = 0;
|
||||
char temp[256];
|
||||
bool loop = true;
|
||||
bool senddata = true;
|
||||
|
||||
// Inicializa las 2D
|
||||
NF_Set2D(0, 0); // Modo 2D_0 en la pantalla superior
|
||||
NF_Set2D(1, 0); // Modo 2D_0 en la pantalla inferior
|
||||
|
||||
// Inicializa la consola de texto
|
||||
consoleDemoInit();
|
||||
consoleClear();
|
||||
|
||||
// Intenta conectarte al WFC...
|
||||
if (_ConnectWIFI()) {
|
||||
|
||||
// Selecciona si seras servidor o cliente
|
||||
modo = _SelectMode();
|
||||
|
||||
// Inicia como servidor o cliente
|
||||
if (modo == 1) {
|
||||
// Cliente
|
||||
if (_LookForServer() > 0) {
|
||||
//if (1) {
|
||||
NF_WIFI_CreateUdpSender(server_ip, myport);
|
||||
} else {
|
||||
loop = false;
|
||||
}
|
||||
} else {
|
||||
// Servidor
|
||||
NF_WIFI_CreateUdpListener(myport);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Envia o recive datos hasta cancelar la transmision
|
||||
while (loop) {
|
||||
|
||||
// Lee el teclado
|
||||
scanKeys();
|
||||
keys = keysDown();
|
||||
|
||||
if (modo == 1) { // Envio de datos al servidor
|
||||
|
||||
// Si pulsas A, envia datos
|
||||
if (keys & KEY_A) senddata = true;
|
||||
// Si pulsas B, pausa el envio
|
||||
if (keys & KEY_B) senddata = false;
|
||||
// Si pulsas X, resetea el contador
|
||||
if (keys & KEY_X) contador = 0;
|
||||
// Si se pulsa R, sal
|
||||
if (keys & KEY_R) loop = false;
|
||||
|
||||
|
||||
|
||||
if (senddata) {
|
||||
|
||||
if (loop) {
|
||||
// Debes enviar datos...
|
||||
sprintf(temp, "%05lu", contador);
|
||||
} else {
|
||||
// o la señal de salida?
|
||||
sprintf(temp, "Exit");
|
||||
}
|
||||
|
||||
// Envia y verifica si se han recibido
|
||||
printf("Envio: %s\n", temp);
|
||||
if (_SendData(temp) > 0) {
|
||||
// Imprime los datos recibidos
|
||||
printf("Verificado: %s\n\n", NF_RECV_BUFFER);
|
||||
// Incrementa el valor
|
||||
contador ++;
|
||||
if (contador > 9999) contador = 0;
|
||||
} else {
|
||||
printf("Error de envio.\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
} else { // Recepcion de datos desde el cliente
|
||||
|
||||
// Si se pulsa R, sal
|
||||
if (keys & KEY_R) loop = false;
|
||||
|
||||
// Recibe los datos
|
||||
if (_GetData() > 0) {
|
||||
// Imprime los datos recibidos
|
||||
printf("Recivido: %s\n", NF_RECV_BUFFER);
|
||||
// Si has recibido la señal de salida...
|
||||
if (strcmp(NF_RECV_BUFFER, "Exit") == 0) loop = false;
|
||||
} else {
|
||||
// Si no hay datos, esperalos
|
||||
printf("Esperando datos...\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Espera al sincronismo vertical
|
||||
swiWaitForVBlank();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Cierra el socket
|
||||
close(NF_SOCKET);
|
||||
|
||||
// Deten el WIFI
|
||||
NF_WiFiDisconnectAp();
|
||||
|
||||
// Informa
|
||||
printf("\nSesion finalizada\n");
|
||||
|
||||
while (1) {
|
||||
swiWaitForVBlank();
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
|
||||
swiWaitForVBlank();
|
||||
return status;
|
||||
}
|
||||
|
||||
// Wait for the user to select client (1) or server (2) mode.
|
||||
u8 SelectMode(void)
|
||||
{
|
||||
u8 modo = 0;
|
||||
|
||||
printf("A - Cliente\nB - Servidor\n");
|
||||
swiWaitForVBlank();
|
||||
|
||||
while (modo == 0)
|
||||
{
|
||||
scanKeys();
|
||||
u16 keys = keysDown();
|
||||
|
||||
if (keys & KEY_A)
|
||||
modo = 1;
|
||||
if (keys & KEY_B)
|
||||
modo = 2;
|
||||
|
||||
/*
|
||||
-------------------------------------------------
|
||||
Funciones
|
||||
-------------------------------------------------
|
||||
*/
|
||||
|
||||
// Intenta conectarte al punto de acceso por defecto
|
||||
bool _ConnectWIFI(void) {
|
||||
|
||||
bool status = false;
|
||||
|
||||
// Intenta conectarte al AP...
|
||||
printf("Conectando via WFC...\n\n");
|
||||
swiWaitForVBlank();
|
||||
|
||||
if (NF_WiFiConnectDefaultAp()) {
|
||||
|
||||
// Devuelve los parametros de la conexion TCP/IP con el AP
|
||||
printf("Conexion realizada.\n\n");
|
||||
printf("Ip : %s\n", inet_ntoa(NF_IP));
|
||||
printf("Gateway: %s\n", inet_ntoa(NF_GATEWAY));
|
||||
printf("Mask : %s\n", inet_ntoa(NF_MASK));
|
||||
printf("Dns1 : %s\n", inet_ntoa(NF_DNS1));
|
||||
printf("Dns2 : %s\n\n", inet_ntoa(NF_DNS2));
|
||||
|
||||
// Marca como conectado
|
||||
status = true;
|
||||
|
||||
} else {
|
||||
|
||||
// No se ha podido conectar
|
||||
printf("Conexion no establecida\n");
|
||||
|
||||
}
|
||||
|
||||
swiWaitForVBlank();
|
||||
return status;
|
||||
swiWaitForVBlank();
|
||||
}
|
||||
|
||||
return modo;
|
||||
}
|
||||
|
||||
// Send data through the open channel
|
||||
s16 SendData(const char *mydata)
|
||||
{
|
||||
bool checksum = false;
|
||||
bool timeout = false;
|
||||
s32 status = 0;
|
||||
char buffer[NF_WIFI_BUFFER_SIZE];
|
||||
|
||||
// Copy data to a temporary buffer
|
||||
sprintf(buffer, "%s", mydata);
|
||||
|
||||
// Selecciona si seras Cliente (1) o Servidor (2)
|
||||
u8 _SelectMode(void) {
|
||||
while (!checksum && !timeout)
|
||||
{
|
||||
// Send data using UDP
|
||||
NF_WIFI_UdpSend(buffer);
|
||||
|
||||
u8 modo = 0;
|
||||
u16 keys = 0;
|
||||
// Wait for the confirmation from the other end with a 600 ms timeout
|
||||
status = NF_WIFI_UdpListen(600000);
|
||||
|
||||
printf("A - Cliente\nB - Servidor\n");
|
||||
swiWaitForVBlank();
|
||||
|
||||
while (modo == 0) {
|
||||
scanKeys();
|
||||
keys = keysDown();
|
||||
if (keys & KEY_A) modo = 1;
|
||||
if (keys & KEY_B) modo = 2;
|
||||
swiWaitForVBlank();
|
||||
}
|
||||
|
||||
return modo;
|
||||
// Do a data checksum
|
||||
if (status > 0)
|
||||
{
|
||||
if ((strcmp(NF_SEND_BUFFER, NF_RECV_BUFFER) == 0))
|
||||
{
|
||||
checksum = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
checksum = true;
|
||||
status = -1; // Checksum error
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
timeout = true;
|
||||
status = -2; // Timed out
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
// Receive data from the open channel
|
||||
s16 GetData(void)
|
||||
{
|
||||
// Listen to data with a 300 millisecond timeout
|
||||
s32 status = NF_WIFI_UdpListen(300000);
|
||||
|
||||
// If any data has been received, return them to the sender to check them
|
||||
if (status > 0)
|
||||
NF_WIFI_UdpSend(NF_RECV_BUFFER);
|
||||
|
||||
// Envia datos por el canal abierto
|
||||
s16 _SendData(const char* mydata) {
|
||||
|
||||
// Variables
|
||||
bool checksum = false;
|
||||
bool timeout = false;
|
||||
s32 status = 0;
|
||||
char buffer[NF_WIFI_BUFFER_SIZE];
|
||||
|
||||
// Copia los datos al buffer
|
||||
sprintf(buffer, "%s", mydata);
|
||||
|
||||
while (!checksum && !timeout) {
|
||||
// Envia los datos por UDP
|
||||
NF_WIFI_UdpSend(buffer);
|
||||
// Espera la confirmacion de los datos
|
||||
status = NF_WIFI_UdpListen(600000); // Time out 600 milisegundos
|
||||
// Realiza un checksum de los datos
|
||||
if (status > 0) {
|
||||
if ((strcmp(NF_SEND_BUFFER, NF_RECV_BUFFER) == 0)) {
|
||||
// Si el envio es correcto, continua
|
||||
checksum = true;
|
||||
} else {
|
||||
checksum = true;
|
||||
status = -1; // Error de checksum
|
||||
}
|
||||
} else {
|
||||
timeout = true;
|
||||
status = -2; // Time out
|
||||
}
|
||||
}
|
||||
|
||||
// Devuelve el estado
|
||||
return status;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
// Scans all IPs in the specified range to look for a server to connect to.
|
||||
s16 LookForServer(void)
|
||||
{
|
||||
// Variables locales
|
||||
char myip[18];
|
||||
char temp[64];
|
||||
|
||||
u16 p = 0;
|
||||
|
||||
// Recibe datos por el canal abierto
|
||||
s16 _GetData(void) {
|
||||
bool loop = true;
|
||||
s8 status = 0;
|
||||
|
||||
// Variables
|
||||
s32 status = 0;
|
||||
// Get the local IP and extract its range (for example, "192.168.0.")
|
||||
sprintf(temp, "%s", inet_ntoa(NF_IP));
|
||||
for (int n = 0; n < strlen(temp); n ++)
|
||||
{
|
||||
myip[n] = temp[n];
|
||||
char c = temp[n];
|
||||
|
||||
// Espera los datos
|
||||
status = NF_WIFI_UdpListen(300000); // Time out 300 milisegundos
|
||||
if (c == '.')
|
||||
{
|
||||
p++;
|
||||
|
||||
// Si se han recibido datos, devuelvelos para su verificacion
|
||||
if (status > 0) NF_WIFI_UdpSend(NF_RECV_BUFFER);
|
||||
// If this is the third dot, end the string
|
||||
if (p == 3)
|
||||
{
|
||||
myip[n + 1] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Devuelve el estado
|
||||
return status;
|
||||
// Scan all possible IPs
|
||||
p = 0;
|
||||
|
||||
for (int n = 1; n < 255; n ++)
|
||||
{
|
||||
scanKeys();
|
||||
u16 keys = keysDown();
|
||||
|
||||
// Generate IP
|
||||
sprintf(temp, "%s%d", myip, n);
|
||||
printf("%s ", temp);
|
||||
swiWaitForVBlank();
|
||||
|
||||
// Create sender socket
|
||||
NF_WIFI_CreateUdpSender(temp, myport);
|
||||
|
||||
// Send data and verify that it has been received
|
||||
loop = true;
|
||||
while (loop)
|
||||
{
|
||||
status = SendData("HANDSHAKE");
|
||||
if (status > 0)
|
||||
{
|
||||
// Print received data
|
||||
printf("Encontrado.\n");
|
||||
|
||||
// Save its value
|
||||
sprintf(server_ip, temp);
|
||||
p = n;
|
||||
n = 255;
|
||||
loop = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Timed out.\n");
|
||||
if (status == -2)
|
||||
loop = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Close the socket
|
||||
close(NF_SOCKET);
|
||||
|
||||
// If the user wants to cancel, exit
|
||||
if (keys & KEY_R)
|
||||
break;
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
u8 modo = 0; // Client (1) - Server (2)
|
||||
|
||||
u32 contador = 0;
|
||||
char temp[256];
|
||||
bool loop = true;
|
||||
bool senddata = true;
|
||||
|
||||
// Escanea el rango de IP's para encontrar el servidor
|
||||
s16 _LookForServer(void) {
|
||||
// Initialize 2D engine in both screens and use mode 0
|
||||
NF_Set2D(0, 0);
|
||||
NF_Set2D(1, 0);
|
||||
|
||||
// Variables locales
|
||||
char myip[18];
|
||||
char temp[64];
|
||||
char character[2];
|
||||
// Initialize demo text console
|
||||
consoleDemoInit();
|
||||
|
||||
u16 n = 0;
|
||||
u16 p = 0;
|
||||
// Try to connect to the WiFi access point
|
||||
if (ConnectWIFI())
|
||||
{
|
||||
// Ask the user if this console is a server or a client
|
||||
modo = SelectMode();
|
||||
|
||||
bool loop = true;
|
||||
s8 status = 0;
|
||||
if (modo == 1)
|
||||
{
|
||||
// Run as client
|
||||
if (LookForServer() > 0)
|
||||
NF_WIFI_CreateUdpSender(server_ip, myport);
|
||||
else
|
||||
loop = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Run as server
|
||||
NF_WIFI_CreateUdpListener(myport);
|
||||
}
|
||||
|
||||
u16 keys = 0;
|
||||
// Send or receive data until the transmission is cancelled
|
||||
while (loop)
|
||||
{
|
||||
scanKeys();
|
||||
u16 keys = keysDown();
|
||||
|
||||
// Guarda la direccion IP local (su rango, por ejemplo "192.168.0."
|
||||
sprintf(temp, "%s", inet_ntoa(NF_IP));
|
||||
for (n = 0; n < (strlen(temp)); n ++) {
|
||||
// Copia el caracter
|
||||
memcpy((myip + n), (temp + n), 1);
|
||||
memcpy(character, (temp + n), 1);
|
||||
character[1] = '\0';
|
||||
// Si es un punto...
|
||||
if (strcmp(character, ".") == 0) {
|
||||
p ++;
|
||||
// Si es el 3er punto...
|
||||
if (p == 3) {
|
||||
myip[(n + 1)] = '\0'; // Pon el caracter terminador
|
||||
n = strlen(temp); // Y termina
|
||||
}
|
||||
}
|
||||
}
|
||||
if (modo == 1)
|
||||
{
|
||||
// Send data to server
|
||||
|
||||
// Escanea todo el rango de IP's
|
||||
p = 0;
|
||||
// Send data when the user presses A
|
||||
if (keys & KEY_A)
|
||||
senddata = true;
|
||||
|
||||
for (n = 1; n < 255; n ++) {
|
||||
// Stop sending data when the user presses B
|
||||
if (keys & KEY_B)
|
||||
senddata = false;
|
||||
|
||||
// Lee el teclado
|
||||
scanKeys();
|
||||
keys = keysDown();
|
||||
// Reset counter when the user presses X
|
||||
if (keys & KEY_X)
|
||||
contador = 0;
|
||||
|
||||
// Calcula la IP
|
||||
sprintf(temp, "%s%d", myip, n);
|
||||
printf("%s ", temp);
|
||||
swiWaitForVBlank();
|
||||
// Exit if R is pressed
|
||||
if (keys & KEY_R)
|
||||
loop = false;
|
||||
|
||||
// Crea el socket de envio
|
||||
NF_WIFI_CreateUdpSender(temp, myport);
|
||||
if (senddata)
|
||||
{
|
||||
if (loop)
|
||||
{
|
||||
// Send data if the loop is active
|
||||
sprintf(temp, "%05lu", contador);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If not, send an exit string
|
||||
sprintf(temp, "Exit");
|
||||
}
|
||||
|
||||
// Envia y verifica si se han recibido
|
||||
loop = true;
|
||||
while (loop) {
|
||||
status = _SendData("HANDSHAKE");
|
||||
if (status > 0) {
|
||||
// Imprime los datos recibidos
|
||||
printf("Encontrado.\n");
|
||||
// Guarda el valor
|
||||
sprintf(server_ip, temp);
|
||||
p = n;
|
||||
n = 255;
|
||||
loop = false;
|
||||
} else {
|
||||
printf("Time Out.\n");
|
||||
if (status == -2) loop = false;
|
||||
}
|
||||
}
|
||||
// Send it and verify that it has been received
|
||||
printf("Envio: %s\n", temp);
|
||||
if (SendData(temp) > 0)
|
||||
{
|
||||
// Print the received data
|
||||
printf("Verificado: %s\n\n", NF_RECV_BUFFER);
|
||||
// Increment counter
|
||||
contador++;
|
||||
if (contador > 9999)
|
||||
contador = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Error de envio.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Data reception in the client
|
||||
|
||||
// Cierra el socket creado
|
||||
close(NF_SOCKET);
|
||||
// Exit loop if R is pressed
|
||||
if (keys & KEY_R)
|
||||
loop = false;
|
||||
|
||||
// Si pulsas cancelar
|
||||
if (keys & KEY_R) n = 255;
|
||||
// Receive data
|
||||
if (GetData() > 0)
|
||||
{
|
||||
// Print received data
|
||||
printf("Recivido: %s\n", NF_RECV_BUFFER);
|
||||
|
||||
}
|
||||
// If the exit signal has been received
|
||||
if (strcmp(NF_RECV_BUFFER, "Exit") == 0)
|
||||
loop = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// If there is nothing available, wait for data
|
||||
printf("Esperando datos...\n");
|
||||
}
|
||||
}
|
||||
|
||||
return p;
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
}
|
||||
}
|
||||
|
||||
// Close the socket
|
||||
close(NF_SOCKET);
|
||||
|
||||
// Stop WiFi
|
||||
NF_WiFiDisconnectAp();
|
||||
|
||||
printf("\nSesion finalizada\n");
|
||||
|
||||
while (1)
|
||||
{
|
||||
swiWaitForVBlank();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -19,7 +19,8 @@ int main(int argc, char **argv)
|
||||
|
||||
while (1)
|
||||
{
|
||||
swiWaitForVBlank(); // Wait for the screen refresh
|
||||
// Wait for the screen refresh
|
||||
swiWaitForVBlank();
|
||||
}
|
||||
|
||||
// If this is reached, the program will return to the loader if the loader
|
||||
|
Loading…
Reference in New Issue
Block a user