## Platformer Jumping -- how does it work?

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Cryogenical
Prole
Posts: 49
Joined: Mon Apr 28, 2014 5:23 pm

### Platformer Jumping -- how does it work?

I'm relatively new to this whole markup. I've finished the college-level curriculum on Java, but it's a trash game development language for the projects I'm wanting to do. A friend recommended me to Love2D and I've been watching and reading up Lua and 2D game practices and the like. I've been working on a very very basic platformer to learn off of, and I have a friend who's working with me to some extent and we're both trying to learn.

Below I've attached the player.lua file that we found on a youtube tutorial and modified. The tutorial abruptly ended after implementing moving left and right and it barely touched on the physics side of things, but I did a good amount of research on the subject, yet it just doesn't click in my mind.

From what I understand, I know that the physics is being constantly updated therefore producing the gravity and the updating formuale for moving left and right, but what do I need to do for jumping for a set time/length? Do I need to have it execute a thread/timer/co-routine? I've been trying to mess around with a canJump boolean, but I'm not hitting the mark.

Code: Select all

player = {}

player.x = 5
player.y = 5
player.width = 50
player.height = 50
player.xvel = 0
player.yvel = 0
player.friction = 7
player.speed = 2250
playerCanJump = true
hitFloor = false
end
function player.draw()
love.graphics.setColor(255,0,0)
love.graphics.rectangle("fill", player.x, player.y, player.width, player.height)
end
function player.physics(dt)
player.x = player.x + player.xvel * dt
player.y = player.y + player.yvel * dt
player.yvel = player.yvel + gravity * dt
player.xvel = player.xvel * (1 - math.min(dt*player.friction, 1))
--player.yvel = player.yvel * (1 - math.min(dt*player.friction, 1))
end
function player.move(dt)
if love.keyboard.isDown('right') and
player.xvel < player.speed then
player.xvel = player.xvel + player.speed * dt
end
if love.keyboard.isDown('left') and
player.xvel > -player.speed then
player.xvel = player.xvel - player.speed * dt
end
if love.keyboard.isDown('up') and playerCanJump then
player.yvel = player.yvel + player.speed * dt
playerCanJump = false
end
end
--[[function player.jump(dt)
if love.keyboard.isDown('up')
end
end]]
function player.boundary()
if player.x < 0 then
player.x = 0
player.xvel = 0
end
if player.x > 750 then
player.x = 750
player.xvel = 0
end
if player.y + player.height > groundlevel then
player.y = groundlevel - player.height
player.yvel = 0
playerCanJump = true
end
end
function UPDATE_PLAYER(dt)
player.physics(dt)
player.move(dt)
player.boundary()
end
function DRAW_PLAYER()
player.draw()
end


micha
Inner party member
Posts: 1083
Joined: Wed Sep 26, 2012 5:13 pm

### Re: Platformer Jumping -- how does it work?

Jumping is different from moving left and right in that you only need to detect the very moment, the jump key is pressed. So instead of using love.keyboard.isDown, you need to use the love.keypressed callback. Add this function to your file:

Code: Select all

function love.keypressed( key )
if love.keyboard.isDown('up') and playerCanJump then
player.yvel = player.jumpVel
playerCanJump = false
end
end
And define the variable player.jumpVel in the beginning. It should be a negative number.

dt is not used here, because the actual jumping action does only happen between two frames. It is not spread over several frames.
Once the player-velocity is changed, the normal physics function takes care of the rest and the player moves as expected. That also means, that you don't need a thread/timer/co-routine.

Edit: I suggest you put the player.move before the player.physics function. Otherwise player input for left- and right-movement will always be delayed by one frame (not a big deal, though).

Cryogenical
Prole
Posts: 49
Joined: Mon Apr 28, 2014 5:23 pm

### Re: Platformer Jumping -- how does it work?

I never thought about setting a jump velocity, is there a reason behind why it's not a good idea to use a formula containing something consisting of x-y velocities, gravity, and speed?

I'm trying to learn all I can, and if you could help that is a major plus.

It worked btw, thank you very much.

micha
Inner party member
Posts: 1083
Joined: Wed Sep 26, 2012 5:13 pm

### Re: Platformer Jumping -- how does it work?

