我的touserdata和newuserdata遇到了一些意想不到的问题,传递给C ++的数据与我创建userdata时存储的数据不同,下面我有与创建和功能相关的所有功能我打电话给你(
我用这个lua代码创建我的头像avatar = avatar_create(" hero1") 在c ++中是这个
int LuaObjectFactory::createAvatar(lua_State* L){
auto avatar = new Avatar(lua_tostring(L, 1)); // 0x011afd20
auto userdata = Util::luaP_newuserdata<Avatar>(L, avatar); // 0x011a4a18
luaP_getScenes(L)->getActiveScene()->addEntity(avatar);
Util::luaP_setmetatable(L, Avatar::lGetMetatable());
return 1;
}
template<typename T> T** luaP_newuserdata(lua_State* L, T* data){
T** o = static_cast<T**>(lua_newuserdata(L, sizeof(T*)));
// Does not copy the data, only remembers reference to it
*o = data;
return o;
}
inline void luaP_setmetatable(lua_State* L, const string& metatable){
luaL_getmetatable(L, &metatable[0]);
lua_setmetatable(L, -2);
}
template<typename T> T* luaP_touserdata(lua_State* L, int idx){
return *static_cast<T**>(lua_touserdata(L, idx));
}
然后我尝试用这个lua代码调用Avatar的函数
avatar = avatar_create("hero1")
avatar:setPosition(12, 10)
avatarPos = avatar:getPosition()
调用这两个函数
template<typename T> static int lGetPosition(lua_State* L){
auto p = Util::luaP_touserdata<T>(L, 1); // 0x008ff0d8
auto v = p->getPosition();
lua_pushnumber(L, v.x);
lua_pushnumber(L, v.y);
return 0;
}
template<typename T> static int lSetPosition(lua_State* L){
auto p = Util::luaP_touserdata<T>(L, 1); // 0x008ff0d8
auto v = Math::Vector2(static_cast<int>(lua_tonumber(L, 2)),
static_cast<int>(lua_tonumber(L, 3)));
p->setPosition(v);
return 0;
}
我评论了从我的调试尝试返回的内存地址,luaP_touserdata返回相同的地址,尽管我在0x008ff0d8上设置的值已经被删除了以后我去了它们
我注意到的另一件事是0x008ff0d8的地址是一个指向指针的指针,指针指向0x008ff0d8。