编写函数以检查状态机当前状态[Lua/Love2d]

我正在学习使用LÖVE2D和Lua进行游戏开发,最近我使用了一个状态机类。我没有自己编写这个类,但我已经浏览了代码,除了这一个问题,我认为我已经基本上理解了。

问题是,我试图提示这个类的当前状态,这样我就可以在_if_中使用它,但无论如何,我都无法做到。以下是类的相关代码:

StateMachine = Class{}

function StateMachine:init(states)
    self.empty = {
        render = function() end,
        update = function() end,
        enter = function() end,
        exit = function() end
    }
    self.states = states or {} -- [name] -> [function that returns states]
    self.current = self.empty
end

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

我基本上想做的就是:

function StateMachine:is(stateName)
    if self.current == self.states[stateName] then
        -- this never executes
        return true
    end

    return false
end

我尝试将self.states[stateName]更改为其他内容进行测试,并尝试将输出内容打印到控制台以查看为什么比较永远不为true。它似乎返回了一个指向表的指针,因此永远不与比较运算符的另一侧匹配。

谢谢您的帮助!

点赞
用户7396148
用户7396148

StateMachine:change中,self.current 被设为 self.states[stateName]return 值。

function StateMachine:change(stateName, enterParams)
    ...
    self.current = self.states[stateName]() -- 注意此时调用了函数

这意味着,除非返回值为 self,否则 self.current 将不等于在 StateMachine:is 中与之比较的函数或对象 self.states[stateName]

function StateMachine:is(stateName)
    if self.current == self.states[stateName] then -- 此处在比较函数与返回值

我建议扩展你的状态对象,添加一个 :getName 函数,以返回 stateName,或者将名称存储在 StateMachine 中的键(如 currentStateName)下。

2020-03-17 14:44:31
用户11097997
用户11097997

我有同样的问题,并且我想补充一点——也许有些评论解释了这一点,但是我没有理解:D — —但是在我创建的getCurrentState函数中,我不得不这样做:

function StateMachine:getCurrentState()
    variable = self.currentStateName
    return variable

当然,variable只是一个占位符。但是我必须抓住self.currentStateName指向的引用,否则比较总是失败。

2020-09-16 21:20:24