jueves, 17 de noviembre de 2016

Scrolling Shooter en Love2D (I)

Bieeeen bien, parece que aún tengo algunas ganas de escribir. No sé cuánto durarán esta vez (creo que he tenido como seis o siete blogs diferentes en los últimos diez años, algunos con una sóla entrada), pero procuraré usarlas correctamente.

Voy a empezar por explicar, en castellano, algo del código que se puede ver si se sigue el tutorial de OSMStudios para iniciarse al desarrollo de juegos con LUA y Love2D. Como yo mismo soy un recién iniciado, además esto me vendrá bien para repasar y afianzar ¡todo ventajas!. No voy a dar una descripción explícita de cada parte del código, si no sólo de aquellas que me resultan más interesantes, mejorables o complicadas. Espero no liarme con las explicaciones más de la cuenta.

Movimiento

if love.keyboard.isDown('left','a') then
    if player.x > 0 then -- binds us to the map
        player.x = player.x - (player.speed*dt)
    end
elseif love.keyboard.isDown('right','d') then
    if player.x < (love.graphics.getWidth() - player.img:getWidth()) then
        player.x = player.x + (player.speed*dt)
    end
end

Este es el código original que figura en el tutorial de OSMStudios. Son un par de sencillas comprobaciones para saber si se han pulsado las teclas flecha izquierda, a, flecha derecha o d. Si es alguna de las dos primeras, moverá el objeto jugador a la izquierda, y se moverá en sentido contrario si se ha pulsado alguna de las otras dos teclas. Incluye, además, comprobaciones de posición para asegurarse de que nuestro avión no se sale del área de juego.

Me paro un momento en esto último. Player.x y player.y representan la posición x e y de la imagen de player. Hasta donde he entendido, hay que tener muy en cuenta las dimensiones de la misma para situar al objeto, dado que los valores x=0 e y=0 corresponden a la esquina superior izquierda de la imagen y son los que se usan como referencia para evitar que salgamos de la zona útil. Se recoge el valor del ancho del área de juego con love.graphics.getWidth() y se le resta el ancho de la imagen de player, así se evita que nos salgamos por la parte derecha, dado que nuestro (x,y) de la imagen no podrá pasar de ahí. Recordar de nuevo que dicho (x,y) corresponde a la esquina superior izquierda, de ahí que restemos el tamaño de la imagen para no abandonar la zona por el lado derecho. Por el lado contrario será más sencillo: mientras la posición x de la imagen sea superior a 0, podremos movernos.

Una de las propuestas finales del tutorial consiste en añadir movimiento vertical, lo cual no es difícil, pero tras implementar eso me pregunté como realizar movimiento libre, es decir, que también pudiera mover al avioncete en diagonal. Hice varias pruebas fallidas hasta darme cuenta de algo obvio (y me costó un buen rato caer en ello) que es que el código original es excluyente. Mi primera implementación de movimiento vertical era muy similar a la horizontal, por lo que no podía moverme en dos direcciones a la vez (izquierda + arriba por ejemplo). Esto es debido a la estructura excluyente, dado que si se pulsa una tecla no va a capturar otra a la vez. Finalmente mi estructura fue la siguiente:
  -- movimiento
  if love.keyboard.isDown('left', 'a') then
    if player.x > 0 then
      player.x = player.x - (player.speed*dt)
    end
  end
  if love.keyboard.isDown('right','d') then
    if player.x < (love.graphics.getWidth() - player.img:getWidth()) then
      player.x =  player.x + (player.speed*dt)
    end
  end
  if love.keyboard.isDown('up','w') then
    if player.y > (love.graphics.getHeight()/2) then
      player.y = player.y - (player.speed*dt/2)
    end
  end
  if love.keyboard.isDown('down','s') then
    if player.y < (love.graphics.getHeight() - player.img:getHeight()) then
      player.y = player.y + (player.speed*dt/2)
    end
  end

De esta forma si se pulsan dos teclas a la vez, estas serán recogidas sin problema dado que las sentencias condicionales no son excluyentes entre sí, habilitando el movimiento libre.

Hay otro aspecto interesante en este código que es la parte del cálculo de la velocidad de movimiento (player.speed*dt), pero esto lo voy a dejar para la próxima vez.

Espero que esto le sirva a alguien que se quiera iniciar al mundillo de Love2D.

miércoles, 16 de noviembre de 2016

Lua, Love2D y poco tiempo

Bueno, pues vamos al tema de rellenar el blog. Como dije en la presentación, voy a hablar un poquito de LUA. ¿Y qué es eso de LUA?. Pues según su página:

Lua is a powerful, efficient, lightweight, embeddable scripting language. It supports procedural programming, object-oriented programming, functional programming, data-driven programming, and data description.

Traducido, es un lenguaje de scripting que soporta orientación a objetos y más cosas. Permite hacer correr algo de C importando funciones de dicho lenguaje (o archivos, aún no lo tengo muy mirado) y tiene como un aire a javascript. Como algo negativo, no usa puntos y comas al final de cada línea de código. Como Python. ¿Por qué eso es malo? pues porque el resto de lenguajes que uso (php, java) sí los usan y me hago la picha un lío al cambiar de uno a otro.

Vale, y ¿por qué ahora LUA?. Pues porque un amigo, Andros, me propuso colaborar en la próxima Ludum Dare, con el equipo que tiene montado, creando un juego. Dicho grupo, que ya parece haber hecho sus cosas, usa LUA, así que, tras pasarme Andros una página con un simple tutorial para hacer un minúsculo juego, me he puesto a ello.

La verdad es que para el poco tiempo que tengo he podido hacer el tutorial en un par de horas, no seguidas eso sí, y además he podido meterle algo de mano para añadirle cosas. No ha sido complicado, la verdad, es un lenguaje muy accesible si ya sabes programar.

Pero claro, no es sólo LUA, se necesita un algo más, un quéseyoqueyoquesé. En este caso, Love2D, un framework opensource para programar juegos 2D multiplataforma en LUA, y que por debajo tiene SDL, OpenGL y OpenAL. La primera toma de contacto ha sido satisfactoria, poco dolorosa y, sobretodo, rápida. Me queda profundizar un poco más en el código que, aunque es muy simple y sencillo, he tenido que mirar demasiado por encima.

Mi idea es comentar, en alguna entrada posterior, los cambios que he hecho y explicar algunas partes del código, de manera que a quien quiera empezar con el tema de programar juegos pueden servirle. Y quizá también animar a usar este framework que parece bastante accesible.

Un adelanto:

Otro blog otra vez

Pues tengo cierta motivación para volver a tener un blog, ahora a ver con qué lo relleno. En el próximo post, un poco de Love2D y Lua, creo.