Anuncios Google

Tutorial 04 Mostrar un archivo BMP en Pantalla

Tutoriales Avanzados Homebrewes

Hola a todos. En este nuevo tutorial voy a mostrar como se cargan imagenes y se muestran en la pantalla de la PSP. Voy a usar la forma mas facil que hay para que la gente que no entiende mucho pueda seguir estos tutoriales paso a paso y al final de ellos creo que sabran hacer una cuantas cosas interesantes con su PSP, pero no os creais que es todo tan facil como estos primeros tutoriales ;-).

Al final de este tutorial conseguiremos esta bonita pantalla:

Sin mas tonterias paso a lo importante el codigo XD. Pinchando aqui descargamos la imagen BMP y el codigo que usaremos en este tutorial.

Aqui teneis el codigo del makefile que usaremos. Como vereis es muy similar al que usamos en el tercer tutorial.

TARGET = TUTORIAL04
 
PSPSDK = $(shell psp-config --pspsdk-path)
 
PSPBIN = $(PSPSDK)/../bin
 
 
 
OBJS = main.o
 
 
JOY = YES
 
CFLAGS = -Wall -Wno-long-long -G0 -O2 -DJOY_$(JOY)
 
CFLAGS += $(shell $(PSPBIN)/sdl-config --cflags)
 
 
 
LIBS = -lstdc++ -lSDL $(shell $(PSPBIN)/sdl-config --libs)
 
 
 
EXTRA_TARGETS = EBOOT.PBP
 
PSP_EBOOT_TITLE = TUTORIAL04
 
 
 
include $(PSPSDK)/lib/build.mak

Solo tienes dos lineas distintas que son

TARGET = TUTORIAL04
 
PSP_EBOOT_TITLE = TUTORIAL04

Con estas lineas como os explique en el segundo tutorial se cambia el nombre del proyecto y el nombre que se muestra en la PSP. Como veis es logico que las haya cambiado dado que se trata de un nuevo proyecto, sino no sabriamos cual cargar en la PSP si tubieramos los dos proyectos en nuestra Stick ;-). Tras explicar el make file vamos a meternos con el codigo del programa:

#include <pspkernel.h>
#include <sdl.h>
 
