Hi,
Over the past few weeks, I've been looking into how to link objects to classes created in C++. Since I prefer to code in C++ but still value the flexibility of Lua, the goal of mine is to simply link a Object whether be a pivot, CSG, or a model to a C++ Class while having all the advantages of the Flowgraph communication, and such. When I came across ToLua++ (This File), I thought this would fix my problem.
The plan was to link an object to a class by doing something like this in the Start function:
self = self.class:new()
However, if the lua-gluecode.cpp is included in the project at all without any calls from the Interpreter, the game will just downright crash if any object has a lua script attached to it, even the ones included in the SDK. I thought it was lua-gluecode.cpp calling my class wrong, but if it's NULL, it still does the same thing.
luacommands.pkg:
class BaseEntity;
lua-gluecode.cpp:
/*
** Lua binding: luacommands
** Generated automatically by tolua++-1.0.92 on 01/15/15 17:09:26.
*/
#ifndef __cplusplus
#include "stdlib.h"
#endif
#include "string.h"
#include "tolua++.h"
/* Exported function */
TOLUA_API int tolua_luacommands_open (lua_State* tolua_S);
/* function to register type */
static void tolua_reg_types (lua_State* tolua_S)
{
tolua_usertype(tolua_S,"BaseEntity");
}
/* Open function */
TOLUA_API int tolua_luacommands_open (lua_State* tolua_S)
{
tolua_open(tolua_S);
tolua_reg_types(tolua_S);
tolua_module(tolua_S,NULL,0);
tolua_beginmodule(tolua_S,NULL);
tolua_cclass(tolua_S,"BaseEntity","BaseEntity","",NULL);
tolua_beginmodule(tolua_S,"BaseEntity");
tolua_endmodule(tolua_S);
tolua_endmodule(tolua_S);
return 1;
}
#if defined(LUA_VERSION_NUM) && LUA_VERSION_NUM >= 501
TOLUA_API int luaopen_luacommands (lua_State* tolua_S) {
return tolua_luacommands_open(tolua_S);
};
#endif
App.cpp::
#include "App.h"
using namespace Leadwerks;
App::App() : window(NULL), context(NULL), world(NULL), camera(NULL) {}
App::~App() { delete world; delete window; }
Vec3 camerarotation;
bool freelookmode=true;
bool App::Start()
{
//Initialize Steamworks (optional)
if (!Steamworks::Initialize())
{
System::Print("Error: Failed to initialize Steam.");
return false;
}
// Call ToLua++
if (Interpreter::L == NULL) Interpreter::Reset();
tolua_luacommands_open(Interpreter::L);
//Create a window
if (System::GetProperty("fullscreen") == "1")
{
window = Window::Create("Test v0.0", 0, 0, 1024, 768, Window::FullScreen);
}
else
{
window = Window::Create("Test v0.0", 0, 0, 1024, 768, Window::Titlebar);
}
//Create a context
context = Context::Create(window);
//Create a world
world = World::Create();
//Create a camera
camera = Camera::Create();
camera->Move(0,2,-5);
//Hide the mouse cursor
window->HideMouse();
std::string mapname = System::GetProperty("map","Maps/start.map");
Map::Load(mapname);
//Move the mouse to the center of the screen
window->SetMousePosition(context->GetWidth()/2,context->GetHeight()/2);
return true;
}
bool App::Loop()
{
//Close the window to end the program
if (window->Closed()) return false;
//Press escape to end freelook mode
if (window->KeyHit(Key::Escape))
{
if (!freelookmode) return false;
freelookmode=false;
window->ShowMouse();
}
if (freelookmode)
{
//Keyboard movement
float strafe = (window->KeyDown(Key:) - window->KeyDown(Key::A))*Time::GetSpeed() * 0.05;
float move = (window->KeyDown(Key::W) - window->KeyDown(Key::S))*Time::GetSpeed() * 0.05;
camera->Move(strafe,0,move);
//Get the mouse movement
float sx = context->GetWidth()/2;
float sy = context->GetHeight()/2;
Vec3 mouseposition = window->GetMousePosition();
float dx = mouseposition.x - sx;
float dy = mouseposition.y - sy;
//Adjust and set the camera rotation
camerarotation.x += dy / 10.0;
camerarotation.y += dx / 10.0;
camera->SetRotation(camerarotation);
//Move the mouse to the center of the screen
window->SetMousePosition(sx,sy);
}
Time::Update();
world->Update();
world->Render();
context->Sync();
return true;
}
If you want my BaseEntity.cpp/.h stuff, I can send it over, but it does absolutely nothing but print something on spawn. And as I said before, the luacommands.pkg can be totally empty and not be calling anything and it will still crash.
If anyone could help, or recommend me better ways of doing this, I'll appreciate it.
Thanks!