Anuncios Google

OSLib - Fondo y Sprite

Tutoriales Avanzados Homebrewmex

En esta lección pintaremos una imagen de fondo y encima pintaremos otra imagen que iremos moviendo con el pad y como en las lecciones anteriores pondré el main explicado y el SRC disponible. Entonces pasemos a lo que nos interesa: Aprender a programar.

Autor: klozz.

Procedimiento:

Primero comenzamos escribiendo el nombre del proyecto, el autor, la fecha de cuando se elaboro para así después de un tiempo puedan ver sus trabajos y ver como han evolucionado. También deberán recordar que pueden usar // o   /* */ para escribir comentarios.

//Leccion 3: Fondo y Sprite.
//Autor:Klozz
//importamos la libreria

Ahora lo más importante es incluir la librería en la cual estamos trabajando llamada OSLIB y para hacer eso se usa lo siguiente:

#include <oslib/oslib.h>

 

PSP_MODULE_INFO("nombre del homebrew o plugin",0 para homebrew 1 para PRX,1,1) los últimos son la versión, no por poner el 1 quiere decir que se compilara un plugin sino lo hacen desde el makefile se generara un eboot, el 1 es para que sea funcionalidad para plugin ya que estos trabajan en modo Kernel. (Igual puedo equivocarme y si así es pueden corregirme).

PSP_MODULE_INFO("Pintar Fondo y Sprite", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU)

Ahora declararemos los punteros para nuestras imágenes si tienes dudas sobre que son los punteros pasate por aquí.

OSL_IMAGE *fondo, *hongo;

Como todo programa debe tener un inicio y para C se utiliza el tipo de dato y el nombre main() (a esto le llamaremos método main o función main), desde donde se lea el main es donde comienza a leer el homebrew, de ahí parte para seguir el programa todo lo anterior no se toma en si como del programa.

NOTA: Y recordar que siempre hay una llave que habré “{” y una que cierra “}”

main() {

Se inicia la librería Oslib con el comando oslInit(0);

oslInit(0);

Iniciamos la parte gráfica indicando el formato de pixeles que queremos usar. Si queremos usar doble buffer: void oslInitGfx (int pixelFormat, int bDoubleBuffer); usaremos OSL_PF_8888 para una pantalla de 32 bits o OSL_PF_5650 para 16; 0 para buffer simple, 1 para buffer doble. Usaremos en este caso para una pantalla de 32 bits y de un solo buffer simple.

Ahora pondremos 1 para usar el doble buffer.

   oslInitGfx(OSL_PF_8888, 1);

Ahora indicaremos que un color se vuelva transparente en este caso rosa (RGB).

oslSetTransparentColor(RGB(255,0,255));// ya que el sprite trae un fondo rosa.

Ahora cargamos imágenes en la memoria.

 fondo = oslLoadImageFile("fondo.png", OSL_IN_RAM, OSL_PF_8888);//OSL_IN_VRAM para cargarla en la memoria vram
  hongo = oslLoadImageFile("hongo.png", OSL_IN_RAM, OSL_PF_8888);//La RAM es de 20mb pero mas lenta y la VRAM de 2mb y mas rapida

Ahora procedemos a desactivar el color transparente.

oslDisableTransparentColor();

Verificamos que todas las imágenes estén correctas.

if (!fondo || !hongo)
    oslDebug("No es posible cargar todas las imagenes requeridas");

Coordenadas donde aparecerá el Sprite.

      //coordenadas donde aparecera el sprite
      hongo->x = 200;
      hongo->y = 100;
 

Ahora comenzaremos el bucle principal que dice mientras estemos negando la salida hacer.

 while (!osl_quit)
   {

Ahora iniciamos que dibuje en pantalla.

 oslStartDrawing();

Leemos los botones.

 oslReadKeys();

Ahora hacemos el bucle para el movimiento del Sprite.

if (osl_keys->held.down) hongo->y += 2; //colocamos la imagen seta 2 pix mas arriba
      if (osl_keys->held.up) hongo->y -= 2; //2 pix mas abajo
      if (osl_keys->held.left) hongo->x -= 2; //2 pix mas a la izquierda
      if (osl_keys->held.right) hongo->x += 2; //2 pix mas a la derecha

Ahora detectamos si se sale de pantalla debemos verificar el tamaño de sprite es 74X74 y hacemos un bucle IF que en español es: SI; que si se cumple se hace lo que esta dentro del bucle.

 if (hongo->x < 0)
         hongo->x = 0;
 
      if (hongo->y < 0)
         hongo->y = 0;
 
      if (hongo->x > 406) //la pantalla de la psp hace 480x272. 480-74=406
         hongo->x = 406;
 
      if (hongo->y > 198) //272-74=198
         hongo->y = 198;

Ahora dibujamos las imágenes en la pantalla y para ello ponemos lo siguiente.

oslDrawImage(fondo);
    oslDrawImage(hongo);

Cerramos el modo dibujar.

oslEndDrawing();

Sincronizamos la pantalla.

oslSyncFrame();

Finalizamos el bucle while

 }

Finalizamos la parte gráfica.

oslEndGfx();

Sale directamente al XMB.

oslQuit();
   return 0;

Finalizamos el método main o el main del proyecto.

 }