int main(){
SDL_Surface *Imagen,*PantallaV;
SDL_Event Evento;
SDL_Init(SDL_INIT_VIDEO);
SDL_ShowCursor(0);
PantallaV = SDL_SetVideoMode(480,272,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
Imagen = SDL_LoadBMP("p2pantalla.bmp");
SDL_BlitSurface(Imagen,NULL,PantallaV,NULL);
SDL_Flip(PantallaV);
SDL_FreeSurface(Imagen);
while (SDL_WaitEvent(&Evento))
{
if (Evento.type == SDL_QUIT) {
SDL_FreeSurface(PantallaV);
break;
}
}
return 0;
} 

Las dos primeras lines ya nos iran sonando un poco. Con ellas lo que hacemos es cargar estas dos librerias PSPKERNEL y SDL sin las cuales no nos funcionaria el programa. En el tutorial anterior (teneis enlace en el menu derecho) os explique lo que hacia cada una mas o menos.

#include <pspkernel.h>
#include <sdl.h>

La libreria PSPKERNEL como os comente en el anterior tutorial hay que incluirla en todos los programas que hagamos para PSP pues se encarga de las funciones internas de KERNEL de la PSP.

La libreria SDL es la que nos interesa. Es la encargada de todo el tema grafico y sonoro y poco a poco en esta serie de tutoriales explicaremos la mayoria de las funciones que la integran.

Tras esto llegamos a un viejo conocido de todos nosotros:
int main(){

Como creo que todos los que estais mirando esto habreis visto ya algun programa en C sabreis que el MAIN es la funcion por la que empiezan todos o casi todos los programas en C, asi que no nos detendremos mas en el y pasemos a la siguiente linea la cual nos define Imagen y PantallaV como punteros de SDL_Surface que traducido a palabras mas o menos normales nos define PantallaV e Imagen como si fueran folios en blanco sobre los que podremos pintar o cargar imagenes asi como mostrarlos por pantalla.

SDL_Surface *Imagen,*PantallaV;

La siguiente funcion lo que hace es definir Evento como una estructura de eventos. Lo usaremos para almacenar los eventos del sistema, las pulsaciones de teclas y demas. Yo no lo suelo usar en mis proyectos, prefiero usar para controlar las teclas las funciones especificas de PSP las cuales ya veremos en sucesivos tutoriales.

SDL_Event Evento;

En la siguiente linea de codigo Inicializamos el modo de video de la PSP para poder pintar sobre la pantalla:

SDL_Init(SDL_INIT_VIDEO);

Una vez que hemos inicializado el modo de video debemos esconder el cursor que aparece en la esquina superior izquierda de la pantalla para que no nos estorbe, pues queda bastante feo tapando nuestro maravilloso fondo. Para ello usamos la siguiente linea de codigo:

SDL_ShowCursor(0);

Tras lo cual estaremos listo para definir PantallaV como la pantalla Principal de la PSP. Por eso le damos las dimensiones de la pantalla de la PSP, osea 480X272. Tambien le decimos que vamos a usar la pantalla en modo 32 bits color real. Con SDL_HWSURFACE le decimos que cree la superficie en la menoria de video. Si quisieramos crear la superficie o papel en blanco en la memoria normal usariamos esto SDL_SWSURFACE y con SDL_DOUBLEBUF le decimos que la cree con doble buffer. Con esto lo que conseguimos es eliminar ese parpadeo molesto a la hora de refrescar las imagenes por pantalla.

PantallaV = SDL_SetVideoMode(480,272,32,SDL_HWSURFACE|SDL_DOUBLEBUF);

Una vez que tenemos definida PantallaV, lo siguiente que hacemos es cargar la imagen y meterla en Imagen. Esto lo hacermos mediante la siguiente linea de codigo:

Imagen = SDL_LoadBMP("p2pantalla.bmp");

y listo con esto tenemos todos los datos de P2PANTALLA.BMP en Imagen (si en vez de cargar P2PANTALLA.BMP queremos cargar cualquier otro archivo BMP simplemente tendremos que escribir su nombre entre las comillas y incluirlo junto al ejecutable. Es super facil, ¿no?) y tras esto solo nos que da pasarlo a la pantalla de la PSP, lo cual es posible gracias a las siguentes 2 lineas de codigo:

SDL_BlitSurface(Imagen,NULL,PantallaV,NULL);
SDL_Flip(PantallaV);

La primera linea copia todo el contenido de Imagen en PantallaV y la segunda linea Muestra PantallaV en la Pantalla de la PSP. Nos vemos obligados a copiar el contenido de Imagen en PantallaV por que hemos definidos con anterioridad a PantallaV como la pantalla de la PSP. Tras hacer esto ya no necesitamos Imagen para nada asi que con la siguiente linea de codigo liberamos la memoria que teniamos reservada para Imagen. Esto es una buena practica de programacion: cuando no necesitamos mas una cosa la liberamos de memoria para que no nos estorbe consumiendonos memoria:

SDL_FreeSurface(Imagen);

Y para finalizar nuestro querido bucle, el cual os explique en el anterior tutorial y que os vuelvo a explicar, siento ser pesado pero es que quiero que queden claros los conceptos al principio por que luego no voy a explicar todo el codigo en cada Tutorial ;-)

while (SDL_WaitEvent(&event))
{
if (event.type == SDL_QUIT) {
SDL_FreeSurface(PantallaV);
break;
}
}

La primera funcion del bucle es la que hace el bucle while (SDL_WaitEvent(&event)). Esto hace una pregunta, que mientras SDL_WaitEvent(&event) sea cierto, osea 1 o mayor de 1 se ejecute la parte que esta dentro de las llaves del bucle, osea la siguiente funcion:

if (event.type == SDL_QUIT) {
SDL_FreeSurface(PantallaV);
break;
}

la cual es otra pregunta, que si event.type es igual a SDL_QUIT que se ejecute la parte de codigo entre las llaves; y si no es cierto que siga adelante. En caso de que sea cierto pues se liberia la memoria reservada para PantallaV, esto lo hacemos con la funcion SDL_FreeSurface(PantallaV); y tras liberar la memoria se rompe el bucle con la funcion break; y asi llegamos al final del programa y por lo tanto salimos de el.

Para que event.type sea igual a SDL_QUIT tenemos que haber pulsado HOME y dicho que si a la pregunta de que si queremos salir del programa.

Y para terminar solo nos queda devolver 0 al main dado que main es una funcion de tipo int (entero), espera que le devolvamos un valor a la hora de concluir la funcion, sino a la hora de compilar el codigo nos salda un warning avisandonos de ello y por eso con la siguiente linea de codigo le devolvemos 0. No tiene ninguna utilidad pero bueno todo sea por usar un tipo de programacion mas correcto. XD
return 0;

Bueno con esto terminamos este tutorial y espero que os halla gustado mas que el anterior por el cual he recibido bastantes quejas de lo feo que era pero lo que la gente no entiende es que era muy simple y se entendia muy bien aun que fuera feo. Este tambien es muy simple pero creo que el resultado es mas bonito XD.

Nos vemos en el Proximo Tutorial y espero que estos tutoriales os sirvan de ayuda. Cualquier duda que tengais postearlas en este mismo hilo o mandarmelas por privado que intentare ayudaros con lo que sea.

Un saludo
Kaltorak.

4.69231
Tu voto: Ninguno Votos totales: 4.7 (13 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.

compilar

no puedo compilar ningun codigo de tus tutoriales con el pspdev del pack de Marce82.

¿Me podrias ayudar?

Imagen de pspgorrister

Consultando bola de cristal....

no puedo compilar ningun codigo de tus tutoriales con el pspdev del pack de Marce82.

¿Me podrias ayudar?

  • Consultando bola de cristal....
  • Consultando tarot...
  • Consultando posos del café....

Lo siento, no hemos podido averigura qué error te da. Alomejor si pones el error podríamos ayudarte.

Un saludo :D


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Para cuando una nueva

Para cuando una nueva leccion sobre eventos en sdl para psp? Vamos, lo q  viene siendo controles de botones y joystick y asi empezar a hacer cosillas...q mostrar imagenes ya lo hago con la carpeta fotos :P jejeje

Gracias x los tutos. 

Imagen de kaltorak

Hola si los proximos

Hola si los proximos tutoriales iran sobre eso sobre los controles , musica y demas.
Tambien hare un minijuego para que sepais lo que es un bucle de juego y otras partes de las que consta un juego
Un saludo
Kaltorak


Problema AL copilar

me sale este error ya tengo todo


Hola@familiar-cb88f9 ~
$ cd imagen

Hola@familiar-cb88f9 ~/imagen
$ make
psp-gcc -I. -IC:/PSPDev/psp/sdk/include -Wall -Wno-long-long -G0 -O2 -DJOY_YES -
I/usr/local/include/SDL -Dmain=SDL_main -I/usr/include/mingw -DWIN32 -Uunix -mno
-cygwin -D_PSP_FW_VERSION=150   -c -o main.o main.c
cc1.exe: error: unrecognized command line option "-mno-cygwin"
make: *** [main.o] Error 1

Hola@familiar-cb88f9 ~/imagen
$

hola es mi nick

nota: no es un correo


Problema al compilar en PSPDev

Hola! utilizo PSPDev para compilar y me da un error: invalid option 'no-cygwin'. ¿Alguien me puede ayudar? Como sería el makefile? Tengo todo instalado como en el tutorial que hay en esta misma página, siguiendo todos los pasos, incluso he podido compilar los ejemplos del Hola Mundo, el Contador y mostrar el PNG en pantalla.

 Hay que utilizar Linux, otro compilador? quiero programar para esta consola pero estoy un poco perdido.

Yo utilizo Windows XP y PSPDev.

Un saludo y Gracias por los tutoriales.

Imagen de Unicorn

Tras leerte...

me surge una duda Kaltorak. ¿Porque arrancas el "main" con int? ¿No seria mas comodo arrancarlo con "void main(void)", para no preocuparnos por el retorno? ¿En PSP no puede usarse?

Un saludo crack. 


Para recibir ayuda más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda revisar el Manual del perfecto forero y las Normas de la Comunidad.

Imagen de Loopin

Uni, no se si se te ha

Uni, no se si se te ha pasado, pero has puesto el tuto a tu nombre.

Saluuu2!!

Imagen de Unicorn

Gracias por el aviso

cosas de editar como churros xD. Nombre cambiado.

Gracias por la respuesta a ti tambien Kaltorak ;-) 

Imagen de kaltorak

Hola Unicorn

si si puede usarse void sin ningun problema no lo uso por costumbre pero sepuede usar para evitar el retun no se cada uno tiene sus manias XD

 


Imagen de Marce_82

eres una makina

eres una makina tio,magnifico tutorial

Imagen de kaltorak

Hola Marce_82

muchas gracias XD

por cierto eres el que hace el autoinstalador para el PSPDev si es asi lo usas para compilar mis tutoriales?
es que en el anterior tutorial habia un chaval que no podia compilarlos con el PSPDev era por si tu podias me digeras como lo hacias para incluirlo en el tuto de compilar ;)
un saludo
kaltorak

 


