Anuncios Google

Mostrando imágenes en pantalla.

Tutoriales Avanzados Homebrewes

En esta entrega vamos a usar un recurso muy importante para cualquier programador que se precie: la impresión de imagenes. Para ello usaremos la librería "graphics.h", que estará disponible para su descarga en esta misma entrega, al final de este tutorial, en la sección "Descarga". Espero que estos tutos os estén sirviendo de ayuda para vuestro aprendizaje en el interesante lenguaje del C.

Autor: sting18.

Procedimiento

Vamos a imprimir una imagen. Para ello, hay que tener en cuenta que las dimensiones de la pantalla de la PSP son de 480x272.

Empezamos con las librerías necesarias. (Descargar graphics.h al final).

#include <pspkernel.h>
#include <pspdebug.h>
#include "graphics.h"

Si sois curiosos, os preguntaréis por que razón viene la librería graphics.h entre comillas, y no como las anteriores. Esto es porque esta librería es externa al kit de programación de la primera entrega, así que debemos descargarla y ponerla junto a main.c y makefile. Podemos asignarle una carpeta si asi los queremos, por ejemplo: "librerias/graphics.h".

Continuamos con lo de siempre:

PSP_MODULE_INFO("Imprimir imagen", 0, 1, 0);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);

int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}
 
/* Llamada thread */
int CallbackThread(SceSize args, void *argp) {
int cbid;
 
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
 
sceKernelSleepThreadCB();
 
return 0;
}
 
/* Configura llamada thread y vuelve a su thread id */
int SetupCallbacks(void) {
int thid = 0;
 
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
 
return thid;
}

Para poder usar una imagen debemos antes asignarla. Esto se hace así:

Image* imagen

Comenzamos nuestra función principal.

int main()
{

Ahora iniciamos el "modo gráfico" de nuestra PSP mediante este código:

initGraphics();

E iniciamos la salida del HOME.

SetupCallbacks();

Ahora cargamos la imagen que debe encontrarse al lado de nuestro EBOOT.PBP de este modo:

imagen = loadImage("imagen.png");

La imagen puede estar en cualquier lugar, solo que tenemos que indicar el lugar correcto. Por ejemplo: tenemos la imagen en la carpeta imagenes, pues la indicaremos así:

//Codigo de ejemplo. No hay que usarlo.
 
imagen = loadImage("imagenes/imagen.png");

Ahora llega el codigo que más estabas esperando: el codigo para IMPRIMIR esa imagen. Es el siguiente:

blitAlphaImageToScreen(0 ,0 ,480 , 272, imagen, 0, 0);

Voy a hacer una descripción de los parametros que tiene esta función:

  • El primer 0 indica donde empieza la imagen con respecto al eje X.
  • El segundo 0 indica lo mismo que el primero pero en el eje Y.
  • El 480 indica el ancho de la imagen.
  • El 272 indica el alto de la imagen.
  • Este 0 indica la coordenada X donde se imprimirá la imagen.
  • Este otro 0 indica lo mismo que el anterior pero en el eje Y.

Ahora vamos a usar la función esencial para que se muestre lo que se ha mandado a imprimir.

flipScreen();

Con este codigo se "da la vuelta" a la pantalla y muestra lo que habíamos mandado a imprimir con la función anterior.

Ahora debemos liberar la/las imagen/es que ya no necesitamos para que la RAM no se llene demasiado y provoque que la PSP se cuelgue/congele.

freeImage(imagen);

Cerramos nuestro main y listo.

return 0;
}

Ya esta listo, solo nos queda crear nuestro Makefile.

TARGET = imagenes
OBJS = main.o graphics.o framebuffer.o
 
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
 
LIBDIR =
#Aqui incluiremos libs necesarias
LIBS = -lpspgu -lpng -lz -lm
LDFLAGS =
 
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Iniciandome en graficos
 
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

¿Por qué ponemos OBJS? Para que el Makefile LEA las librerías necesarias. Más adelante entenderás para que sirve esto, ahora no tiene gran importancia que te rompas el coco intentando entenderlo, solo añadelo a tu code.

Ahora solo queda probarlo.

Espero que os halla sido util esta entrega y la estudieis bien. ¡Hasta la proxima entrega!

Descarga

Descargar Archivos Necesarios (Sólo Usuarios Registrados).

