Luna 四

lua-users home
wiki

LunaV4 是对现有 LunaWrapper 的扩展。它带来了重大变化,但仍应保持向后兼容。

功能

代码

代码的缩进非常糟糕,但它是有注释的。您可以在 LunaFourCode 中找到它。如果您没有 luaL_testudata,您还需要包含它。它也可以在 LunaFourTestUserdata 中找到。

用法 - Lua 修改

要使用属性,您需要创建一个 __setindex 并修改 __index 元运算符。即使属性已存在,也需要调用 __setindex,即使属性存在,也需要调用 __index。

用法 - 设置

要使用 Luna,您必须在要包装的 C++ 类中声明以下静态变量
// declaration
static const char *className;
static const Luna < T >::FunctionType Functions[];
static const Luna < T >::PropertyType Properties[];

bool isExisting; // This is used by Luna to see whether it's been created by createFromExisting.  Don't set it.
bool isPrecious; // This is used to tell Luna not to garbage collect the object, in case other objects might reference it.  Set it in your classes constructor.

// implementation
const char *T::className = "YourClassNameInLua";
const Luna < T >::FunctionType T::Functions[] = {
	{"myFunction", &T::updateAll},	
	{0}
};
const Luna < RPhysicsManager >::PropertyType RPhysicsManager::Properties[] = {
	{"myProperty", &T::getProperty, &layer::setProperty },
	{0}
};
将 T 替换为您的 C++ 类名。

用法 - 声明函数

您的函数必须具有以下形式
int myFunction(lua_State* L)

用法 - 声明属性

属性比函数更复杂,需要两个 C++ 函数;一个用于获取,一个用于设置。两个 C++ 函数的声明类型与函数相同。下面概述了 get 和 set 函数的示例
int T::getProperty(lua_State* L)
{
	lua_pushnumber(L,X);
	return 1;
}

int T::setProperty(lua_State* L)
{
	myCPPClassVar = lua_tonumber(L,-1);
	return 0;
}

用法 - 元运算符

您可以为您的类声明元运算符。元运算符的声明与函数相同。如果我们要声明等于元运算符,我们将添加
{"__eq", &T::myComparisonFunction},
到我们的类(参见设置)。左侧的对象存储在堆栈上的位置 2,右侧的对象存储在位置 3。(位置 1 为函数中的 self 对象保留)。

用法 - 初始化我们的类

为了让用户能够初始化我们类的实例,您需要调用
Luna < core::RColor >::Register(L,"Namespace");
在您的 dofile 或 dostring 之前。您可以将 Namespace 替换为要加载类的命名空间,或将其留空以将其放入全局空间。Namespace 必须事先定义为表。在命名空间下创建类时,它们可以像这样初始化
myobject = Namespace.MyClass();

最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2009 年 1 月 11 日凌晨 4:40 GMT (差异)