Anuncios Google

Sample Menu VLF

Tutoriales Avanzados Homebrewes

Ahora les traemos un sample creado por el coder 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:

  • 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

Les dejamos el SRC adjunto para estudiarlo con mayor calma.

Descargar SRC Sample VLF Menu (Solo Usuarios Registrados)

4.113635
Tu voto: Ninguno Votos totales: 4.1 (88 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 User170294

Hola. Muchas gracias por el

Hola.

Muchas gracias por el aporte. Sin duda me será de mucha ayuda, gracias.

Saludos _Dark_Cloud_.

Imagen de Tutos14

Fijate en la fecha xD

Fijate en la fecha xD

Imagen de User170294

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

Imagen de Migueliziosop

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.

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

Imagen de pspgorrister

Péganos tu Makefile

Péganos tu Makefile

Imagen de Protodev

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

Imagen de pspgorrister

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.

Imagen de _Dark_Cloud_

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!

Imagen de el__QAT

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.

Imagen de Robione22

Muy bueno

el tuto, muchas gracias.

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.