谁能帮我解决这个错误?

1.我在实现 games50 中的马里奥游戏时遇到了一个错误,在状态机中显示如下

    function StateMachine:change(stateName, enterParams)

        assert(self.states[stateName]) -- state must exist!
        self.current:exit()
        self.current = self.states[stateName]()
        self.current:enter(enterParams)
    end

错误

src/StateMachine.lua:18: attempt to call method 'enter' (a nil value)

Traceback

src/StateMachine.lua:18: in function 'change'
main.lua:21: in function 'load'
[C]: in function 'xpcall'
[C]: in function 'xpcall'
点赞
用户1029809
用户1029809

好的。所以你调用了一个叫做 "enter" 的函数,它包含在一个名为 "current" 的表中,这个表又包含在"change"函数的隐藏参数 "self" 中传递的另一个表中。

首先,你需要检查"change"函数是如何调用的。

检查一下,它是否类似于:

xxxx:change(...

而不是:

xxx.change(...

因为在第二个版本中,隐藏的 "self" 参数(它将包含对 "xxx" 的引用)未提供。

然后,在 self.current = self.states[stateName]() 之后,通过打印它来检查 "self.current"是否有效:

print(self.current)

如果你在控制台中看到一个表引用,那就很好。

此时,它将向你展示问题出在 "enter" 函数,该函数在由 self.current = self.states[stateName]() 返回的表中不存在。

根据你的所有代码,听起来好像你正在使用一个外部库,而你并不完全掌握它的使用方式。我建议你从自己的代码开始编写游戏,编写简单的游戏,不使用外部代码。

2020-10-01 11:08:27