Ahora les traemos un sample creado por el coder _Dark_Cloud_ donde nos enseña como poder utilizar las olas oficiales de Sony. Este es un tutorial para usuarios avanzados en programación. Si siempre has querido hacer tu homebrew en VLF y en C con un tutorial super fácil no te puedes perder esto.
Este es un pequeño sample para iniciar la libreria VLF (usada en DC8) para hacer un menu simple con varias opciones, espero que os sea útil.
Main.c (Codigo principal):
/**************************************** * Nombre: Sample VLF Menu * * Autor: _Dark_Cloud_ * ****************************************/ // Librerias principales (necesarias) #include <pspsdk.h> #include <pspkernel.h> #include <pspdebug.h> #include <pspctrl.h> #include <psppower.h> // Libreria VLF #include <vlf.h> // Nombre de aplicación y modo de carga (3xx) PSP_MODULE_INFO("Sample VLF Menu", 0, 1, 0); PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER); // Callbacks int ExitCallback(int arg1, int arg2, void *common) { sceKernelExitGame(); return 0; } int CallbackThread(SceSize args, void *argp) { int callback_id; callback_id = sceKernelCreateCallback("Exit Callback", ExitCallback, NULL); sceKernelRegisterExitCallback(callback_id); sceKernelSleepThreadCB(); return 0; } int SetupCallback(void) { int thread_id = 0; thread_id = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, THREAD_ATTR_USER, 0); if (thread_id >= 0) { sceKernelStartThread(thread_id, 0, 0); } return thread_id; } void MainMenu(int sel); int text; int option = 0; // Para recordar la opcion seleccionada // Opcion para volver al menu principal int BackToMainMenu() { // Borramos los textos vlfGuiRemoveText(text); // Quitamos el mensaje inferior vlfGuiCancelBottomDialog(); // Volvemos al menu (opcion 1) MainMenu(option); return VLF_EV_RET_NOTHING; } // 1ª y 2ª Opcion del menu void ExampleSelection(int opt) { // 1ª Opcion if (opt == 0) { text = vlfGuiAddText(80, 100, "Has escogido la primera opción."); option = opt; } // 2ª Opcion else { text = vlfGuiAddText(80, 100, "Has escogido la segunda opción."); option = opt; } // Mensaje inferior vlfGuiBottomDialog(VLF_DI_BACK, -1, 1, 0, VLF_DEFAULT, BackToMainMenu); } // Declaramos las funciones de cada opcion del menu int OnMainMenuSelect(int sel) { switch(sel) { // Opcion 1 case 0: vlfGuiCancelBottomDialog(); // Borra mensaje inferior ExampleSelection(0); //Carga opcion 1 break; // Opcion 2 case 1: vlfGuiCancelBottomDialog(); // Borra mensaje inferior ExampleSelection(1); // Carga opcion 2 break; // Opcion 3 -> Salir case 2: sceKernelExitGame(); // Salimos del juego break; } return VLF_EV_RET_REMOVE_OBJECTS | VLF_EV_RET_REMOVE_HANDLERS; } // Texto del menu void MainMenu(int sel) { //Opciones del menu (texto) char *items[] = { "Iniciar", "Créditos", "Salir" }; // Establecemos un menu central vlfGuiCentralMenu(3, items, sel, OnMainMenuSelect, 0, 0); // Mostramos mensaje inferior vlfGuiBottomDialog(-1, VLF_DI_ENTER, 1, 0, VLF_DEFAULT, NULL); } // Aplicacion int app_main() { // Variables int titulo = vlfGuiAddText(0,0,"Sample VLF Menu"); // Titulo barra superior int icono; // Variable para icono de barra superior void *battery_icon; // Variable para el icono de batería // Callbacks SetupCallback(); // Color de fondo (en este caso plano) vlfGuiSetBackgroundPlane(0x00CC99); // Mostramos las olas (actualmente clasicas, se esperan las nuevas en las proximas versiones de la vlf) vlfGuiSetModelSystem(); // Mostramos reloj en la esquina superior derecha vlfGuiAddClock(); // Mostramos icono de batería vlfGuiAddBatteryIconSystem(&battery_icon, 10*1000*1000); // Añade el icono de la bateria // Cargamos Icono barra superior icono = vlfGuiAddPictureResource("sysconf_plugin", "tex_bar_init_icon", 4, -2); // Creamos barra superior vlfGuiSetTitleBarEx(titulo, icono, 1, 0, 0x152654); // Mostramos menu anteriormente creado MainMenu(0); // Bucle principal while(1) { vlfGuiDrawFrame(); // Mostramos todo por pantalla } sceKernelSleepThread(); return 0; }
Explicación Código:
//Callbacks -> Sirven para hacer funcional el botón home en programas con VLF (Gracias a Mizar por aclararmelo)
// Callbacks int ExitCallback(int arg1, int arg2, void *common) { sceKernelExitGame(); return 0; } int CallbackThread(SceSize args, void *argp) { int callback_id; callback_id = sceKernelCreateCallback("Exit Callback", ExitCallback, NULL); sceKernelRegisterExitCallback(callback_id); sceKernelSleepThreadCB(); return 0; } int SetupCallback(void) { int thread_id = 0; thread_id = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, THREAD_ATTR_USER, 0); if (thread_id >= 0) { sceKernelStartThread(thread_id, 0, 0); } return thread_id; }
//BackToMainMenu -> Funcion para volver al menu principal desde las opciones borrando los textos y los mensajes inferiores.
// Opcion para volver al menu principal int BackToMainMenu() { // Borramos los textos vlfGuiRemoveText(text); // Quitamos el mensaje inferior vlfGuiCancelBottomDialog(); // Volvemos al menu (opcion 1) MainMenu(option); return VLF_EV_RET_NOTHING; }
//ExampleSelection -> Muestran por pantalla la opción seleccionada con las fuentes de la psp (pgf).
// 1ª y 2ª Opcion del menu void ExampleSelection(int opt) { // 1ª Opcion if (opt == 0) { text = vlfGuiAddText(80, 100, "Has escogido la primera opción."); option = opt; } // 2ª Opcion else { text = vlfGuiAddText(80, 100, "Has escogido la segunda opción."); option = opt; } // Mensaje inferior vlfGuiBottomDialog(VLF_DI_BACK, -1, 1, 0, VLF_DEFAULT, BackToMainMenu); }
//OnMainMenuSelect -> Crean los eventos/acciones que son activados al pulsar sobre las opciones del menu.
// Declaramos las funciones de cada opcion del menu int OnMainMenuSelect(int sel) { switch(sel) { // Opcion 1 case 0: vlfGuiCancelBottomDialog(); // Borra mensaje inferior ExampleSelection(0); //Carga opcion 1 break; // Opcion 2 case 1: vlfGuiCancelBottomDialog(); // Borra mensaje inferior ExampleSelection(1); // Carga opcion 2 break; // Opcion 3 -> Salir case 2: sceKernelExitGame(); // Salimos del juego break; } return VLF_EV_RET_REMOVE_OBJECTS | VLF_EV_RET_REMOVE_HANDLERS; }
//MainMenu -> Muestra el menu central con sus opciones y su efecto focus.
// Texto del menu void MainMenu(int sel) { //Opciones del menu (texto) char *items[] = { "Iniciar", "Créditos", "Salir" }; // Establecemos un menu central vlfGuiCentralMenu(3, items, sel, OnMainMenuSelect, 0, 0); // Mostramos mensaje inferior vlfGuiBottomDialog(-1, VLF_DI_ENTER, 1, 0, VLF_DEFAULT, NULL); }
//AppMain -> Aquí se declaran las funciones para poner la barra superior, las olas y para cargar las funciones iniciales como el menu principal.
// Aplicacion int app_main() { // Variables int titulo = vlfGuiAddText(0,0,"Sample VLF Menu"); // Titulo barra superior int icono; // Variable para icono de barra superior void *battery_icon; // Variable para el icono de batería // Callbacks SetupCallback(); // Color de fondo (en este caso plano) vlfGuiSetBackgroundPlane(0x00CC99); // Mostramos las olas (actualmente clasicas, se esperan las nuevas en las proximas versiones de la vlf) vlfGuiSetModelSystem(); // Mostramos reloj en la esquina superior derecha vlfGuiAddClock(); // Mostramos icono de batería vlfGuiAddBatteryIconSystem(&battery_icon, 10*1000*1000); // Añade el icono de la bateria // Cargamos Icono barra superior icono = vlfGuiAddPictureResource("sysconf_plugin", "tex_bar_init_icon", 4, -2); // Creamos barra superior vlfGuiSetTitleBarEx(titulo, icono, 1, 0, 0x152654); // Mostramos menu anteriormente creado MainMenu(0); // Bucle principal while(1) { vlfGuiDrawFrame(); // Mostramos todo por pantalla } sceKernelSleepThread(); return 0; }
crt0.c (Imprescindible):
El crt0 es el encargado de iniciar la libreria VLF cargando los prx:
/**************************************** * Nombre: Sample VLF Menu * * Autor: _Dark_Cloud_ * ****************************************/ // Librerias principales (necesarias) #include <pspkernel.h> // Libreria VLF #include <vlf.h> extern int app_main(int argc, char *argv[]); int start_thread(SceSize args, void *argp) { SceUID mod; char *path = (char *)argp; int last_trail = -1; int i; if (path) { for (i = 0; path[i]; i++) { if (path[i] == '/') last_trail = i; } } if (last_trail >= 0) path[last_trail] = 0; sceIoChdir(path); path[last_trail] = '/'; mod = sceKernelLoadModule("./prx/iop.prx", 0, NULL); mod = sceKernelStartModule(mod, args, argp, NULL, NULL); mod = sceKernelLoadModule("./prx/intraFont.prx", 0, NULL); mod = sceKernelStartModule(mod, args, argp, NULL, NULL); mod = sceKernelLoadModule("./prx/vlf.prx", 0, NULL); mod = sceKernelStartModule(mod, args, argp, NULL, NULL); vlfGuiInit(-1, app_main); return sceKernelExitDeleteThread(0); } int module_start(SceSize args, void *argp) { SceUID thid = sceKernelCreateThread("start_thread", start_thread, 0x10, 0x4000, 0, NULL); if (thid < 0) return thid; sceKernelStartThread(thid, args, argp); return 0; }
Makefile VLF:
Los makefile son los encargados de dar las instrucciones de compilación al compilador gcc.
Son imprescindibles para crear nuestros EBOOT.PBP o nuestros Plugin.prx
TARGET = SAMPLE_VLF_MENU OBJS = crt0.o main.o INCDIR = ./include CFLAGS = -O2 -G0 -Wall -fshort-wchar -fno-pic -mno-check-zero-division CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti ASFLAGS = $(CFLAGS) -c LIBDIR = ./lib LDFLAGS = -mno-crt0 -nostdlib -nodefaultlibs LIBS = -lvlfgui -lvlfgu -lvlfutils -lvlflibc PSP_FW_VERSION = 500 BUILD_PRX = 1 EXTRA_TARGETS = EBOOT.PBP PSP_EBOOT_TITLE = Sample VLF Menu PSPSDK=$(shell psp-config --pspsdk-path) include $(PSPSDK)/lib/build.mak
Les dejamos el SRC adjunto para estudiarlo con mayor calma.
Descargar SRC Sample VLF Menu (Solo Usuarios Registrados)
Comentarios
Hola. Muchas gracias por el
Hola.
Muchas gracias por el aporte. Sin duda me será de mucha ayuda, gracias.
Saludos _Dark_Cloud_.
Fijate en la fecha xD
Fijate en la fecha xD
By Dark_CoDev
Ya sé que es viejo, pero es un tutorial y no un comentario Quería dejarle una muestra de agradecimiento al autor.
Saludos Tutos14.
Necesito ayuda urgente..
Bueno,primero HOLA espero y esten bien
ah si emm.la ayeda la pido porque ya estoy acabando mi licencia SAMPLE pero...cadavez que abro el Compilador me sale ERROR
me dice que no se puede encontrar el archivo
blah/blah/blah/*.o
blah/blah/blah/*elf
blah/blah/blah/*sfo
blah/blah/blah/*prx
pongo blah/blah/blah/ para no espesificar los nombres de las carpetas...
bueno espero y me ayuden ;)
necesito acabar ese homebrew RAPIDO para subirlo aqui a SCENEBETA xD!
bueno nos vemos PSPros
Normal.
El "Compilador.bat" que viene ahí incluido, borra los archivos *.SFO, *.O, *.ELF, *.PRX, es porque esos archivos salen al ser compilados (pero no los ocupamos porqué ya están dentro del EBOOT.PBP), por eso sale ese mensaje.
Ahora, con este SRC solo compila el EBOOT.PBP, hay veces que cuando lo compilas por primera vez te saldrá este error, es normal porque no encuentra esos archivos para ser eliminados, pero no te preocupes, sale ese mensaje porque al iniciar el "Compilador.bat" borra esos archivos, si no los encuentra compila el EBOOT.PBP & vuelve a borrar esos archivos.
Espero darme a entender, saludos.
Hazme la pregunta que quieras ANONIMAMENTE desde aquí.
OK
vueno lo intentare Gracias migue ;)
te entendi entre un 94 y 98% pero si entendi
GRACIAS(2)
bueno salu2
Problema
Soy noob en la prgramacion en C para psp i siempre k cargo el compilador acaba dando error k no encuentra build.mak alguien me puede ajudar?? por favor es muy importante
A y muy buen aporte grax
Péganos tu Makefile
Péganos tu Makefile
ayuda por favor
como puedo poner que la opcion seleccionada en VLF, me envie a mas
opciones como lo hace el ultra pandora installer v4.0 cuando
seleccionamos la opcion USB me pone a elegir si quiero conectarme en la
Memory Stick, Flash 0 ,etc
Get your Portable ID!
Gracias
Se agradecen mucho estos tutoriales. Lo malo del C para PSP es que la mayoría los coders tiene la manía de no mostrar códigos y por ejemplo con este se ve de una forma muy clara el funcionamiento de los threads y los callbacks entre otras cosas.
Se agradece el esfuerzo. Un saludo.
LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.
Buenas
La verdad es que publiqué este sample porque me parecía interesante que la gente aprendiera a utilizar esta libreria (aunque aun en pañales) bastante buena a mi parecer.
Un saludo crack ;)
¡Visca el Barça y Viva España!
Bien ;)
Espero aprender a programar en C algún día.
sAlud0s!
Gran tuto
Gran tuto, me ira perfecto aora que estoy aprendiendo C para psp, gracias.
Muy bueno
el tuto, muchas gracias.