[Tutorial] Creando tu propio Lua Player
Últimas Tendencias en Moda
Inicio » PSP » [Tutorial] Creando tu propio Lua Player

[Tutorial] Creando tu propio Lua Player

¿Nunca has querido descubrir como crearon LuaHM7, LuaDEV o LuaPGE? Pues ahora con este tutorial ¡sabrás como! Para hacer este tutorial me he basado en uno de va2ron1 de la comunidad de SceneBeta. Así que todos los créditos van para él. Bueno, manos a la obra, para empezar necesitas:

Vale, una vez tengamos todo listo pasamos a  ver el código que debe tener cualquier LuaPlayer:

Main.c

Como los desarrolladores sabréis es el código principal del programa, más adelante está el Makefile. Sin más rodeos aquí está el código:

// Lua Player para PSPStation

#include
#include
#include
#include
#include
#include

#include “lua.h”
#include “lualib.h”
#include “lauxlib.h”

/* Definimos*/
PSP_MODULE_INFO(“LUATEST”, 0, 1, 1);

PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);

/* Definir printf, para escribir en pantalla*/
#define printf pspDebugScreenPrintf

int exit_callback(void)
{
sceKernelExitGame();

return 0;
}

int CallbackThread(SceSize args, void *argp)
{
int cbid;

cbid = sceKernelCreateCallback(“Exit Callback”, (void *) exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);

sceKernelSleepThreadCB();

return 0;
}

/* Preparar el callback*/
int SetupCallbacks(void)
{
int thid = 0;

thid = sceKernelCreateThread(“update_thread”, CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0)
{
sceKernelStartThread(thid, 0, 0);
}

return thid;
}

int lua_ctrlRead(lua_State *L)
{
int argc = lua_gettop(L);
if (argc != 0) return luaL_error(L, “wrong number of arguments”);

SceCtrlData pad;
sceCtrlReadBufferPositive(&pad, 1);

// push return value (multiple return values are possible)
lua_pushnumber(L, (int)pad.Buttons);

// number of returned arguments
return 1;
}

#define CHECK_CTRL(name, bit) \
int name(lua_State *L) \
{ \
int argc = lua_gettop(L); \
if (argc != 1) return luaL_error(L, “wrong number of arguments”); \
\ \
int argument = luaL_checkint(L, 1); \
\ \
lua_pushboolean(L, (argument & bit) == bit); \
return 1; \
}

CHECK_CTRL(lua_isCtrlSelect, PSP_CTRL_SELECT)
CHECK_CTRL(lua_isCtrlStart, PSP_CTRL_START)
CHECK_CTRL(lua_isCtrlUp, PSP_CTRL_UP)
CHECK_CTRL(lua_isCtrlRight, PSP_CTRL_RIGHT)
CHECK_CTRL(lua_isCtrlDown, PSP_CTRL_DOWN)
CHECK_CTRL(lua_isCtrlLeft, PSP_CTRL_LEFT)
CHECK_CTRL(lua_isCtrlLTrigger, PSP_CTRL_LTRIGGER)
CHECK_CTRL(lua_isCtrlRTrigger, PSP_CTRL_RTRIGGER)
CHECK_CTRL(lua_isCtrlTriangle, PSP_CTRL_TRIANGLE)
CHECK_CTRL(lua_isCtrlCircle, PSP_CTRL_CIRCLE)
CHECK_CTRL(lua_isCtrlCross, PSP_CTRL_CROSS)
CHECK_CTRL(lua_isCtrlSquare, PSP_CTRL_SQUARE)
CHECK_CTRL(lua_isCtrlHome, PSP_CTRL_HOME)
CHECK_CTRL(lua_isCtrlHold, PSP_CTRL_HOLD)

int lua_waitVblankStart(lua_State *L)
{
if (lua_gettop(L) != 0) return luaL_error(L, “wrong number of arguments”);
sceDisplayWaitVblankStart();
return 0;
}

int lua_print(lua_State *L)
{
int argc = lua_gettop(L);
int n;
for (n=1; n return 0;
}

int main(int argc, char** argv)
{
pspDebugScreenInit();
SetupCallbacks();

const char* scriptName = “script.lua”;
char* scriptFilename = (char*) malloc(strlen(argv[0]) + strlen(scriptName));
strcpy(scriptFilename, argv[0]);
char* end = strrchr(scriptFilename, ‘/’);
end++;
*end = 0;
strcat(scriptFilename, scriptName);

// Iniciar Lua y las librerias
lua_State *L = lua_open();
luaL_openlibs(L);

// Poner nombre a las funciones
lua_register(L, “ctrlRead”, lua_ctrlRead);
lua_register(L, “isCtrlSelect”, lua_isCtrlSelect);
lua_register(L, “isCtrlStart”, lua_isCtrlStart);
lua_register(L, “isCtrlUp”, lua_isCtrlUp);
lua_register(L, “isCtrlRight”, lua_isCtrlRight);
lua_register(L, “isCtrlDown”, lua_isCtrlDown);
lua_register(L, “isCtrlLeft”, lua_isCtrlLeft);
lua_register(L, “isCtrlUp”, lua_isCtrlUp);
lua_register(L, “isCtrlLTrigger”, lua_isCtrlLTrigger);
lua_register(L, “isCtrlRTrigger”, lua_isCtrlRTrigger);
lua_register(L, “isCtrlTriangle”, lua_isCtrlTriangle);
lua_register(L, “isCtrlCircle”, lua_isCtrlCircle);
lua_register(L, “isCtrlCross”, lua_isCtrlCross);
lua_register(L, “isCtrlSquare”, lua_isCtrlSquare);
lua_register(L, “isCtrlHome”, lua_isCtrlHome);
lua_register(L, “isCtrlHold”, lua_isCtrlHold);
lua_register(L, “print”, lua_print);
lua_register(L, “waitVblankStart”, lua_waitVblankStart);

// Carga el script
int status = luaL_loadfile(L, scriptFilename);

// call script
if (status == 0) status = lua_pcall(L, 0, LUA_MULTRET, 0);

if (status != 0) {
printf(“error: %s\n”, lua_tostring(L, -1));
lua_pop(L, 1);
}

// Un poco de limpieza
lua_close(L);
free(scriptFilename);

sceKernelExitGame();

return 0;
}

Hasta aquí, el código principal, hemos definido los controles y algunas funciones principales. Ya solo nos queda el Makefile. Es el siguiente:

TARGET = luatest
OBJS = main.o

INCDIR =

CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBDIR =
LIBS = -llua -lm
LDFLAGS =

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Lua test program

PSPSDK=$(shell psp-config –pspsdk-path)
include $(PSPSDK)/lib/build.mak

Pues ya está ya lo tenéis, ¡vuestro propio Lua Player! Cualquier duda coméntala aquí.

Búsquedas Relacionadas:

  • eboot pbp a codigo

Deja un Comentario

Utilizamos cookies propias y de terceros para mostrarle publicidad relacionada con sus preferencias según su navegación. Si continúa navegando consideramos que acepta el uso de cookies. Más información >