4.27586
Tu voto: Ninguno Votos totales: 4.3 (58 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 anxoganso

Tengo un problema que es que

Tengo un problema que es que la imagen se me va repitiendo muchas veces y no se que hacer aqui el code

 

#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include "graphics.h"
 
PSP_MODULE_INFO("Bola", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
 
int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}
 
/* Llamada thread */
int CallbackThread(SceSize args, void *argp) {
int cbid;
 
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
 
sceKernelSleepThreadCB();
 
return 0;
}
 
/* Configura llamada thread y vuelve a su thread id */
int SetupCallbacks(void) {
int thid = 0;
 
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
 
return thid;
}
 
Image* bola;
int x, y, xa, ya;
x = 1;
y = 1;
 
int main()
{
	initGraphics();
	SetupCallbacks();
	bola = loadImage("imagenes/bola.png");
	SceCtrlData pad;
	while(1)
	{
		clearScreen(0x40000000 | 0x04000000);
		sceCtrlReadBufferPositive(&pad, 1);
 
		if(pad.Buttons & PSP_CTRL_UP)
		{
			y = y + 1;
		}
		if(pad.Buttons & PSP_CTRL_DOWN)
		{
			y = y - 1;
		}
		if(pad.Buttons & PSP_CTRL_LEFT)
		{
 
			x = x + 1;
		}
		if(pad.Buttons & PSP_CTRL_RIGHT)
		{
 
			x = x - 1;
		}
		xa = x + 20;
		ya = y + 20;
	blitAlphaImageToScreen(0, 0, xa, ya, bola, x, y);
	flipScreen();
	}
	freeImage(bola);
	return 0;
}


Imagen de sisinio

.

Todo me funciona a la perfeccion pero me repatea que al salir con el Home se me crashee la PSP (se queda en espere,por favor) ¿ alguien sabe porque ?

PD: Tambien me pasa con el testeador

PD2: PSP 2000 6.39 ME-9.7


-> Creaciones <-

Os invito a probar el lol xD

http://signup.leagueoflegends.com/?ref=50814a20894be236637679

 

Imagen de Diego_Dark_256

como...........?

como se podria poner 2 imagenes? (si pongo una imagen pulso X o cualquier tecla y que salga otra)

Imagen de sting18

Solo pon que al pulsar X

Solo pon que al pulsar X mustre otra imagen y la imagen ponla despues de como muestras la otra, o la podrias poner en un avariable boleana(verdadero,falso) y pones que al presionar el boton cambie de estado,

PD: no te pongo codigo ya que en esta entrega ya deves mas o menos saber como hacer lo que te digo ya que ya estan las pulsaciones y mostrar imagen que es todo lo que nesecitas (es por tu bien :D) de todos modos si tienes problemas no dudes en poner tu problemas saludos.


Imagen de Diego_Dark_256

Gracias.//

Me sirbio...

Imagen de Diego_Dark_256

no me compila

no compila yo creo que esta todo bien:

 

#include <pspkernel.h>
#include <pspdebug.h>
#include "graphics.h"
 
PSP_MODULE_INFO("Imprimir imagen", 0, 1, 0);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
 
int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}
 
/* Llamada thread */
int CallbackThread(SceSize args, void *argp) {
int cbid;
 
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
 
sceKernelSleepThreadCB();
 
return 0;
}
 
/* Configura llamada thread y vuelve a su thread id */
int SetupCallbacks(void) {
int thid = 0;
 
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
 
return thid;
}
 
Image* imagen
 
int main()
{
initGraphics();
SetupCallbacks();
imagen = loadImage("imagen.png");
blitAlphaImageToScreen(0 ,0 ,480 , 272, imagen, 0, 0);
flipScreen();
freeImage(imagen);
 
return 0;
}

 

y el makefile

 

TARGET = imagenes
OBJS = main.o graphics.o framebuffer.o
 
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
 
LIBDIR =
LIBS = -lpspgu -lpng -lz -lm
LDFLAGS =
 
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Iniciandome en graficos
 
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak



Canal de Youtube De "Trabajo": http://www.youtube.com/user/DiegoDark256

Canal de Youtube para divertirse ;D :http://www.youtube.com/user/Trollsofthelife

Twitter Personal: https://twitter.com/DiegoDark256

Twitter del Canal: https://twitter.com/TrollsOfTheLife


 

Imagen de Diego_Dark_256

[RESUELTO] era el main

en la parte de:

return thid;
}
 
Image* imagen
 
int main()
{
initGraphics();
SetupCallbacks();
imagen = loadImage("imagen.png");
blitAlphaImageToScreen(0 ,0 ,480 , 272, imagen, 0, 0);
flipScreen();
freeImage(imagen);
 
return 0;
}

era (remarco el error por si os pasa) :

return thid;
}
 
 
int main(///////Image* imagen/////) <- ai el error XD todo arreglado
{
initGraphics();
SetupCallbacks();
imagen = loadImage("imagen.png");
blitAlphaImageToScreen(0 ,0 ,480 , 272, imagen, 0, 0);
flipScreen();
freeImage(imagen);
 
return 0;
}

 



Canal de Youtube De "Trabajo": http://www.youtube.com/user/DiegoDark256

Canal de Youtube para divertirse ;D :http://www.youtube.com/user/Trollsofthelife

Twitter Personal: https://twitter.com/DiegoDark256

Twitter del Canal: https://twitter.com/TrollsOfTheLife


 

al compilarlo me da error

oie disculpa me podrias pasar tus archivos que creaste para hacer que imprima una imagen, porque copie el makefile y el del codigo C y aun asi no me deja de dar error, los copie tal cual como los escribiste, espero y me puedas ayudar o.O

Imagen de Diego_Dark_256

me podrian decir

como se meteria una imagen asi entre un texto (explicacion: por ejemplo yo pongo "XD" le doy a la X sale otra pantalla con la "imgen" le buelbo a dar a la x y pone por ejemplo "LOL") como seria?



Canal de Youtube De "Trabajo": http://www.youtube.com/user/DiegoDark256

Canal de Youtube para divertirse ;D :http://www.youtube.com/user/Trollsofthelife

Twitter Personal: https://twitter.com/DiegoDark256

Twitter del Canal: https://twitter.com/TrollsOfTheLife


 

Imagen de Dioni0396

LOL

Con lo dificil que se hace en NDS y lo facil que es aqui, lastima que no sepa instalar PSPDev.

Imagen de sting18

Pues no es dificil dioni solo

Pues no es dificil dioni solo es cuestion de pasiencia, y seguir todo al pie de la letra y listo :D.

Imagen de Dioni0396

Si, pero

yo ya tengo instalado el devkitpro, solo para NDS, con lo cual al instalar el PSPDev no se cual sera la reaccion del ordenador. Fijate que batalle mucho con el ordenador para poder poner el devkitpro, la primera vez que lo instale el teclado no iba!

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.