0

例子:

player = {}
player.shape = {x = 0, y = 0, w = 50, h = 50}

Lua 中是否有一个函数可以告诉我 player.shape 在什么表中,所以我可以这样做:

shape_a = player.shape
some_function(shape_a) = player
4

3 回答 3

6

为什么不在形状中存储对父表的引用?

player = {}
player.shape = {x = 0, y = 0, w = 50, h = 50, parent = player}

您可以使用如下元方法自动执行此操作:

local new_player = function()
  return setmetatable(
    {},
    {
      __newindex = function(t,k,v)
        if k == "shape" then v.parent = t end
        rawset(t,k,v)
      end,
    }
  )
end

player = new_player()
player.shape = {x = 0, y = 0, w = 50, h = 50}

现在您可以通过调用从形状访问玩家shape.parent

于 2012-11-21T09:54:47.680 回答
1

Lua 中的值可以是任何地方。它可以同时出现在许多不同的地方。确实,您的代码清楚地表明了这一点:

shape_a = player.shape

shape表现在位于两个位置:全局表(在 name 下shape_a)和player表(在 name 下shape)。

值可以在局部变量中,它们实际上没有名称(一旦编译器完成它们就不会。

你想要的通常是不可能的。

于 2012-11-21T05:48:26.470 回答
0

您可能在谈论 box2D 或 Chipmunk 物理。(我指的是 Nicol Bolas 回复中的评论)。

如果我没记错的话,他们都有办法做到这一点,在 Chipmunk 中(我猜你正在使用什么)有一个数据字段。

从花栗鼠手册:

cpDataPointer cpBodyGetUserData(const cpBody *body)
void cpBodySetUserData(cpBody *body, const cpDataPointer value)

用户数据指针。使用此指针从回调中获取对拥有此主体的游戏对象的引用。

于 2012-11-21T11:18:08.403 回答