user2184488
user2184488

Reputation: 11

How to make a function wait X amount of time in LUA (Love2d)?

I am very new to programming and coming from a "custom map" background in games like SC2. I am currently trying to make a platformer game in Love2d. But I wonder how I can make something wait X amount of seconds before doing the next thing.

Say I want to make the protagonist immortal for 5 seconds, how should that code look like ?

Immortal = true 
????????????????
Immortal = false

As I have understood there is no built in wait in Lua nor Love2d.

Upvotes: 1

Views: 7424

Answers (4)

WuTangTan
WuTangTan

Reputation: 1126

I normally use cron.lua for what you're talking about: https://github.com/kikito/cron.lua

Immortal = true
immortalTimer = cron.after(5, function() 
  Immortal = false 
end)

and then just stick immortalTimer:update(dt) in your love.update.

Upvotes: 2

arthurgps2
arthurgps2

Reputation: 101

I reccomend that you use hump.timer in your game,like this:

function love.load()
timer=require'hump.timer'
Immortal=true
timer.after(1,function()
Immortal=false
end)
end

instead of using timer.after,you can also use timer.script,like this:

function love.load
timer=require'hump.timer'
timer.script(function(wait)
Immortal=true
wait(5)
Immortal=false
end)
end

don't forget to add timer.updateinto function love.update!

function love.update(dt)
timer.update(dt)
end

hope this helped ;)

Download link:https://github.com/vrld/hump

Upvotes: -1

Corbin March
Corbin March

Reputation: 25704

It sounds like you're interested in a temporary state for one of your game entities. This is pretty common - a powerup lasts for six seconds, an enemy is stunned for two seconds, your character looks different while jumping, etc. A temporary state is different than waiting. Waiting suggests that absolutely nothing else happens during your five seconds of immortality. It sounds like you want the game to continue as normal, but with an immortal protagonist for five seconds.

Consider using a "time remaining" variable versus a boolean to represent temporary states. For example:

local protagonist = {
    -- This is the amount of immortality remaining, in seconds
    immortalityRemaining = 0,
    health = 100
}

-- Then, imagine grabbing an immortality powerup somewhere in the game.
-- Simply set immortalityRemaining to the desired length of immortality.
function protagonistGrabbedImmortalityPowerup()
    protagonist.immortalityRemaining = 5
end

-- You then shave off a little bit of the remaining time during each love.update
-- Remember, dt is the time passed since the last update.
function love.update(dt)
    protagonist.immortalityRemaining = protagonist.immortalityRemaining - dt
end

-- When resolving damage to your protagonist, consider immortalityRemaining
function applyDamageToProtagonist(damage)
    if protagonist.immortalityRemaining <= 0 then
        protagonist.health = protagonist.health - damage
    end
end

Be careful with concepts like wait and timer. They typically refer to managing threads. In a game with many moving parts, it's often easier and more predictable to manage things without threads. When possible, treat your game like a giant state machine versus synchronizing work between threads. If threads are absolutely necessary, Löve does offer them in its love.thread module.

Upvotes: 10

Josh
Josh

Reputation: 3265

You could do this:

function delay_s(delay)
  delay = delay or 1
  local time_to = os.time() + delay
  while os.time() < time_to do end
end

Then you can just do:

Immortal == true
delay_s(5)
Immortal == false

Of course, it'll prevent you from doing anything else unless you run it in its own thread. But this is strictly Lua as I know nothing of Love2d, unfortunately.

Upvotes: -1

Related Questions