Love2D/Lua 动画系统和表格

3

你好!目前我正在为我的游戏制作一个“简单”的动画系统。但是我在处理表格时遇到了一些问题。我创建了一个设置文件,用于加载动画的信息(具体来说,它加载动画的别名和包含帧数)。因此,我的设置文件看起来像这样:(animsettings.lua)

animlist = {idle, run}

animlist.idle = { frames, alias }
animlist.idle.frames = 1
animlist.idle.alias = "idle"

animlist.run = { frames, alias }
animlist.run.frames = 5
animlist.run.alias = "run"

我想访问每个动画的属性(帧和别名),并使用它们的索引,例如:animlist[1][1]应该是animlist.idle.frames的值,即1。所以,我是否有误解,或者这个东西应该可以工作?因为当我尝试打印animlist[1][1]或animlist[1].frames时,它会打印"nil",但是当我打印animlist.idle.frames时,它会打印实际值1。
文件已经被正确加载,但是似乎无法使用它们的索引。
编辑:我忘记展示了一个试图访问这些表的函数: run动画包含5帧(每个方向,因此是1-r.png 2-r.png等) 此函数的目的是加载动画文件并向player.anims添加一个表,因此它将像这样:player.anims.run.left,它从使用animsettings.lua资源的函数的变量中获取其名称。
function initAnims()
    player.anims = {}
    getAnimSettings('gfx/players/'..player.modelname..'/animsettings.lua')

    for i = 1, #animlist do
        for j = 1, #animlist[i][1] do
                animlist[i][2] = {
                    left = ('gfx/players/'..player.modelname..'/'..animlist[i][2]..'/'..animlist[i]..j..'-l.png'),
                    right = ('gfx/players/'..player.modelname..'/'..animlist[i][2]'/'..animlist[i]..j..'-r.png')
                }
                table.insert(player.anims, animlist[i][2])
        end
    end
end

编辑2:我现在意识到,使用这个函数时,每次迭代都会用下一帧替换实际帧,因此我将在该表格内创建另一个表格,其中包含每个帧的数据。但我的问题仍然涉及到表格和索引,我认为在那之后我将能够修正该函数。

2个回答

3
animlist = {idle, run}

这行代码初始化了animlist,使其成为一个包含键1和2的表格,并且它们对应的值是idlerun表格。现在,当你编写以下代码时:
animlist.idle = { frames, alias }

您正试图访问animlist中名为"idle"的成员,但该成员并非键为1的成员。

您需要做的是初始化键为1和2的两个子表,而不是使用名称。首先,删除以下行:

animlist.idle = { frames, alias }

这是多余的,因为您已经在索引1处有一个表格。然后将其余部分更改为:
animlist[1].frames = 1
animlist[1].alias = "idle"

等等,同样用第二个内部表格来完成这个操作。


哦,哇,那我完全误解了表格的工作原理,那么我应该如何编辑表格呢? - neonoxd
@neonoxd 我刚刚解释过了...始终使用索引。如果你迷失了方向,请阅读文档——表构造的行为在那里清楚地写明了。 - user529758
抱歉,我在你编辑评论之前就已经进行了评论,所以我没有看到最后一部分,现在我明白了 :) - neonoxd
@neonoxd 很酷,这里还有一个小演示,以便您可以绝对确定。此外,请考虑在代码中使用更多的空格(特别是在运算符周围),以便更容易阅读。 - user529758
谢谢,那个小演示非常有效,现在完全清楚了:D 谢谢你的建议,我会记住的:D - neonoxd

0
如果您在表格中获取了一个值作为主表格值,那么在表格初始化之后添加值也是一个不错的主意:
animlist = {}
animlist.run = {}
animlist.frames = 5
animlist.alias = "run"
print(animlist.run.alias)

如果animlist [1] [1]返回nil,则最好的方法是使用此方法:
print(animlist.run.frames)

我编辑了问题,现在包括函数本身,这样你就会看到为什么我需要通过它们的索引来访问它们。 - neonoxd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接