[Tutorial] Creando tu propio Lua Player
Newgamespsp :: PSP :: Juegos PSP :: Manuales/Tutoriales PSP
Página 1 de 1.
[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:
El SDK de la PSP (Fácil de encontrar)
La librería de Lua para C
[size=10pt]DETALLES:[/size]
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:
- Spoiler:
- // 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"); \
\
/* get first argument as int */ \
int argument = luaL_checkint(L, 1); \
\
/* push result */ \
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;
}
// print all arguments, converted to strings
int lua_print(lua_State *L)
{
int argc = lua_gettop(L);
int n;
for (n=1; n <= argc; n++) printf("%s\n", lua_tostring(L, 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! :ser:
Newgamespsp :: PSP :: Juegos PSP :: Manuales/Tutoriales PSP
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.