Main.c

//Leccion 3: Fondo y Sprite.
//Autor:Klozz
//importamos la libreria
 
#include <oslib/oslib.h>
 
PSP_MODULE_INFO("Pintar Fondo y Sprite", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
 
//declaramos los punteros de nuestras imagenes
OSL_IMAGE *fondo, *hongo;
 
 
int main()
{
    //con esta linea la libreria ya se encarga de todos los callbacks
    oslInit(0);
 
   //OSL_PF_8888 para una pantalla de 32 bits o OSL_PF_5650 para 16
   //0 para buffer simple, 1 para buffer doble
    //Ahora pondremos 1 para que use doble buffer
oslInitGfx(OSL_PF_8888, 1);//si no ponemos doble buffer pasaran cosas raras como que el fondo se sobrepondra al sprite en algunos tramos
 
 
   //Indicamos el color que queremos como transparente (rosa) RGB
   oslSetTransparentColor(RGB(255,0,255));// ya que el sprite trae un fondo rosa.
 
   //cargamos las imagenes en memoria
 
   fondo = oslLoadImageFile("fondo.png", OSL_IN_RAM, OSL_PF_8888);//OSL_IN_VRAM para cargarla en la memoria vram
   hongo = oslLoadImageFile("hongo.png", OSL_IN_RAM, OSL_PF_8888);//La RAM es de 20mb pero mas lenta y la VRAM de 2mb y mas rapida
 
   //Desactiva el color transparente
   oslDisableTransparentColor();
 
   //Verificamos que todas las imagenes estan OK
   if (!fondo || !hongo)
      oslDebug("No es posible cargar todas las imagenes requeridas");
 
      //coordenadas donde aparecera el sprite
      hongo->x = 200;
      hongo->y = 100;
 
   //while principal
      while (!osl_quit)
   {
      //permite dibujar en pantalla
      oslStartDrawing();
 
      //leemos botones
      oslReadKeys();
 
      //movimiento del sprite
      if (osl_keys->held.down) hongo->y += 2; //colocamos la imagen seta 2 pix mas arriba
      if (osl_keys->held.up) hongo->y -= 2; //2 pix mas abajo
      if (osl_keys->held.left) hongo->x -= 2; //2 pix mas a la izquierda
      if (osl_keys->held.right) hongo->x += 2; //2 pix mas a la derecha
 
 
      //ahora detectaremos si se sale de la pantalla
      //hay que tener en cuenta el tamaño en pix del sprite (74x74)
      if (hongo->x < 0)
         hongo->x = 0;
 
      if (hongo->y < 0)
         hongo->y = 0;
 
      if (hongo->x > 406) //la pantalla de la psp hace 480x272. 480-74=406
         hongo->x = 406;
 
      if (hongo->y > 198) //272-74=198
         hongo->y = 198;
 
      //dibujamos las imagenes en la pantalla
      oslDrawImage(fondo);
      oslDrawImage(hongo);
 
      //cerramos el modo dibujar
      oslEndDrawing();
      //y sincronizamos pantalla
      oslSyncFrame();      
   }
 
 
    //finaliza la parte grafica
    oslEndGfx();
   //sale directamente al menu de la psp
    oslQuit();
    return 0;
}

Makefile

TARGET = Fondo
OBJS = main.o  
 
INCDIR =
CFLAGS = -G4 -Wall -O2
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
 
LIBDIR =
LDFLAGS =
STDLIBS= -losl -lpng -lz \
  -lpspsdk -lpspctrl -lpspumd -lpsprtc -lpsppower -lpspgu -lpspaudiolib -lpspaudio -lm
LIBS=$(STDLIBS)$(YOURLIBS)
 
 
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Leccion 3:Fondo y Sprite.
 
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Después del proceso anterior al compilar aparecerá que se ha compilado perfectamente.

Y al ejecutarlo en la psp verán lo siguiente.

Y vean que al haber hecho transparente el color rosa se ve como las capas anteriores, ahora muestro el hongo con el color de su fondo.

Bueno espero les agraden mis sencillos tutoriales, que solo hago es expresar mi conocimiento aunque no sea mucho. Nos vemos hasta la próxima lección.

Descargar OSLib Fondo y Sprite (Sólo Usuarios Registrados).

4.34694
Tu voto: Ninguno Votos totales: 4.3 (49 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de darkmido

Gracias!

Excelente explicación me gusto mucho, es que tu si explicas todo!!!! un saludo!

Imagen de arielnmz

No puedo...

Compilar tu SRC...

C:\PSPApps\TutorialOSLibFondoySpritePSP\SRC>make
psp-gcc -I. -IC:/PSPDev/psp/sdk/include -G4 -Wall -O2  -D_PSP_FW_VERSION=150  -L
. -LC:/PSPDev/psp/sdk/lib   main.o -losl -lpng -lz -lpspsdk -lpspctrl -lpspumd -
lpsprtc -lpsppower -lpspgu -lpspaudiolib -lpspaudio -lm -lpspdebug -lpspdisplay
-lpspge -lpspctrl -lpspsdk -lc -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_re
solver -lpsputility -lpspuser -lpspkernel -o Fondo.elf
c:/pspdev/bin/../lib/gcc/psp/4.3.5/../../../../psp/lib\libosl.a(keys.o): In func
tion `oslIsRemoteExist':
c:\MinGW\msys\1.0\home\builder\minpspw\devpaks\045_oslibmod\build\trunk/keys.c:1
32: undefined reference to `sceHprmIsRemoteExist'
c:/pspdev/bin/../lib/gcc/psp/4.3.5/../../../../psp/lib\libosl.a(keys.o): In func
tion `oslReadRemoteKeys':
c:\MinGW\msys\1.0\home\builder\minpspw\devpaks\045_oslibmod\build\trunk/keys.c:8
9: undefined reference to `sceHprmIsRemoteExist'
c:\MinGW\msys\1.0\home\builder\minpspw\devpaks\045_oslibmod\build\trunk/keys.c:9
7: undefined reference to `sceHprmPeekCurrentKey'
c:/pspdev/bin/../lib/gcc/psp/4.3.5/../../../../psp/lib\libosl.a(oslLoadImageFile
JPG.o): In function `oslLoadImageFileJPG':
Special/oslLoadImageFileJPG.c:41: undefined reference to `jpeg_std_error'
Special/oslLoadImageFileJPG.c:42: undefined reference to `jpeg_CreateDecompress'
 
Special/oslLoadImageFileJPG.c:43: undefined reference to `jpeg_stdio_src'
Special/oslLoadImageFileJPG.c:44: undefined reference to `jpeg_read_header'
Special/oslLoadImageFileJPG.c:51: undefined reference to `jpeg_start_decompress'
 
Special/oslLoadImageFileJPG.c:55: undefined reference to `jpeg_read_scanlines'
Special/oslLoadImageFileJPG.c:62: undefined reference to `jpeg_finish_decompress
'
Special/oslLoadImageFileJPG.c:64: undefined reference to `jpeg_destroy_decompres
s'
Special/oslLoadImageFileJPG.c:64: undefined reference to `jpeg_destroy_decompres
s'
make: *** [Fondo.elf] Error 1
 
C:\PSPApps\TutorialOSLibFondoySpritePSP\SRC>

que esta mal???

Mismo fallo que al compañero

Tengo el mismo problema de jpgs...porque pasa esto?

Imagen de jorge_97

by jorge_97

Buen tuto compañero.

Un saludo

Gran tuto, klozz.

Y muy buena redacción, gdljjrod. Aprendes rápido ;-)

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.