love2d-chapter8-objects

love2d-chapter8-objects

十一月 26, 2020

第八章-对象

在上一章中我们用数字给表里的元素编号,但实际上我们还有另外一种办法:用字符串。

1
2
3
4
5
function love.load()
--rect is short for rectangle
rect = {}
rect["width"] = 100
end

在这里,我们把"width"叫做,或是属性。所以现在表rectangle有了一个具有值为100的属性"width"。我们不需要每次创建属性时都使用字符串,我们可以用一个点(.)。

1
2
3
4
5
6
function love.load()
rect = {}
-- 下面的两种写法作用是相同的
rect["width"] = 100
rect.width = 100
end

让我们再多添加一些属性:

1
2
3
4
5
6
7
function love.load()
rect = {}
rect.x = 100
rect.y = 100
rect.width = 70
rect.height = 90
end

现在我们利用这些属性再画一次矩形:

1
2
3
function love.draw()
love.graphics.rectangle("line", rect.x, rect.y, rect.width, rect.height)
end

然后再让这个矩形动起来!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function love.load()
rect = {}
rect.x = 100
rect.y = 100
rect.width = 70
rect.height = 90

--添加一个速度属性
rect.speed = 100
end

function love.update(dt)
-- 增加rect.x的值。别忘了delta time(dt)!
rect.x = rect.x + rect.speed * dt
end

我们又一次让矩形动了起来,为了展现表的力量,我们下面将会创建多个移动的矩形。为此我们将会把表(table)当作list使用。把love.load()里的代码放到另一个新的函数里,然后在love.load()里创建一个表。

love.load()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    -- Remember: camelCasing!
listOfRectangles = {}
end

function createRect()
rect = {}
rect.x = 100
rect.y = 100
rect.width = 70
rect.height = 90
rect.speed = 100

-- Put the new rectangle in the list
table.insert(listOfRectangles, rect)
end

这样,我们每次调用creatRect,一个新的矩形对象就会被添加到我们的list里,一个由表组成的表。现在我希望在我们按下空格键时调用creatReatlove.keypressed可以做到这一点。

1
2
3
4
5
6
function love.keypressed(key)
-- Remember, 2 equal signs (==) for comparing!
if key == "space" then
createRect()
end
end

每当我们按下一个键,love都会调用love.keypressed,然后把按下的键作为参数传入。在上例中,如果按下的键是“space”,程序将会调用creatRect
最后要做的就是修该update和draw函数。我们需要遍历listOfRectangels

1
2
3
4
5
6
7
8
9
10
11
function love.update(dt)
for i,v in ipairs(listOfRectangles) do
v.x = v.x + v.speed * dt
end
end

function love.draw(dt)
for i,v in ipairs(listOfRectangles) do
love.graphics.rectangle("line", v.x, v.y, v.width, v.height)
end
end

现在,当你运行游戏时,每当你按下空格,一个移动的矩形就应该出现在你眼前。

再来一次?

这个章节很短,但是出现了非常多的代码。这可能让你感到很难理解本章的内容。所以我们再来把思路理一下。
love.load里我们创建了一个表——listOfRectangels
当我们按下键盘上的某个键,love就会调用love.keypressed,然后我们在love.keypressed里检查这个键是否是空格。如果是,调用creatRect
creatRect里我们创建了一个新表。我们赋予它诸如xy这样的属性。然后我们把这些新表储存在listOfRectangles里。
love.updatelove.draw里,我们遍历这个由矩形组成的表来更新并绘制它们。


函数

一个对象也可以有他自己的函数。你可以像这样为一个对象创建函数:

tableName.functionName = function ()

end

-- Or the more common way
function tableName.functionName()

end

总结

表的索引既可以是值,也可以是字符串。我们称这类表为对象。(这么说有一些问题,但是目前这么理解就好了。想要更详细地了解请搜索面向对象编程。)