Love 2D(Lua)意想不到对象

问题描述:

想要让我的双脚与LUA和Love2D湿润,并且我在Lua中遇到了对象实例化/访问问题。Love 2D(Lua)意想不到对象

源用虫可以在这里找到:https://bitbucket.org/dannsee/love_scrollingshooter

我在我的主,我创建了一个对象,敌人

enemies = Enemies:new() 

和内部敌人的对象,我创建一个对象来持有peristant值,我打电话给定时器。

timers = Timers:new() 

所以敌人“构造”的方法看起来(基本上)这样

Enemies = {} -- so that Enemies will not be nil when new() is called 
timers = {} -- so that timers will be accessible in the class scope 

function Enemies:new(enemies) 
    enemies = enemies or {} 
    timers = Timers:new() 
    setmetatable(enemies, self) 
    self.__index = self 
    return enemies 
end 

而创建的定时器正在寻找这样

Timers = {} -- so that Timers will not be nil when new() is called 

function Timers:new(timers) 
    timers = timers or { 
     miniBombTimerMax = 0.2, 
     miniBombTimer = minibombTimerMax 
    } 
    setmetatable(timers, self) 
    self.__index = self 
    return timers 
end 

但是,当我尝试refrence一个的定时器(从敌人内部),我得到一个零值异常。

timers.miniBombTimer -- Produces nil exception 

在我看来,这应该既1.在范围,因为它是这个类中创建一个对象,并在本地实例化为定时器= {}之前它被分配的值,并且2。不是因为它在'构造函数'中被赋予了一个值。但似乎还有更多的事情发生在我不知道的地方。

我是Lua的新手,在这一点上可能很明显,但是从我所读到的有关变量范围的看来,这应该是有效的。我不明白为什么定时器不是用值创建的。

+0

通读http://lua-users.org/wiki/ObjectOrientationTutorial?你没有显示问题的部分代码,但可能你没有使用'self'? – smarx

+0

你的构造函数也不使用'self'。我假设你想让'定时器'成为'Enemies'类的成员,但也许不是?也许你可以分享一个你打算如何使用这个课程的最简单的例子。 – smarx

小心你的全局变量!在Lua中,当你不想要的时候意外地设置一个全局变量是非常容易的,而且看起来就是这样。

function Enemies:new(enemies) 
    enemies = enemies or {} 
    timers = Timers:new() 
    setmetatable(enemies, self) 
    self.__index = self 
    return enemies 
end 

在这里的第三行,因为timers不存在作为一个局部变量在这里,这个数值最终得到付诸叫timers代替全球变量。如果你想设置的enemies的属性,你需要一提的enemies明确:

function Enemies:new(enemies) 
    enemies = enemies or {} 
    enemies.timers = Timers:new() 
    setmetatable(enemies, self) 
    self.__index = self 
    return enemies 
end 

现在,你写的:

但是,当我尝试refrence一个计时器(从在敌人对象内),我得到一个零值异常。

Lua并没有真正的“在一个对象内”或“在一个类内”的概念。在某些语言中,当你在一个类的内部编写代码时,所有类的成员都在范围之内,你可以“裸”地引用它们。 Lua不是这些语言之一;在Lua中,如果你想引用一个“类成员”,你需要使用点符号,明确说明你正在访问哪个对象。 (或者你可以使用“高级方法”,使用_ENV。)

顺便说一句...

timers = {} -- so that timers will be accessible in the class scope 

从我在问题中看到的情况来看,这条线并没有太大的作用;它只是创建一个永远不会使用的全局变量。

另外,该线路在Enemies:new

self.__index = self 

Enemies:new被调用时,它仅设置Enemies.__index。这是精细,但你可能也只是设置了一次:

function Enemies:new(enemies) 
    enemies = enemies or {} 
    enemies.timers = Timers:new() 
    setmetatable(enemies, self) 
    return enemies 
end 

Enemies.__index = Enemies