Lua-无法从函数中插入表格

时间:2018-08-10 21:02:40

标签: lua scope insert lua-table love2d

我有一个Lua函数,可以在其中构建值表并尝试使用命名键将其添加到全局表中。

键名从函数参数中提取。基本上,这是一个文件名,我正在将它与有关文件的数据配对。

不幸的是,全局表总是返回nil。这是我的代码:(让我知道是否需要查看更多信息)

(注释部分是其他尝试,尽管许多尝试已被删除)

Animator = Class{}

    function Animator:init(atlasfile, stringatlasfriendlyname, totalanimationstates, numberofframesperstate, booleanstatictilesize)

        -- Define the Animator's operation mode. Either static tile size or variable.
        if booleanstatictilesize ~= false then
          self.isTileSizeStatic = true
        else
          self.isTileSizeStatic = false
        end

        -- Define the total animation states (walking left, walking right, up down, etc.)
        -- And then the total frames per state.
        self.numAnimationStates = totalanimationstates or 1
        self.numAnimationFrames = numberofframesperstate or 2

        -- Assign the actual atlas file and give it a programmer-friendly name.
        self.atlasname = stringatlasfriendlyname or removeFileExtension(atlasfile, 'animation')

        generateAnimationQuads(atlasfile, self.atlasname, self.numAnimationStates, self.numAnimationFrames)

    end

    function generateAnimationQuads(atlasfile, atlasfriendlyname, states, frames)

        spriteWidthDivider = atlasfile:getWidth() / frames
        spriteHeightDivider = atlasfile:getHeight() / states

        animationQuadArray = generateQuads(atlasfile, spriteWidthDivider, spriteHeightDivider)

        animationSetValues = {atlasarray = animationQuadArray, width = spriteWidthDivider, height = spriteHeightDivider}

        --gAnimationSets[#gAnimationSets+1] = atlasfriendlyname
        gAnimationSets[atlasfriendlyname] = animationSetValues
        --table.insert(gAnimationSets, atlasfriendlyname)

    end

注意:使用print(atlasfriendlyname)和print(animationSetValues)时,都不为空或为零。它们都包含值。

由于某些原因,将密钥对分配给gAnimationSets的行不起作用。

gAnimationSets是在main.lua中的程序顶部一次使用

定义的
gAnimationSets = {}

在称为Bug的字符类的init()函数期间调用了Animator类。 Bug类在StartState的init()函数中初始化,该函数从BaseState扩展而来,BaseState仅定义了伪init(),enter(),update()等函数。

使用StateMachine类在main.lua中调用StartState,并将其作为在main.lua中声明的全局表的值传递到StateMachine中。

gAnimationSets在状态表之后和调用状态之前声明。

这是使用Love2D引擎。

对不起,我是来这里寻求帮助的,我已经选择了几个小时。

编辑:更多测试。

尝试在索引gTextures ['buganimation']上打印animationQuadArray总是返回nil。嗯?

Main.lua中的gTextures

gTextures = {
    ['background'] = love.graphics.newImage('graphics/background.png'),
    ['main'] = love.graphics.newImage('graphics/breakout.png'),
    ['arrows'] = love.graphics.newImage('graphics/arrows.png'),
    ['hearts'] = love.graphics.newImage('graphics/hearts.png'),
    ['particle'] = love.graphics.newImage('graphics/particle.png'),
    ['buganimation'] = love.graphics.newImage('graphics/buganimation.png')
}

尝试返回gTextures ['buganimation']会正常返回文件值。它不是空的。

我的大脑现在如此炸裂,我什至不记得为什么来编辑它。我不记得了

Main.lua中的全局表,所有其他功能都无法访问它。

print(gTextures ['buganimation'])在所讨论的函数中起作用。因此,gTextures是绝对可访问的。

表不为空。 AnimationSetValues不为空。

2 个答案:

答案 0 :(得分:0)

我要添加第二个答案,因为两者在上下文中都是正确的。

我最终将IDE切换为VS Code,现在原来的一个可以了。

我最初使用的是带有Love2D解释器的Eclipse LDT,在那种环境下,我的原始答案是正确的,但是在VS Code中,原始的答案也是正确的。

所以Dimitry是正确的,它们是等效的,但是关于我实际的Eclipse安装的某些规定不允许该语法起作用。

在解释器遇到另一个奇怪的语法问题后,我切换到VS Code,该语法问题无法识别goto语法并给出了持续的错误。解释器认为goto是变量的名称。

所以我切换了,现在两者都已修复。我想我暂时不会使用LDT。

答案 1 :(得分:-2)

解决方案:Lua语法。脑油炸综合征

我写道:

animationSetValues = {atlasarray = animationQuadArray, width = spriteWidthDivider, height = spriteHeightDivider}

应该是:

animationSetValues = {['atlasfile']=atlasfile, ['atlasarray']=animationQuadArray, ['width']=spriteWidthDivider, ['height']=spriteHeightDivider}

编辑:我完全知道如何使用答案。这是在此处发布的,以保留我的位置以供解答,以便稍后我返回家乡时可以对其进行编辑,这正是我现在正在做的事情。我将保留旧职位以供存档。


原件: 我解决了很抱歉没有立即发布解决方案。我的大脑融化成肉汁。

我明天发布。只是想“回答”说不需要帮助。解决了。

解决方案基本上是:“哦,这只是Lua的事情之一”。精彩。我对这种语言很感兴趣-您可以用我的空白表情来分辨。

从无行尾或方括号的语言开始,但使用强制打印括号...嗯。完成此类后,我将返回C#。