Anuncios Google

OSLib - Resumen de lo Aprendido I

Tutoriales Avanzados Homebrewes

Ahora que tenemos una idea muy básica de lo que es la programacion en OSLib y como se maneja pues os pongo un ejemplo practico de uso de estas librerías, os dejo un paquete de imágenes que usaremos en nuestro code, tambien os dejo sonido y la fuente ya sabéis que podeis usar la de la PSP. En este resumen es posible que salgan un par de funciones que no hemos dado, tranquilos, explicare en un comentario la función.

Autor: Dioni0396.

Procedimiento:

Antes de empezar he de decir, que de aquí hacia atrás son todos tutoriales básicos, después de ver ésto empezamos con los niveles medios, incluiremos funciones mas avanzadas y demás. ¡Estate atento a nuevas entregas!

/*
	Resumen de lo aprendido I By Dioni0396, en este resumn no volvere a explicar
	las funciones dadas ya anteriormente, pero si las nuevas.
	El codigo, es de uso libre, pero no copieis trozos de codigo asi porque asi, sino nunca 
	aprendereis.
*/
#include <pspkernel.h>
#include <pspdebug.h>
#include <oslib/oslib.h>
PSP_MODULE_INFO("Resumen Sample", 1, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
PSP_HEAP_SIZE_KB(18*1024);
struct{
	int x;
	int y;
	OSL_IMAGE *sprite;
} J1;
void Declarar_Structuras(){
	J1.x = 100;
	J1.y = 100;
	oslSetTransparentColor(RGB(255,0,0));
	J1.sprite = oslLoadImageFilePNG("Sprite.png",OSL_IN_RAM,OSL_PF_5551);
	oslDisableTransparentColor();
}
OSL_FONT *Fuente;
OSL_IMAGE *Fondo, *Opciones, *Acerca, *FondoNegro;
OSL_SOUND *MiSonido;
void CargaFuente(){
	oslIntraFontInit(INTRAFONT_CACHE_LARGE);
	Fuente = oslLoadFontFile("flash0:/font/ltn0.pgf");
	oslSetFont(Fuente);
}
void CargaImagen(){
	Fondo = oslLoadImageFilePNG("Fondo.png",OSL_IN_RAM,OSL_PF_8888);
	Opciones = oslLoadImageFilePNG("Opciones.png",OSL_IN_RAM,OSL_PF_8888);
	Acerca = oslLoadImageFilePNG("AcercaDe.png",OSL_IN_RAM,OSL_PF_8888);
	FondoNegro = oslLoadImageFilePNG("Negro.png",OSL_IN_RAM,OSL_PF_8888);
}
void CargaSonido(){
	MiSonido = oslLoadSoundFileMP3("SonidoFondo.mp3",OSL_FMT_STREAM);
	if (!MiSonido) oslDebug("Este era el p*** error"); //Censurado por Dovemac xDD
}
u8 Sel=1;
u8 Anim=0;
u8 Comienza=0;
u8 OpcionElegida = 0; //Aclaracion, 0=Menu, 1=Juego, 2=Opciones, 3=Acerca De... (Para el menu)
void Controles(){
	if (osl_keys->pressed.down) Sel++;
	if (osl_keys->pressed.up) Sel--;
}
void Menu(char* Opcion1,char* Opcion2,char* Opcion3,char* Opcion4){
	if(OpcionElegida==0){
		oslStartDrawing();
		oslReadKeys();
		oslDrawImageXY(Fondo,0,0);
		Controles();
		if(Sel<1) Sel=4;
		if(Sel>4) Sel=1;
		oslDrawString(47,88,Opcion1);
		oslDrawString(270,120,Opcion2);
		oslDrawString(50,185,Opcion3);
		oslDrawString(200,230,Opcion4);
		if(Sel==1){
			oslDrawString(17,88,"-->"); //Mas o menos calculo donde estara la flecha.
			if(osl_keys->pressed.cross) OpcionElegida=1;
		}
		if(Sel==2){
			oslDrawString(240,120,"-->");
			if(osl_keys->pressed.cross) OpcionElegida=2;
		}
		if(Sel==3){
			oslDrawString(20,185,"-->");
			if(osl_keys->pressed.cross) OpcionElegida=3;
		}
		if(Sel==4){
			oslDrawString(170,230,"-->");
			if(osl_keys->pressed.cross) oslQuit();
		}
		oslEndDrawing();
		oslSyncFrame();
	}
	if(OpcionElegida==1){
		oslStartDrawing();
		oslReadKeys();
		if(osl_keys->held.up){
			J1.y=J1.y-2;
			Anim++;
			oslSetImageTileSize(J1.sprite,(Anim * 22),35,22,35);
			if(Anim==6) Anim=0;
			Comienza=1;
		}
		if(osl_keys->held.down){
			J1.y=J1.y+2;
			Anim++;
			oslSetImageTileSize(J1.sprite,(Anim * 22),0,22,35);
			if(Anim==6) Anim=0;
			Comienza=1;
		}
		if(osl_keys->held.right){
			J1.x=J1.x+2;
			Anim++;
			oslSetImageTileSize(J1.sprite,(Anim * 22),70,22,35);
			if(Anim==6) Anim=0;
			Comienza=1;
		}
		if(osl_keys->held.left){
			J1.x=J1.x-2;
			Anim++;
			oslSetImageTileSize(J1.sprite,(Anim * 22),105,22,35);
			if(Anim==6) Anim=0;
			Comienza=1;
		}
		if(Comienza==1){
			oslCls(); //Esta funcion limpia la pantalla para que el sprite no se quede una encima del otro. Si teneis curiosidad quitarlo y vereis que pasa.
			oslDrawImageXY(J1.sprite,J1.x,J1.y);
		}
		if(osl_keys->pressed.circle) OpcionElegida=0;
		oslEndDrawing();
		oslSyncFrame();
	}
	if(OpcionElegida==2){
		oslStartDrawing();
		oslReadKeys();
		oslDrawImageXY(Opciones,0,0);
		oslDrawString(100,100,"Bueno, aqui ya harias tu lo que quisieras\n\n Sigue disfrutando de la aplicacion");
		if(osl_keys->pressed.circle) OpcionElegida=0;
		oslEndDrawing();
		oslSyncFrame();
	}
	if(OpcionElegida==3){
		oslStartDrawing();
		oslReadKeys();
		oslDrawImageXY(Acerca,0,0);
		oslDrawString(100,100,"Bueno, aqui ya harias tu lo que quisieras\n\n Sigue disfrutando de la aplicacion");
		if(osl_keys->pressed.circle) OpcionElegida=0;
		oslEndDrawing();
		oslSyncFrame();
	}
}
int main(){
	oslInit(0);
	oslInitGfx(OSL_PF_8888,1);
	oslInitAudioME(3);
	Declarar_Structuras();
	CargaImagen();
	CargaSonido();
	CargaFuente();
	oslPlaySound(MiSonido,1);
	oslSetSoundLoop(MiSonido,1);  //Esta es la nueva funcion, es una funcion que hara que siempre se repita la cancion, el primer argumento recibe la musica y el segundo es para decir que si reproduce o no
	//Siempre necesita antes el oslPlaySound para poder hacer el bucle, y siempre fuera del while!
	while(!osl_quit){
		Menu("Comenzar","Opciones","Acerca de...","Salir");
	}
	oslEndGfx();
	oslQuit();
	return 0;
}

Parece muy complicado pero no lo es, solo me tiro media hora en hacerlo todo, y dejarlo sin fallos.

Makefile

TARGET = Resumen
OBJS = main.o
 
CFLAGS = -O2 -g -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
LIBDIR =
 
MYLIBS=
STDLIBS= -losl -lpng -lz \
         -lpsphprm -lpspsdk -lpspctrl -lpspumd -lpsprtc -lpsppower -lpspgu -lpspgum  -lpspaudiolib -lpspaudio -lpsphttp -lpspssl -lpspwlan \
         -lpspnet_adhocmatching -lpspnet_adhoc -lpspnet_adhocctl -lm -ljpeg -lpspaudiocodec
LIBS=$(STDLIBS) $(MYLIBS)
 
LDFLAGS =
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Resumen
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Así es como quedaría el menú y el "juego":

*Captura del menú.


*Captura del "juego".

Descargas

Se adjunta, además de los archivos necesarios, el PSD de los gráficos proporcionado por el autor (su descarga es opcional).

Archivos Necesarios (Sólo Usuarios Registrados).

PSD (Sólo Usuarios Registrados).

4.085105
Tu voto: Ninguno Votos totales: 4.1 (47 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.

este es el main, asi lo tuve

este es el main, asi lo tuve que modificar

#include <pspkernel.h>
#include <pspdebug.h>
#include <oslib/oslib.h>
PSP_MODULE_INFO("Resumen Sample", 1, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
PSP_HEAP_SIZE_KB(18*1024);
struct{
	int x;
	int y;
	OSL_IMAGE *sprite;
} J1;
void Declarar_Structuras(){
	J1.x = 100;
	J1.y = 100;
	oslSetTransparentColor(RGB(255,0,0));
	J1.sprite = oslLoadImageFile("Sprite.png",OSL_IN_RAM,OSL_PF_5551);
	oslDisableTransparentColor();
}
OSL_FONT *Fuente;
OSL_IMAGE *Fondo, *Opciones, *Acerca, *FondoNegro;
OSL_SOUND *MiSonido;
void CargaFuente(){
 
	Fuente = oslLoadFontFile("flash0:/font/ltn0.pgf");
	oslSetFont(Fuente);
}
void CargaImagen(){
	Fondo = oslLoadImageFile("Fondo.png",OSL_IN_RAM,OSL_PF_8888);
	Opciones = oslLoadImageFile("Opciones.png",OSL_IN_RAM,OSL_PF_8888);
	Acerca = oslLoadImageFile("AcercaDe.png",OSL_IN_RAM,OSL_PF_8888);
	FondoNegro = oslLoadImageFile("Negro.png",OSL_IN_RAM,OSL_PF_8888);
}
void CargaSonido(){
	MiSonido = oslLoadSoundFile("sonido.wav",OSL_FMT_STREAM);
	if (!MiSonido) oslDebug("Este era el p*** error"); //Censurado por Dovemac xDD
}
u8 Sel=1;
u8 Anim=0;
u8 Comienza=0;
u8 OpcionElegida = 0; //Aclaracion, 0=Menu, 1=Juego, 2=Opciones, 3=Acerca De... (Para el menu)
void Controles(){
	if (osl_keys->pressed.down) Sel++;
	if (osl_keys->pressed.up) Sel--;
}
void Menu(char* Opcion1,char* Opcion2,char* Opcion3,char* Opcion4){
	if(OpcionElegida==0){
		oslStartDrawing();
		oslReadKeys();
		oslDrawImageXY(Fondo,0,0);
		Controles();
		if(Sel<1) Sel=4;
		if(Sel>4) Sel=1;
		oslDrawString(47,88,Opcion1);
		oslDrawString(270,120,Opcion2);
		oslDrawString(50,185,Opcion3);
		oslDrawString(200,230,Opcion4);
		if(Sel==1){
			oslDrawString(17,88,"-->"); //Mas o menos calculo donde estara la flecha.
			if(osl_keys->pressed.cross) OpcionElegida=1;
		}
		if(Sel==2){
			oslDrawString(240,120,"-->");
			if(osl_keys->pressed.cross) OpcionElegida=2;
		}
		if(Sel==3){
			oslDrawString(20,185,"-->");
			if(osl_keys->pressed.cross) OpcionElegida=3;
		}
		if(Sel==4){
			oslDrawString(170,230,"-->");
			if(osl_keys->pressed.cross) oslQuit();
		}
		oslEndDrawing();
		oslSyncFrame();
	}
	if(OpcionElegida==1){
		oslStartDrawing();
		oslReadKeys();
		if(osl_keys->held.up){
			J1.y=J1.y-2;
			Anim++;
			oslSetImageTileSize(J1.sprite,(Anim * 22),35,22,35);
			if(Anim==6) Anim=0;
			Comienza=1;
		}
		if(osl_keys->held.down){
			J1.y=J1.y+2;
			Anim++;
			//toma la imagen, se posiciona en la imagen y que es la primera
			//y va avanzando poco a poco del 0 al 6 de x
			oslSetImageTileSize(J1.sprite,(Anim * 22),0,22,35);
			if(Anim==6) Anim=0;
			Comienza=1;
		}
		if(osl_keys->held.right){
			J1.x=J1.x+2;
			Anim++;
			oslSetImageTileSize(J1.sprite,(Anim * 22),70,22,35);
			if(Anim==6) Anim=0;
			Comienza=1;
		}
		if(osl_keys->held.left){
			J1.x=J1.x-2;
			Anim++;
			oslSetImageTileSize(J1.sprite,(Anim * 22),105,22,35);
			if(Anim==6) Anim=0;
			Comienza=1;
		}
		if(Comienza==1){
			oslCls(); //Esta funcion limpia la pantalla para que el sprite no se quede una encima del otro. Si teneis curiosidad quitarlo y vereis que pasa.
			oslDrawImageXY(J1.sprite,J1.x,J1.y);
		}
		if(osl_keys->pressed.circle) OpcionElegida=0;
		oslEndDrawing();
		oslSyncFrame();
	}
	if(OpcionElegida==2){
		oslStartDrawing();
		oslReadKeys();
		oslDrawImageXY(Opciones,0,0);
		oslDrawString(100,100,"Bueno, aqui ya harias tu lo que quisieras\n\n Sigue disfrutando de la aplicacion");
		if(osl_keys->pressed.circle) OpcionElegida=0;
		oslEndDrawing();
		oslSyncFrame();
	}
	if(OpcionElegida==3){
		oslStartDrawing();
		oslReadKeys();
		oslDrawImageXY(Acerca,0,0);
		oslDrawString(100,100,"Bueno, aqui ya harias tu lo que quisieras\n\n Sigue disfrutando de la aplicacion");
		if(osl_keys->pressed.circle) OpcionElegida=0;
		oslEndDrawing();
		oslSyncFrame();
	}
}
int main(){
	oslInit(0);
	oslInitGfx(OSL_PF_8888,1);
	oslInitAudio(3);
	Declarar_Structuras();
	CargaImagen();
	CargaSonido();
	CargaFuente();
	oslPlaySound(MiSonido,1);
	oslSetSoundLoop(MiSonido,1);  //Esta es la nueva funcion, es una funcion que hara que siempre se repita la cancion, el primer argumento recibe la musica y el segundo es para decir que si reproduce o no
	//Siempre necesita antes el oslPlaySound para poder hacer el bucle, y siempre fuera del while!
	while(!osl_quit){
		Menu("Comenzar","Opciones","Acerca de...","Salir");
	}
	oslEndGfx();
	oslQuit();
	return 0;
}

Y cual seria mejor usar... la version MOD de oslib o cualquiera de las 2 es buena?

Imagen de ahrimanes

me da error

esta linea me da error oslIntraFontInit(INTRAFONT_CACHE_LARGE);

por que ????..

Imagen de Dioni0396

Pues

Pues no lo se, me dices el error del compilador?

PD: Yo compile esto antes de subirlo a la web en linux.

Imagen de ahrimanes

                           

                            Creando Archivo... Espere...

psp-g++ -I. -IC:/PSPDev/psp/sdk/include -O2 -g -G0 -Wall -I. -IC:/PSPDev/psp/sdk
/include -O2 -g -G0 -Wall -fno-exceptions -fno-rtti -D_PSP_FW_VERSION=150   -c -
o main.o main.cpp
main.cpp:17: warning: non-local variable '<anonymous struct> J1' uses anonymous
type
main.cpp: In function 'void CargaFuente()':
main.cpp:29: error: 'INTRAFONT_CACHE_LARGE' was not declared in this scope
main.cpp:29: error: 'oslIntraFontInit' was not declared in this scope
make: *** [main.o] Error 1

                                      Terminado

 

 

Gracias por la atencion.
no entiendo por que si se supone son constantes declaradas por la Oslib o estoy mal ???.


Gracias Scenebeta por ser la mejor comuna de scene en español

Imagen de Dioni0396

Dame el main.c

Por favor.

Imagen de ahrimanes

http://pastebin.com/NgUtbTeE

http://pastebin.com/NgUtbTeE

 

aqui ta en pastebin segun yo hice copy paste del  que tu pones.

 

yo estoy usando oslib 2.10 .. y he visto que las intrafonts tan implementadas en un mod 1.1.0  sera que la 2.10 no incluye eso de intrafonts ??


Gracias Scenebeta por ser la mejor comuna de scene en español

Imagen de Dioni0396

Efectivamente

Las oslib 2.10 no incluye esa funcion, solo la incluye las oslib mod.

Te recomiendo que elimines la funcion oslintrafontinit, y pruebes. y luego lo veas en la psp

Sobre el struct no tengo ni idea. El struct esta perfecto.

Imagen de ahrimanes

Okas muchas gracias

Okas muchas gracias

Imagen de NEKERAFA

LOOOL

if (!MiSonido) oslDebug("Este era el **** error"); , XD, hasta Dioni se equivoca jajajaja.

Otra cosa, ¿No era mejor utilizar la sentencia switch para las opciones del menú? Es que a mi me parece más lógico, y creo que es más rápida


Editado: El uso de palabras inadecuadas podría resultar ofensivo para ciertos usuarios y va en contra de las Normas de la Comunidad, antes de volver a postear por favor revíselas.| Rober Galarga


NekeOS, el nuevo shell para PSP

PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.

Sony Xperia Z1 Compact con Android 5.1.1

Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).

Imagen de Dioni0396

...

No cambie eso.... LOL Cuando trabajaba use eso mientras intentaba hacer que funcionara, y puse eso.... Que verguenza xD

Em sobre lo de switch tienes razon, pero al ser un tutorial Basico pues eso.

Le hice un arreglillo jejej

Le hice un arreglillo jejej

Imagen de Ricx-Dark

Buen tuto Dioni, me han

Buen tuto Dioni, me han ayudado mucho y cada vez entiendo masRisa, este tuto no lo entendia y ahora con tu ayuda ya lo entiendo

Imagen de Dioni0396

Gracias :)

Gracias

Excelente.

Lo cierto es que está genial, aunque haya gente que diga que no lo explicas, se entiende perfectamente.

Un saludo.

Imagen de Dioni0396

Gracias

Gracias

hola   tengo una duda, ya

hola

 

tengo una duda, ya quite lo de oslIntraFont porque no me lo reconoce, y tanto mp3 como png, tuve que modificarlo y solo dejarlo como oslLoadImageFile y oslLoadSoundFile, y use un wav

 

depues de eso logre compilarlo, pero a la hora de usarlo en el psp, no me aparcen las opciones, si intento meterme en las opciones si lo hace correctamente, pero lo que son -->Comenzar, etc, no me aparecen

 

que podria ser lo que pasa que lo unico que no se muestra son las opciones?

 

y me podrias decir cual es la diferencia entre OSLib y OSLib MOD?

 

gracias, salu2

Imagen de Dioni0396

pues muchisimas

muchisimas, casi innombrables.

Deja el main.c para ver tu error.

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.