Need help understanding delta time

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Before you make a thread asking for help, read this.
Post Reply
chainliz
Prole
Posts: 3
Joined: Tue Oct 23, 2018 1:47 pm

Need help understanding delta time

Post by chainliz »

Hello! I'm new to LOVE and I just started trying to make a square jump. I followed this tutorial on the wiki (: https://love2d.org/wiki/Tutorial:Baseline_2D_Platformer) and then I tried to change some values to understand completely how did it work. So I made it print the value of the dt and I saw that it is almost equal to 0.01, so I tought to replace the dt with the value 0.01 but doing so then the square jumps and never comes down. Why is that? Which is the difference between dt and a little number as 0.01?
User avatar
NetherGranite
Prole
Posts: 30
Joined: Wed Jul 11, 2018 11:08 pm

Re: Need help understanding delta time

Post by NetherGranite »

Such a thing should theoretically not happen. Would you mind sharing your code with us with a service like pastebin?
chainliz
Prole
Posts: 3
Joined: Tue Oct 23, 2018 1:47 pm

Re: Need help understanding delta time

Post by chainliz »

The code is exactly the one on the bottom of the tutorial I linked, but I replaced the dt with 0.01. I noticed that the problem occurs when I replace it in line 45 (player.y_velocity = player.y_velocity - player.gravity * dt)

here is the pastebin: https://pastebin.com/3Br3iYE7
User avatar
pgimeno
Party member
Posts: 3550
Joined: Sun Oct 18, 2015 2:58 pm

Re: Need help understanding delta time

Post by pgimeno »

It's a bug in the tutorial. The tutorial considers that gravity must not be applied when the Y velocity of the player is zero, but that can also happen at the top of the jump, therefore that condition is wrong. The concept is that gravity should not be applied when the player is in contact with the platform unless the player just jumped, but that should not be determined solely by checking if the Y velocity is zero.

Normal dt values are inexact and the Y velocity is very unlikely to hit zero, but by replacing dt with a more "exact" value, you're making it much more likely that it becomes exactly zero at the top of the jump. If you try for example 0.010101 you will see the character fall again.

Changing the condition to this works:

Code: Select all

        if player.y < player.ground or player.y_velocity ~= 0 then
Edit: A similar bug applies to the condition for allowing the player to jump. As written, it's possible (but unlikely) that when the player is at the top of the jump, you can jump again. I've fixed it below as well.

Also, Pastebin is good for chat rooms, but in this forum at least, [ code ] tags or attachments are preferable.

Here's the fixed version:

Code: Select all

platform = {}
player = {}

function love.load()
	platform.width = love.graphics.getWidth()
	platform.height = love.graphics.getHeight()

	platform.x = 0
	platform.y = platform.height / 2

	player.x = love.graphics.getWidth() / 2
	player.y = love.graphics.getHeight() / 2

	player.speed = 200

	player.img = love.graphics.newImage('purple.png')

	player.ground = player.y

	player.y_velocity = 0

	player.jump_height = -300
	player.gravity = -500
end

function love.update(dt)
	if love.keyboard.isDown('d') then
		if player.x < (love.graphics.getWidth() - player.img:getWidth()) then
			player.x = player.x + (player.speed * dt)
		end
	elseif love.keyboard.isDown('a') then
		if player.x > 0 then 
			player.x = player.x - (player.speed * dt)
		end
	end

	if love.keyboard.isDown('space') then
		if player.y == player.ground then
			player.y_velocity = player.jump_height
		end
	end

	if player.y < player.ground or player.y_velocity ~= 0 then
		player.y = player.y + player.y_velocity * dt
		player.y_velocity = player.y_velocity - player.gravity * 0.01
	end

	i=dt

	if player.y > player.ground then
		player.y_velocity = 0
		player.y = player.ground
	end
end

function love.draw()
	love.graphics.setColor(255, 255, 255)
	love.graphics.rectangle('fill', platform.x, platform.y, platform.width, platform.height)

	love.graphics.draw(player.img, player.x, player.y, 0, 1, 1, 0, 32)
	love.graphics.print(i, 100, 100, 0, 10, 10)
end
chainliz
Prole
Posts: 3
Joined: Tue Oct 23, 2018 1:47 pm

Re: Need help understanding delta time

Post by chainliz »

Oooooh! That's it! Thank you so much
Post Reply

Who is online

Users browsing this forum: Bing [Bot] and 197 guests