paragonusaxis
paragonusaxis

Reputation: 13

Writing function to check state's machine current state [Lua/Love2d]

I'm learning game development with LÖVE2D and Lua and lately I've been using a state machine class. I haven't coded the class myself, but I've went through the code and I think I pretty much got it, besides this one problem.

The thing is, I'm trying to prompt the class for its current state, just so I can use it inside an if, but no matter what, I cannot get it right.

Here's the relevant code of the class:

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

What I'm basically trying to do is:

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

    return false
end

I've tried changing self.states[stateName] to other things to test it out and also tried printing stuff to the console to see why the comparison is never true. It seems self.current returns a pointer to a table and thus never matches whatever is on the other side of the comparison operator.

Thanks for your help!

Upvotes: 1

Views: 1007

Answers (2)

b nama
b nama

Reputation: 11

I had the exact same question & I'd like to add--perhaps some of the comments explain this in language I just didn't understand :D--but in the getCurrentState function I created I had to do this:

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

where ofc variable is just some placeholder. but I had to grab the reference that self.currentStateName was pointing to, otherwise the comparison always failed.

Upvotes: 0

Nifim
Nifim

Reputation: 5021

self.current is set to the return value of self.states[stateName] in StateMachine:change

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

This means, unless the return value is self, self.current will not be equal to the function or object self.states[stateName] that it is compared to in StateMachine:is

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

I would suggest expanding your state object to have a :getName function that would return the stateName or to store the name in your StateMachine under a key such as currentStateName.

Upvotes: 2

Related Questions