Popular channels

[Homebrew 3DS] Dibujando imágenes (Básico)

En esta parte veremos como dibujar una imagen con sf2dlib. Vas a ver que es muy sencillo, sin más que agregar, comenzamos.

Para crear una imagen que se pueda dibujar en nuestro Nintendo usaremos GIMP.
Vamos a Archivo > Nuevo... y hacemos una imagen de 400 X 240(Que son las dimensiones de la pantalla superior).


Si te aparece algún color de fondo, yo te recomiendo que lo quites para que puedas apreciar las transparencias.

Hagamos unos trazos sencillos, no necesitamos algo muy complejo por el momento.


Rellenamos el trazo de pasto.


Coloreamos el tronco.


Le ponemos hojas.


Y por el momento lo dejamos sin el color del cielo. Vamos a usar esa transparencia. con el dibujo terminado pasamos a exportarlo a un archivo .c. Vamos a Archivo > Exportar como... asignamos un nombre y le ponemos exportar.

El cuadro de diálogo que nos aparezca debemos dejarlo así:

recordando el Nombre con prefijo que hemos puesto.

Navegamos hasta donde tenemos nuestro archivo .c, en este caso dibujoSencillo.c, y lo abrimos con nuestro editor de texto favorito.

Debemos quitar la palabra reservada static y guardamos nuestro archivo.

Ahora pasamos a la programación :B

#include <3ds.h>
#include <sf2d.h>
#include <stdio.h>

extern const struct {
  unsigned int   width;
  unsigned int   height;
  unsigned int   bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ 
  unsigned char  pixel_data[400 * 240 * 4 + 1];
} fondoTaringa;

void cambiaColorFondo(u8* r, u8* g, u8* b, u8* a)
{
  static u8 i=0;

  *r=!(i%4)?*r+1:*r;
  *g=!(i%2)?*g+1:*g;
  *b=*b+1;
  *a=!(i%50)?*a+1:*a;
  printf("i:%d; r:%d; g:%d; b:%d; a:%d;n", i, *r, *g, *b, *a);
  sf2d_set_clear_color(RGBA8(*r, *g, *b, *a));

  i++;
}

int main()
{
  sf2d_init();
  u8 r, g, b, a;
  r=0x5A;
  g=0xAC;
  b=255;
  a=b;

  sf2d_texture* fondo = sf2d_create_texture_mem_RGBA8(fondoTaringa.pixel_data, fondoTaringa.width, fondoTaringa.height, TEXFMT_RGBA8, SF2D_PLACE_RAM);

  //esperamos sincronismo vertical
  sf2d_set_vblank_wait(1);

  consoleInit(GFX_BOTTOM, NULL);
  printf("Para salir, presiona Start");

  while (aptMainLoop())
  {
    hidScanInput();

    u32 kDown = hidKeysHeld();
    if (kDown & KEY_START)
      break;

    if(kDown & KEY_A)
      cambiaColorFondo(&r, &g, &b, &a);

    sf2d_start_frame(GFX_TOP, GFX_LEFT);
      sf2d_draw_texture(fondo, 0, 0);
    sf2d_end_frame();

    sf2d_swapbuffers();
  }

  sf2d_free_texture(fondo);

  sf2d_fini();
  return 0;
}


Vamos a desmenuzarlo.

#include <3ds.h>
#include <sf2d.h>
#include <stdio.h>

Esto esnuestro include de siempre pero agregando sf2dlib


extern const struct {
  unsigned int   width;
  unsigned int   height;
  unsigned int   bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ 
  unsigned char  pixel_data[400 * 240 * 4 + 1];
} fondoTaringa;

Esto es fundamental para cargar la imagen. ¿Recuerdas que removimos la palabra reservada static?
Si eres observador puedes ver que estamos declarando la misma estructura que se creó con GIMP. Puedes copiar esta parte de tu archivo .c para no tener errores al escribir, pero recuerda usar la palabra reservada extern antes de const struct.

¿Para qué sirve extern?
Muy buena pregunta. Con esto le decimos al compilador que no se preocupe por los datos, que existe en algún lugar de mi proyecto pero que no voy a faltar ninguna de las reglas sintácticas. Después el enlazador se va a encargar de resolver esto. Así que no olvides escribir extern ¡NUNCA!


void cambiaColorFondo(u8* r, u8* g, u8* b, u8* a)
{
  static u8 i=0;

  *r=!(i%4)?*r+1:*r;
  *g=!(i%2)?*g+1:*g;
  *b=*b+1;
  *a=!(i%50)?*a+1:*a;
  printf("i:%d; r:%d; g:%d; b:%d; a:%d;n", i, *r, *g, *b, *a);
  sf2d_set_clear_color(RGBA8(*r, *g, *b, *a));

  i++;
}

Esta función nos va a servir como ayuda para demostrar algo posteriormente. Vamos a cambiar el color de fondo.

Viene el main, lo que tenemos que conocer lo explico. El resto es muy fácil de entender, sin embargo, si tienes dudad usa los comentarios

Creamos una textura(la imagen que creamos) de tipo sf2d_texture; tenemos que decirle el tamaño, y la información que va a llevar.

sf2d_texture* fondo = sf2d_create_texture_mem_RGBA8(fondoTaringa.pixel_data, fondoTaringa.width, fondoTaringa.height, TEXFMT_RGBA8, SF2D_PLACE_RAM);


Laforma en que nosotros desplegamos imágenes por pantalla es mediante escenas(frames):
1.- Iniciamos un frame
2.- Dibujamos las texturas que queremos desplegar en pantalla
3.- Terminamos el frame
4.- Cambiamos buffer de frame

sf2d_start_frame(GFX_TOP, GFX_LEFT);
  sf2d_draw_texture(fondo, 0, 0);
sf2d_end_frame();

sf2d_swapbuffers();


Y por último, no olvides liberar la memoria que te dieron.

sf2d_free_texture(fondo);

sf2d_fini();




Bueno, eso es todo por ahora. No olvides que el índice es tu amigo.

0
0
0
0No comments yet