Lua Apps
Here's the layout for pure Lua applications. This will run on Android, iOS, Windows, and Mac, with no third-party compilers to mess around with. And because it's JIT compiled by the engine itself, it's fast:
--This function will be called once when the program starts
function App:Start()
--Set the application title
self.title="Darkness Awaits"
--Create settings table and add defaults
self.settings={}
self.settings.vsync=true
--Load the user's settings
self:LoadSettings()
--Create a window
self.window=Window:Create(self.title,0,0,1024,768,Window.Titlebar)
--Create the graphics context
self.context=Context:Create(self.window,0)
if self.context==nil then return false end
--Create a world
self.world=World:Create()
--Create a camera
self.camera = Camera:Create()
self.camera:SetPosition(0,5,-10)
--Load a test scene
Scene:Load("Scenes\\trash.scene")
return true
end
--This is our main program loop and will be called continuously until the program ends
function App:Continue()
--If window has been closed, end the program
if self.window:Closed() then return false end
--Update the world
self.world:Update()
--Render the world
self.world:Render()
--Refresh the screen
self.context:Swap(self.settings.vsync)
--Returning true tells the main program to keep looping
return true
end
function App:Pause()
--Pause time updating
Time:Pause()
end
function App:Resume()
--Resume time updating
Time:Resume()
end
function App:Finish()
--Save user settings to a file
self:SaveSettings()
end
--Load user settings from a file
function App:LoadSettings()
return true
end
--Save user settings to a file
function App:SaveSettings()
return true
end
And just for fun, here's the C++ code that makes all the calls to Lua scripts. It's more low-level than you will need to deal with, but it shows how powerful the script command set is:
bool App::Start()
{
Int stacksize = Interpreter::GetStackSize();
//Create New table And assign it To the Global variable "App"
Interpreter::NewTable();
Interpreter::SetGlobal("App");
//Invoke the start script
If (!Interpreter::ExecuteFile("Scripts\\App.lua"))
{
Print("Error: Failed to execute\"Scripts\\App.lua\".");
Return False;
}
//Restore the stack size
Interpreter::SetStackSize(stacksize);
//Call the App:Start() Function
Interpreter::GetGlobal("App");
If (Interpreter::IsTable())
{
Interpreter::PushString("Start");
Interpreter::GetTable();
If (Interpreter::IsFunction())
{
Interpreter::PushValue(-2);//Push the app table onto the stack as "self"
If (!Interpreter::Invoke(1,1)) Return False;
If (Interpreter::IsBool())
{
If (!Interpreter::ToBool()) Return False;
}
Else
{
Return False;
}
}
}
//Restore the stack size
Interpreter::SetStackSize(stacksize);
Return True;
}
bool App::Continue()
{
//Get the stack size
Int stacksize = Interpreter::GetStackSize();
//Call the App:Start() Function
Interpreter::GetGlobal("App");
If (Interpreter::IsTable())
{
Interpreter::PushString("Continue");
Interpreter::GetTable();
If (Interpreter::IsFunction())
{
Interpreter::PushValue(-2);//Push the app table onto the stack as "self"
If (!Interpreter::Invoke(1,1))
{
Print("Error: Script function App:Continue() was not successfully invoked.");
Return False;
}
If (Interpreter::IsBool())
{
If (!Interpreter::ToBool())
{
Return False;
}
}
Else
{
Return False;
}
}
Else
{
Print("Error: App:Continue() function not found.");
Return False;
}
}
Else
{
Print("Error: App table not found.");
Return False;
}
//Restore the stack size
Interpreter::SetStackSize(stacksize);
Return True;
}
void App::Pause()
{
//Get the stack size
Int stacksize = Interpreter::GetStackSize();
//Call the App:Start() Function
Interpreter::GetGlobal("App");
If (Interpreter::IsTable())
{
Interpreter::PushString("Pause");
Interpreter::GetTable();
If (Interpreter::IsFunction())
{
Interpreter::PushValue(-2);//Push the app table onto the stack as "self"
If (!Interpreter::Invoke(1))
{
Print("Error: Failed to invoke script function App:Pause()");
Return;
}
}
}
//Restore the stack size
Interpreter::SetStackSize(stacksize);
}
void App::Finish()
{
//Get the stack size
Int stacksize = Interpreter::GetStackSize();
//Call the App:Finish() Function
Interpreter::GetGlobal("App");
If (Interpreter::IsTable())
{
Interpreter::PushString("Finish");
Interpreter::GetTable();
If (Interpreter::IsFunction())
{
Interpreter::PushValue(-2);//Push the app table onto the stack as "self"
If (!Interpreter::Invoke(1))
{
Print("Error: Failed to invoke script function App:Finish()");
Return;
}
}
}
//Restore the stack size
Interpreter::SetStackSize(stacksize);
}
-
2
3 Comments
Recommended Comments