Anuncios Google

[EN PORTADA] Sample Menu VLF

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:

  • intraFont.prx -> Para las fuentes de la psp (pgf)
  • iop.prx -> Similar a la libreria Stdio.h, para VLF
  • vlf.prx -> Propia libreria VLF

/****************************************
*    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



¡Visca el Barça y Viva España!


Anuncios Google

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 Protodev

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

Imagen de Monty - Calabato64

Y para Lua PGE??

Y para Lua PGE??

Imagen de el__QAT

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

Imagen de el__QAT

Mmm..

Para aplicaciónes te recomiendo Lua HM (si es posible LuaHMv2), el Lua PGE es dedicado primeramente a juegos.

Imagen de Arkanist

?

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.

Imagen de Migueliziosop

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 :)

Imagen de _-Viciuz-_

no.

Los source code (codigo fuente) se suben en tar.gz

salu3

Imagen de Migueliziosop

Disculpa..

Un error de leer..

Perfecto..disculpa codeer y gracias Viciuz :)

Imagen de _-Viciuz-_

ja!

ni que fuera pa tanto xD

salu3

Imagen de Arkanist

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.

Imagen de Guillermo_Cornielle

La verdad

C no es tan dificl,lo complicado es aprenderce las funciones de las librerias, por lo  menos para mi.

Un saludo.

Imagen de _Dark_Cloud_

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!

Imagen de Arkanist

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 ;)

Imagen de pspgorrister

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.

Imagen de Arkanist

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.

Imagen de pspgorrister

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.

Imagen de _Dark_Cloud_

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!

Imagen de Arkanist

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

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.