[每当我尝试使用Body.pos时,它总是说这是一个零值。但是它在新函数中分配了一个值,因此它不应为nil。
我的代码:
Vector={
x=nil,y=nil
,new=function (self,x,y)
o={}
setmetatable(o,self)
self.__index=self
o.x=x or 1
o.y=y or 1
return o
end
-- utility functions here
}
Body={
pos=nil
,vel=nil
,acc=nil
,mass=nil
,new=function (self,pos,vel,acc,mass)
o={}
setmetatable(o,self)
self.__index=self
o.pos=pos or Vector:new()
o.vel=vel or Vector:new()
o.acc=acc or Vector:new()
o.mass=mass or 1
return o
end
,applyForce=function (self,v)
self.acc:add(v:scale(1/self.mass))
end
,applyGravity=function (self)
self.acc:add(GRAVITY_VECTOR)
end
,step=function (self)
self.vel:add(self.acc)
self.pos:add(self.vel)
self.acc:scale(0)
end
}
试用代码:
b=Body:new()
print(b.pos.x) -- shows error that pos is nil
Vector:new()
不返回nil,但是Body.pos
始终为nil。我不知道我在做什么错。
编辑:添加的Vector实现
问题是您的OOP实施。需要将元表o
设置为局部变量。
在您的代码中,o
是全局变量,因此为什么在创建新对象时总是将其重置。
Vector={
,new=function (self,x,y)
local o={}
-- ...
end
}
Body={
,new=function (self,pos,vel,acc,mass)
local o={}
-- ...
return o
end
}
b=Body:new()
print(b.pos.x) -- 1