Imagen de Marce_82

dejame q mire aver q se

dejame q mire aver q se puede hacer,salu2

No puedo

Hola peña,

estoy siguiendo este tutorial ,pero en linux nativo,y a la hora de compilar haciendo el "make" ,me da un error extraño:

/lib/gcc/psp/4.1.0/../../../../psp/lib/libSDL.a(SDL_pspaudio.o): En la funci�n `PSPAUD_CloseAudio':
[tropecientas lineas con otros comandos]

/home/xxx/psp/trunk/SDL/src/video/psp/SDL_pspvideo.c:260: referencia a `sceGuOffset' sin definir
[otras tropecientas]

collect2: ld devolvió el estado de salida 1
make: *** [TUTORIAL04.elf] Error 1

que puede ser? lo tengo todo instalado como lo dice el tutorial,que pasa con las SDL?

Salu2 y gracias por adelantado

 


no se porque pero solo pienso en PSP's

Imagen de kaltorak

Hola cata

tienes instaladas las toolchain y las pspsdk es que creo que el fallo que te da es que como las sdl las usan para mostrar el sonido y el video en pantalla o no las encuentra en la ruta que tienen que estar o no estan instaladas a un que no se muy bien por donde puede venir el fallo por que no he usado nunca linux a pelo

Un saludo
Kaltorak

 


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.