Функция записи для проверки текущего состояния машины состояния [Lua / Love2d] - PullRequest
1 голос
/ 17 марта 2020

Я изучаю разработку игр с LÖVE2D и Lua, и в последнее время я использую класс конечных автоматов. Я сам не кодировал класс, но я прошел код и думаю, что в значительной степени получил его, кроме этой одной проблемы.

Дело в том, что я пытаюсь запросить у класса его текущее состояние, просто чтобы я мог использовать его внутри , если , но, несмотря ни на что, я не могу понять это правильно.

Вот соответствующий код класса:

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] к другим вещам, чтобы проверить это, а также попытался распечатать материал для консоли, чтобы понять, почему сравнение никогда не бывает верным. Кажется, self.current возвращает указатель на таблицу и, следовательно, никогда не соответствует тому, что находится на другой стороне оператора сравнения.

Спасибо за помощь!

1 Ответ

1 голос
/ 17 марта 2020

self.current установлено на return значение self.states[stateName] в StateMachine:change

function StateMachine:change(stateName, enterParams)
    ...
    self.current = self.states[stateName]() -- note the () indicating the call

Это означает, что если возвращаемое значение не равно self, self.current не будет равно к функции или объекту self.states[stateName], с которым она сравнивается в StateMachine:is

function StateMachine:is(stateName)
    if self.current == self.states[stateName] then -- here we are comparing the function to the return value

Я бы предложил расширить ваш объект состояния, чтобы иметь функцию :getName, которая будет возвращать stateName или сохранить имя в вашем StateMachine под ключом, таким как currentStateName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...