| Enterado
Fecha de Ingreso: 12-March-2011 Ubicación: Detrás tuya
Mensajes: 179
Gracias: 6
Agradecido 113 veces en 39 mensajes.
| [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 (http://www.lua.org/ftp/lua-5.1.4.tar.gz)
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: Cita:
<code>// Lua Player para PSPStation</code>
<code>#include\n#include\n#include\n#include\n#inc lude\n#include</code>
<code>#include "lua.h"\n#include "lualib.h"\n#include "lauxlib.h"</code>
/* Definimos*/\nPSP_MODULE_INFO("LUATEST", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
/* Definir printf, para escribir en pantalla*/\n#define printf pspDebugScreenPrintf
int exit_callback(void)\n{\nsceKernelExitGame();
return 0;\n}
int CallbackThread(SceSize args, void *argp)\n{\nint cbid;
cbid = sceKernelCreateCallback("Exit Callback", (void *) exit_callback, NULL);\nsceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;\n}
/* Preparar el callback*/\nint SetupCallbacks(void)\n{\nint thid = 0;
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);\nif(thid >= 0)\n{\nsceKernelStartThread(thid, 0, 0);\n}
return thid;\n}
int lua_ctrlRead(lua_State *L)\n{\nint argc = lua_gettop(L);\nif (argc != 0) return luaL_error(L, "wrong number of arguments");
SceCtrlData pad;\nsceCtrlReadBufferPositive(&pad, 1);
// push return value (multiple return values are possible)\nlua_pushnumber(L, (int)pad.Buttons);
// number of returned arguments\nreturn 1;\n}
#define CHECK_CTRL(name, bit) \\nint name(lua_State *L) \\n{ \\nint argc = lua_gettop(L); \\nif (argc != 1) return luaL_error(L, "wrong number of arguments"); \\n\\n/* get first argument as int */ \\nint argument = luaL_checkint(L, 1); \\n\\n/* push result */ \\nlua_pushboolean(L, (argument & bit) == bit); \\nreturn 1; \\n}
CHECK_CTRL(lua_isCtrlSelect, PSP_CTRL_SELECT)\nCHECK_CTRL(lua_isCtrlStart, PSP_CTRL_START)\nCHECK_CTRL(lua_isCtrlUp, PSP_CTRL_UP)\nCHECK_CTRL(lua_isCtrlRight, PSP_CTRL_RIGHT)\nCHECK_CTRL(lua_isCtrlDown, PSP_CTRL_DOWN)\nCHECK_CTRL(lua_isCtrlLeft, PSP_CTRL_LEFT)\nCHECK_CTRL(lua_isCtrlLTrigger, PSP_CTRL_LTRIGGER)\nCHECK_CTRL(lua_isCtrlRTrigger, PSP_CTRL_RTRIGGER)\nCHECK_CTRL(lua_isCtrlTriangle, PSP_CTRL_TRIANGLE)\nCHECK_CTRL(lua_isCtrlCircle, PSP_CTRL_CIRCLE)\nCHECK_CTRL(lua_isCtrlCross, PSP_CTRL_CROSS)\nCHECK_CTRL(lua_isCtrlSquare, PSP_CTRL_SQUARE)\nCHECK_CTRL(lua_isCtrlHome, PSP_CTRL_HOME)\nCHECK_CTRL(lua_isCtrlHold, PSP_CTRL_HOLD)
int lua_waitVblankStart(lua_State *L)\n{\nif (lua_gettop(L) != 0) return luaL_error(L, "wrong number of arguments");\nsceDisplayWaitVblankStart();\nreturn 0;\n}
// print all arguments, converted to strings\nint lua_print(lua_State *L)\n{\nint argc = lua_gettop(L);\nint n;\nfor (n=1; n <= argc; n++) printf("%s\n", lua_tostring(L, n));\nreturn 0;\n}
int main(int argc, char** argv)\n{\npspDebugScreenInit();\nSetupCallbacks();
const char* scriptName = "script.lua";\nchar* scriptFilename = (char*) malloc(strlen(argv[0]) + strlen(scriptName));\nstrcpy(scriptFilename, argv[0]);\nchar* end = strrchr(scriptFilename, '/');\nend++;\n*end = 0;\nstrcat(scriptFilename, scriptName);
// Iniciar Lua y las librerias\nlua_State *L = lua_open();\nluaL_openlibs(L);
// Poner nombre a las funciones\nlua_register(L, "ctrlRead", lua_ctrlRead);\nlua_register(L, "isCtrlSelect", lua_isCtrlSelect);\nlua_register(L, "isCtrlStart", lua_isCtrlStart);\nlua_register(L, "isCtrlUp", lua_isCtrlUp);\nlua_register(L, "isCtrlRight", lua_isCtrlRight);\nlua_register(L, "isCtrlDown", lua_isCtrlDown);\nlua_register(L, "isCtrlLeft", lua_isCtrlLeft);\nlua_register(L, "isCtrlUp", lua_isCtrlUp);\nlua_register(L, "isCtrlLTrigger", lua_isCtrlLTrigger);\nlua_register(L, "isCtrlRTrigger", lua_isCtrlRTrigger);\nlua_register(L, "isCtrlTriangle", lua_isCtrlTriangle);\nlua_register(L, "isCtrlCircle", lua_isCtrlCircle);\nlua_register(L, "isCtrlCross", lua_isCtrlCross);\nlua_register(L, "isCtrlSquare", lua_isCtrlSquare);\nlua_register(L, "isCtrlHome", lua_isCtrlHome);\nlua_register(L, "isCtrlHold", lua_isCtrlHold);\nlua_register(L, "print", lua_print);\nlua_register(L, "waitVblankStart", lua_waitVblankStart);
// Carga el script\nint status = luaL_loadfile(L, scriptFilename);
// call script\nif (status == 0) status = lua_pcall(L, 0, LUA_MULTRET, 0);
if (status != 0) {\nprintf("error: %s\n", lua_tostring(L, -1));\nlua_pop(L, 1);\n}
// Un poco de limpieza\nlua_close(L);\nfree(scriptFilename);
sceKernelExitGame();
<code> return 0;\n}</code>\nHasta aquí, el código principal, hemos definido los controles y algunas funciones principales. Ya solo nos queda el Makefile. Es el siguiente:\n<code>TARGET = luatest\nOBJS = main.o</code>
<code>INCDIR =\nCFLAGS = -O2 -G0 -Wall\nCXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti\nASFLAGS = $(CFLAGS)</code>
<code>LIBDIR =\nLIBS = -llua -lm\nLDFLAGS =</code>
EXTRA_TARGETS = EBOOT.PBP\nPSP_EBOOT_TITLE = Lua test program
<code>PSPSDK=$(shell psp-config --pspsdk-path)\ninclude $(PSPSDK)/lib/build.mak</code> | Pues ya está ya lo tenéis, ¡vuestro propio Lua Player! Cualquier duda coméntala aquí.
__________________
Última edición por m.rr; 07-Nov-2012 a las 16:46 |