love2d教程-第八章:对象

Dahuang published on
4 min, 793 words

Categories: 游戏开发

Tags: LOVE2D

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

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

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

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

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

function love.load()
    rect = {}
    rect.x = 100
    rect.y = 100
    rect.width = 70
    rect.height = 90
end

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

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

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

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()里创建一个表。

function love.load()
    -- 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可以做到这一点。

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

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

总结

表的索引既可以是值,也可以是字符串。我们称这类表为对象。