Page 1 of 1

isDown, keypressed or wasPressed?

Posted: Thu Sep 28, 2023 4:02 pm
by Sashz
I'm creating a text based game (with images) and I don't really know how to change the scene using the directional keys.
When I use isDown, depending on the duration of pressing the key, the game skips the next scene.

Example:

Code: Select all

function update_forest(dt)
  if love.keyboard.isDown('right') then
    scene = 'waterfall'
  end
  if love.keyboard.isDown('left') then
    scene = 'cabin'
  end
end

function update_waterfall(dt)
  if love.keyboard.isDown('left') then
    scene = 'forest'
  end
end

function update_cabin(dt)
  if love.keyboard.isDown('right') then
    scene = 'forest'
  end
end
In this case, if I'm in 'waterfall' and press left, I go to 'cabin', and 'waterfall' appears in just a blink of an eye.
I know that keypressed or wasPressed can solve my case, but I don't know how to implement this. I also know that there are better ways to write this code, but I'm new to LOVE2D and I'd like to continue in this more amateur way for now...
All help will be appreciated!

Re: isDown, keypressed or wasPressed?

Posted: Thu Sep 28, 2023 5:36 pm
by BrotSagtMist
For one time events you only want to react the moment the key is pressed

Code: Select all

function love.keypressed(k)
 if k=="right" then next() end
end
and then have all your scene switch logic in its own function rather than having it scattered around in every scene.
In this case we need two additional tables and a variable holding where we are.

Code: Select all

nextlist={cabin="waterfall",waterfall="drowning"}
backlist={cabin="title",waterfall="cabin"}
So when either next() or a back going function is called they just need to lookup where the way is going to.

Code: Select all

function next()
position=nextlist[position]
end
function back()
position=backlist[position]
end

Re: isDown, keypressed or wasPressed?

Posted: Thu Sep 28, 2023 6:45 pm
by zorg
Also, there is no such thing as wasPressed.

Re: isDown, keypressed or wasPressed?

Posted: Thu Sep 28, 2023 7:14 pm
by Sashz
zorg wrote: Thu Sep 28, 2023 6:45 pm Also, there is no such thing as wasPressed.
You are right.
It was Google Bard who suggested I use this...

Re: isDown, keypressed or wasPressed?

Posted: Thu Sep 28, 2023 9:34 pm
by Sashz
BrotSagtMist wrote: Thu Sep 28, 2023 5:36 pm For one time events you only want to react the moment the key is pressed

Code: Select all

function love.keypressed(k)
 if k=="right" then next() end
end
and then have all your scene switch logic in its own function rather than having it scattered around in every scene.
In this case we need two additional tables and a variable holding where we are.

Code: Select all

nextlist={cabin="waterfall",waterfall="drowning"}
backlist={cabin="title",waterfall="cabin"}
So when either next() or a back going function is called they just need to lookup where the way is going to.

Code: Select all

function next()
position=nextlist[position]
end
function back()
position=backlist[position]
end
Thanks for the answer.

In addition to moving forward and backward, the player can turn right or left, so the final result looked like this:

Code: Select all

next_list = {}
back_list = {}
right_list = {}
left_list = {}

function love.load()
  next_list = {trail = 'forest', forest = 'lake'}
  back_list = {forest = 'trail', lake = 'forest'}
  right_list = {forest = 'waterfall', waterfall = 'trail'}
  left_list = {forest = 'cabin', cabin = 'trail'}
end

function next()
  position = next_list[position]
end

function back()
  position = back_list[position]
end

function go_right()
  position = right_list[position]
end

function go_left()
  position = left_list[position]
end

function love.keypressed.(key)
  if key == 'up' then
    next_list()
  end
  if key == 'back' then
    back_list()
  end
  if key == 'right' then
    right_list()
  end
  if key == 'left' then
    left_list()
  end
Although no error appears, the scene is not changed.
Where is the error?

Re: isDown, keypressed or wasPressed?

Posted: Thu Sep 28, 2023 9:58 pm
by dusoft
Sashz wrote: Thu Sep 28, 2023 9:34 pm Although no error appears, the scene is not changed.
Where is the error?
You will need to use both love.update() to process updates and love.draw() to paint updates.
Also:

Code: Select all

love.keypressed.(key)
needs to become

Code: Select all

love.keypressed(key)
Use some environment (IDE) that will announce (and fix) such typos and common errors.

Also, don't trust code from LLMs such as Bard.

See my experiment: https://ambience.sk/lua-code-generation ... e-chatgpt/

Re: isDown, keypressed or wasPressed?

Posted: Thu Sep 28, 2023 10:00 pm
by BrotSagtMist
No error appears?
I cant even count all the stuff wrong here.
Aside from typos, the main thing is youre calling the tables not the functions.

Re: isDown, keypressed or wasPressed?

Posted: Thu Sep 28, 2023 10:23 pm
by Sashz
BrotSagtMist wrote: Thu Sep 28, 2023 10:00 pm No error appears?
I cant even count all the stuff wrong here.
Aside from typos, the main thing is youre calling the tables not the functions.
In fact, I had already corrected this error of calling tables instead of functions, but I ended up making the same mistake here on the forum. And I also made typing errors, because I ended up creating this snippet of code right here on the page.

This is the first time I've asked for help with game development. I will be more careful in the future!

I'm sorry for that.

Re: isDown, keypressed or wasPressed?

Posted: Thu Sep 28, 2023 10:50 pm
by Sashz
dusoft wrote: Thu Sep 28, 2023 9:58 pm
Sashz wrote: Thu Sep 28, 2023 9:34 pm Although no error appears, the scene is not changed.
Where is the error?
You will need to use both love.update() to process updates and love.draw() to paint updates.
Also:

Code: Select all

love.keypressed.(key)
needs to become

Code: Select all

love.keypressed(key)
Use some environment (IDE) that will announce (and fix) such typos and common errors.

Also, don't trust code from LLMs such as Bard.

See my experiment: https://ambience.sk/lua-code-generation ... e-chatgpt/
The code I created has the love.update(dt) and love.draw() functions, I just didn't post it here because I thought it wouldn't be necessary. In the future I will format my questions better here on the forum.

This snippet of code I posted I ended up writing right here in the post, hence the errors... On the computer I use Sublime Text.

In the "function love.keypressed(key)" part, I call the functions, not the tables, as I put here. I had already corrected this error, but I ended up posting it here incorrectly.

I'm sorry for that.

In fact, the player should just type to advance in the game, but I ended up deciding to add directional keys so he can move around. However, the scene is not being changed.

And yes, things like Bard can't be trusted.

Re: isDown, keypressed or wasPressed?

Posted: Thu Sep 28, 2023 10:53 pm
by BrotSagtMist
Why dont you just post the entire thing exactly as you intend to make it?
Troubleshooting works best for .love files, these snippets tell us little to nothing.