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.
Descargar SRC Sample VLF Menu (Solo Usuarios Registrados)
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
ayuda
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!
Y para Lua PGE??
Y para Lua PGE??
Ese..
El de Lua PGE esta aparte ya que este es de C. Buscalo en la portada, o en los tutos de programación.
Yo busco tutos para hacer
Yo busco tutos para hacer aplicaciones en Lua pge y no los encuentro por ningun sitio
Mmm..
Para aplicaciónes te recomiendo Lua HM (si es posible LuaHMv2), el Lua PGE es dedicado primeramente a juegos.
?
No te enseñaran a hacer una aplicacion en Lua PGE, lo que te enseñaran es Lua PGE, aqui en la web hay unos tutoriales sobres los comandos de Lua PGE.
Problema con descarga..
Los tutoriales de SceneBeta de Edicion y Coders dicen que debes de subir los archivos en formato .RAR, es este una equivocación no?
PD: Gracias por el tuto, muy bien redactado, me pondré hacer el tutorial de VLF para Lua PGE :)
Hazme la pregunta que quieras ANONIMAMENTE desde aquí.
no.
Los source code (codigo fuente) se suben en tar.gz
salu3
Disculpa..
Un error de leer..
Perfecto..disculpa codeer y gracias Viciuz :)
ja!
ni que fuera pa tanto xD
salu3
descarga
La descarga no va.
Y esta bien pero esto del C.... me sigue sonando a chino, lo veo demasiado complicado.
Saludos y enhorabuena por tu tutorial.
La verdad
C no es tan dificl,lo complicado es aprenderce las funciones de las librerias, por lo menos para mi.
Un saludo.
Buenas
Me has pillao resubiendo que habia subido la descarga con espacios y antes de que nite me cruja lo he corregido xD
El C es el lenguaje por excelencia y cuando te adaptas a el puedes adaptarte a casi todos ;)
Salu2
¡Visca el Barça y Viva España!
Ah ok sorry xD
Yo ya intente aprender C una vez pero.... ff me dejó K.O xd.
Lo que sí se, es que si aprendo C, sera para PC y dejaré la programación de la PSP.
Haber si acabo de hacer algun homebrew SERIO, y ya luego en verano si tengo tiempo libre, volveré a mirar el C, pero no creo que programe en C para PSP.
Saludos ;)
C para PC. La verdad es que
C para PC. La verdad es que no tiene sentido lo que dices, no existe el "C para PC", el C es igual en cualquier plataforma, sea un PC, una PSP o un SG. Si por ejemplo desarrollas un juego bajo librerias multiplataforma (que son las que se usan en la scene, SDLo allegro), te dará igual para qué plataforma lo programes.
Luego usar la API de la PSP no tiene mayor misterio, son simplemente funciones con parámetros, igual que te vas a encontrar en cualquier API.
LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.
Bueno, tienes razón xd.
Lo que me di a entender, es que si programara en C, lo haría para el pc seguramente.
Tu... como ves el tema de aprender C? es que yo no lo veo claro... Con lo sencillo que es Lua... En lo que tube problemas de C fué en los graficos :S.
Saludos.
Consejo...
Yo el C nunca lo recomiendo como el primer lenguaje, pero si ya sabes algo de Lua, eso ya es decisión tuya.
Yo no lo veo complicado, al contrario otros lenguajes como Lua o python, me parecen demasiado limitados y simples, al fin y al cabo no son más que un "wrap" de librerias que llaman a funciones hechas en C, Yo prefiero atarcar al C directamente (o usar C++ convirtiendo esas funciones/librerías en clases). También es cierto que los lenguajes interpretados como Lua, te pueden ahorrar muchas horas de trabajo para algo que con el C tardarías mucho más. Hay que saber ver el equilibrio "tiempo de desarrollo/tiempo de depuración/redimiento".
De todas formas es más importante tener una buena base de programación idependientemente del lenguaje, que aprender sin metodología usando un lenguaje cualquiera. Esto quiere decir que si quieres programar "de verdad" te toca empollar teoría sí ó sí. Una vez tengas claros esos conceptos, el lenguaje es lo de menos.
Aconsejarte, pues que al menos lo intentes, si ves que no estás agusto, no te aclaras, o no te gusta (no a todo el mundo le tiene que gustar el C, faltaría más :D), pues lo dejas y yastá.
Eso sí, si te quieres dedicar a juegos que requieran rendimiento, no vas a tener más remedio que aprenderlo.
LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.
Buenas
Yo empecé con C para PC para iniciarme en el lenguaje y poder llegar a comprenderlo y de ahí derivé a PSP, Wii (fracasando) y NDS (No supe manejarme con ARM7 y ARM9 :P)
PD: He editado un poco el tuto para que sea mas un tuto xDD
Saludines
¡Visca el Barça y Viva España!
Te admiro xDD
Yo mire los tutos de C para pc, pero como te dije me costó mucho entenderlo abandoné casi sin empezar.
Lo que no se que hacer es si ponerme a estudiar C o no, pues yo en unos años tengo pensado hacer la carrera de Ingenieria Informatica y puesto que allí aprenderé C, pos no se si ya que lo aprenderé, hacerlo ahora.
Saludos