Programando con Love 2D – Control de la velocidad de objetos

Hasta ahora no hemos visto como controlar la velocidad de los objetos que colocamos. Hemos visto varias entradas sobre como hacer cositas con Love2D pero no hemos controlado aún la velocidad. Es el momento de hacerlo supongo.

Si te interesan otros artículos sobre Love2D puedes mirar estos anteriores:

* Programando con Love 2D – Ejemplos de animación I
* Programando con Love 2D – Rectángulos de colores en movimiento
* Programando con Love 2D – Moviendo rectángulos con el teclado
* Programando con Love 2D – Reproducir ogg y mostrar texto con una tipografía ttf

Comenzamos directamente con un ejemplo en el que un ferrari se ha de mover más rápido que un seat panda. para ello vamos a dibujar 2 rectángulos de color rojo para el ferrari y de color verde para el seat panda.

Veamos un gif animado (que no refleja como realmente se mueve pero nos hacemos una idea) y luego el código:

function love.load()
        ferrari = {}
        ferrari.x = 1   -- position x
        ferrari.y = 100 -- position y
        ferrari.w = 50  -- width
        ferrari.h = 20  -- height
        ferrari.s = 70  -- speed
        ferrari.r = 255 -- value red color
        ferrari.g = 0   -- value green color
        ferrari.b = 0   -- value blue color

        seat = {}
        seat.x = 1      -- position x
        seat.y = 200    -- position y
        seat.w = 40     -- width
        seat.h = 20     -- height
        seat.s = 50     -- speed
        seat.r = 0      -- value red color
        seat.g = 255    -- value green color
        seat.b = 0      -- value blue color

end

function love.update(dt)
        ferrari.x = ferrari.x + ferrari.s * dt
        seat.x = seat.x + seat.s * dt
end

function love.draw()
        love.graphics.setColor(ferrari.r, ferrari.g, ferrari.b) -- set ferrari color
        love.graphics.rectangle("fill", ferrari.x, ferrari.y, ferrari.w, ferrari.h)

        love.graphics.setColor(seat.r, seat.g, seat.b) -- set seat color
        love.graphics.rectangle("fill", seat.x, seat.y, seat.w, seat.h)
end

Vamos a fijar nuestra vista en el objeto ferrari y sus variables de propiedades.

        ferrari = {}
        ferrari.x = 1   -- position x
        ferrari.y = 100 -- position y
        ferrari.w = 50  -- width
        ferrari.h = 20  -- height
        ferrari.s = 70  -- speed
        ferrari.r = 255 -- value red color
        ferrari.g = 0   -- value green color
        ferrari.b = 0   -- value blue color

Le he añadido valores para las propiedades x,y,w,h,s,r,g y b . Son inventadas. Podrían llamarse green en vez de g o exis en vez de x. La idea es que los objetos similares (coches en este caso) tengan las mismas y se llamen igual. El valor luego de las variables es lo que cambiamos.

Por ejemplo hemos puesto el ferrari en la posición x1 y100 y le hemos indicado que tenga una velocidad de 70.

Con el seat hemos colocado otra velocidad inferior.

Hemos de prestar atención por tanto a la funcion callback love.update.

function love.update(dt)
        ferrari.x = ferrari.x + ferrari.s * dt
        seat.x = seat.x + seat.s * dt
end

En ella estamos usando dt (delta time) que será el tiempo real que transcurre entre un frame y otro. La función callback love.update a diferencia de la función love.load no se ejecuta una vez. love.update estará todo el rato ejecutándose y es por eso el loop que usamos para ir cambiando la posición x de los coches.

Y poco más que contar. Con eso ya sabríamos mover a diferente velocidad objetos en pantalla y al mismo tiempo saber declararlos con sus propiedades y valores.

Añade si quieres un tercer coche :).

4 comentarios sobre “Programando con Love 2D – Control de la velocidad de objetos

  1. Una duda, ¿Qué diferencia hay entre usar la función love.update() sin parámetros como en ejemplos anteriores o con el dt como has hecho aquí.

    • dt (delta time).

      Pues la diferencia es que sin el parámetro los coches (rectángulos) muy posiblemente se moverán a una velocidad diferente en diferentes ordenadores.

      Si por ejemplo en un ordenador se consigue una tasa de 60 FPS y en otro de 220 FPS ( frames por segundo) podríamos decir que en 1 segundo en un ordenador se desplazaría el coche más que en otro.

      Y se usa delta time para que la velocidad sea la misma en todos los ordenadores.

    • Dejo un ejemplo para demostrarlo:

      El delta time como se dice en el post es el tiempo que pasa entre la anterior y la actual actualización. Es el tiempo que transcurre cada vez que se ejecuta la función love.upload().

      Un ordenador que chuta a 100 FPS tendrá un promedio de 0.01 (1 / 100) delta time (se puede hacer un print(dt) para verlo.
      Otro ordenador que chuta a 200 FPS tendrá un promedio de 0.005 (1 / 200) delta time.

      Si suponemos que el incremento del valor de la variable x (la posición) es 10 cada vez que pasa tendrá que ir incrementando 10.
      De modo que en un segundo el primer ordenador pasa 100 veces y el segundo ordenador pasa 200 veces. Multiplicamos por eso por delta time para que sea la misma velocidad en todos los ordenadores.

      Espero con esos cálculos se entienda mejor:

      De todos modos creo que el tema merece un post explicándolo con ejemplos. Ahora es tarde.

  2. Vale, entre tu explicación y la wiki de löve ya entiendo como funciona. Se usa para calcular el tiempo que pasa entre un update y el siguiente, este tiempo se puede ir sumando a una variable para que cuando llege a un determinado valor, por ejemplo un segundo ejecute el siguiente paso del juego.

    Gracias por la explicación y por los tutoriales.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *