toLua++ example
Last Updated: 10 August, 2010
This example demonstrates how easy it is to join LUA to C++ classes with very little coding. tolua++ is an extended version of tolua. tolua is a tool which makes it easier to combine LUA and C/C++. It generates binding C/C++ code. tolua++ offers additional features and is designed for C++ You can download toLua++ from http://www.codenix.com/~tolua/ (opens in new window). And the source code for this example can be downloaded here:
|
Genereate tolua source files
Type the following in the command prompt. You can prefix the source files with anything you like. My preference is to use the prefix "tolua_".
tolua++ -o tolua_Player.cpp -H tolua_Player.h -n Player Player.pkg
tolua++ -o tolua_Player.cpp -H tolua_Player.h -n Player Player.pkg
main.cpp
#include <iostream> #include <string> using namespace std; #include <tolua++.h> #include <lua.hpp> #include <lualib.h> #include <lauxlib.h> #include "Player.h" #include "tolua_Player.h" int main() { // // Perform initalization. TODO: Add error checking for tolua? // lua_State *L = lua_open(); if (NULL == L) { cout << "Error Initializing lua\n"; return -1; } luaL_openlibs(L); // initalize all lua standard library functions tolua_open(L); // initalize tolua tolua_Player_open(L); // make Player class accessible from LUA // // Run lua script to create player. This could also have been done using luaL_dostring(). // luaL_dofile(L, "loadplayer.lua"); // // Get the player object from lua // lua_getglobal(L, "player"); Player* player = (Player*)tolua_tousertype(L, -1, 0); // // Display health and change value // cout << "\nC++: Player's health is " << player->getHealth() << " - Now setting it to 6"; player->setHealth(6); cout << "\nC++: Player's health is now " << player->getHealth() << "\n"; // // The player object in LUA should now be updated. This code could also be put inside a lua script. // luaL_dostring(L, "io.write(\"LUA: Player's health is \"..player:getHealth()..\" - Now setting it to 11\")"); luaL_dostring(L, "player:setHealth(11)"); cout << endl; luaL_dostring(L, "io.write(\"LUA: Player's health is now \"..player:getHealth())"); // // Perform cleanup. // lua_close(L); return 0; }
Player.h
#ifndef PLAYER_H #define PLAYER_H class Player { private: int health; public: Player(); ~Player(); void setHealth(int _health); int getHealth(); }; #endif // PLAYER_H
Player.cpp
#include "Player.h" Player::Player() { health = 0; } Player::~Player() { } void Player::setHealth(int _health) { health = _health; } int Player::getHealth() { return health; }
The pkg file tells toLua++ what functions to make available to LUA.
Player.pkg
$#include "Player.h" class Player { Player(); ~Player(); void setHealth(int _health); int getHealth(); };
loadplayer.lua
-- Create new Player object and set health player = Player:new() player:setHealth(4) -- Display players health io.write("LUA: Player's health is "..player:getHealth());