I am glad I could help.
Cryogenical wrote:I never thought about setting a jump velocity, is there a reason behind why it's not a good idea to use a formula containing something consisting of x-y velocities, gravity, and speed?
I think I don't fully understand your question. It is totally okay to have a formula containing velocities, gravity and speed.

Cryogenical
Prole
Posts: 49
Joined: Mon Apr 28, 2014 5:23 pm

### Re: Platformer Jumping -- how does it work?

I meant to ask why did we need to introduce a new velocity (jumpVelocity)?

Is there not a formula that we could use containing the variables we declared before?

T-Bone
Inner party member
Posts: 1492
Joined: Thu Jun 09, 2011 9:03 am

### Re: Platformer Jumping -- how does it work?

Cryogenical wrote:I meant to ask why did we need to introduce a new velocity (jumpVelocity)?

Is there not a formula that we could use containing the variables we declared before?
Probably just a matter of convenience. Having a variable for the velocity makes it easy to change it (you want the velocity to be more and more downwards over time). If you didn't keep track of the velocity in the y direction, it would be difficult to keep track of where in the jump you are (remember, you want to be moving quickly upward the first few frames and then start moving downward), simply keeping track of the position isn't enough. But you could implement this in different ways; for example you could keep track of the time since you last jumped. But that will probably just make things more complicated.

Cryogenical
Prole
Posts: 49
Joined: Mon Apr 28, 2014 5:23 pm

### Re: Platformer Jumping -- how does it work?

Alright, I understand more or less now; thanks for both of your help.

Cryogenical
Prole
Posts: 49
Joined: Mon Apr 28, 2014 5:23 pm

### Re: Platformer Jumping -- how does it work?

Another question; is there a way to sort of "rappel" or "scale" up a wall?

I'm using a boundary function to check if the player's x position is less/greater than 0 then sets their position back enough to keep the entire character on the screen.

Code: Select all

function player.boundary()
if player.x < 0 then
player.x = 0
player.xvel = 0
end
if player.x > 750 then
player.x = 750
player.xvel = 0
end
if player.y < 0 then
player.y = 0
player.yvel = 0
end
if player.y + player.height > groundlevel then
player.y = groundlevel - player.height
player.yvel = 0
playerCanJump = true
end
end
Using the jump function that micha gave, is there a way to do this?

I've attempted to do this using

Code: Select all

if love.keyboard.isDown('up') and not playerCanJump and player.x < 5 then
playerCanJump = true
end
in the function love.keypressed(key), but it doesn't register immediately and let the player jump.

micha
Inner party member
Posts: 1083
Joined: Wed Sep 26, 2012 5:13 pm

### Re: Platformer Jumping -- how does it work?

Before I answer your question: I realized, I did a mistake in the previous answer. This is the code I gave you:

Code: Select all

function love.keypressed( key )
if love.keyboard.isDown('up') and playerCanJump then
player.yvel = player.jumpVel
playerCanJump = false
end
end
And this is how it should be:

Code: Select all

function love.keypressed( key )
if key == 'up' and playerCanJump then
player.yvel = player.jumpVel
playerCanJump = false
end
end
Using isDown inside the love.keypressed is not as it is intended to be (unless you want one button do different things depending on another button, for example jump -> jump, jump+down->stomp). Sorry for teaching you something wrong.

That said, let's look at your current problem. What exactly do you want to accomplish? Do you want to allow the player to run up the wall? Or do you want to implement a wall jump?
The wall-running would be implemented inside the love.update together with the love.keyboard.isDown, because this would happen continuously while the button is held down. It should look something like this:

Code: Select all

if player.x == 0 and love.keyboard.isDown('up') then
player.yvel = wallRunSpeed
end
Put some value into the wallRunSpeed variable (a negative value).
If you want to implement a wall jump, then you are on the right track. But instead of setting the playerCanJump variable to true, you should just perform the jump. Add this in the love.keypressed:

Code: Select all

if player.x == 0 and key == 'up' then
playerCanJump = false
player.yvel = yJumpSpeed
player.xvel = xJumpSpeed
end
For a wall jump you would both set a velocity in x- and y-direction, to move the player away from the wall.

Cryogenical
Prole
Posts: 49
Joined: Mon Apr 28, 2014 5:23 pm

### Re: Platformer Jumping -- how does it work?

Thank you very much, micha. It works almost perfectly now, and is good enough.

### Who is online

Users browsing this forum: Bing [Bot], ReFreezed and 26 guests