Tutorial como hacer un Pong en Love2D


Assets:

Primero descargaremos los siguientes assets para este proyecto

https://opengameart.org/content/pong-programmer-art

https://opengameart.org/content/pong-sfx

https://www.dafont.com/es/squarefont.font

Creamos una carpeta que nombraremos "pong" y unas sub-carpetas llamadas "sprites" , "sonidos" , "fuentes" y añadimos cada archivo en su respectiva carpeta.

conf.lua

Crearemos un archivo y lo llamaremos conf.lua, en él añadiremos el siguiente código para configurar el proyecto:

function love.conf(t)
  t.window.title = "Pong - made in Love2D by Deybis Melendez"
  t.window.width = 800
  t.window.height = 600
end

main.lua

love.load()

En el love.load vamos a declarar las variables para la bola, la barra izquierda y barra derecha, la imagen de background y los sonidos que utilizaremos:

function love.load()
  bola = {}
  bola.velocidad = 300
  bola.movX, bola.movY = -bola.velocidad , bola.velocidad
  bola.sprite = love.graphics.newImage("sprites/fancy-ball.png") -- El sprite mide 32x32
  bola.x , bola.y = love.graphics.getWidth()/2 - 16 , love.graphics.getHeight()/2 - 16

  barra1 = {}
  barra1.sprite = love.graphics.newImage("sprites/fancy-paddle-blue.png")
  barra1.x , barra1.y = 32, love.graphics.getHeight()/2 - 64 -- La barra mide 32x128

  barra2 = {}
  barra2.sprite = love.graphics.newImage("sprites/fancy-paddle-green.png")
  barra2.x , barra2.y = love.graphics.getWidth() - 64 , love.graphics.getHeight()/2 - 64

  background = love.graphics.newImage("sprites/fancy-court.png")

  fuente = love.graphics.newFont("fuentes/Square.ttf", 32)

  pop = love.audio.newSource("sonidos/Pop.ogg", "static")
  score = love.audio.newSource("sonidos/Score.ogg", "static")
  velocidadBarra = 300
  puntaje1 , puntaje2 = 0 , 0
end

love.draw()

Ahora dibujaremos todo el juego en pantalla:

function love.draw()
  love.graphics.draw(background, 0, 0)
  love.graphics.draw(bola.sprite, bola.x, bola.y)
  love.graphics.draw(barra1.sprite, barra1.x, barra1.y)
  love.graphics.draw(barra2.sprite, barra2.x, barra2.y)
  love.graphics.setFont(fuente)
  love.graphics.print(puntaje1, love.graphics.getWidth() * 1/3 , 32)
  love.graphics.print(puntaje2, love.graphics.getWidth() * 2/3 , 32)
end


Funciones


Vamos a añadir 2 funciones para no repetir el código:

function clamp(min, val, max) -- Nos retorna un rango de valor, desde un mínimo a un máximo
  return math.max(min, math.min(val, max))
end


function reiniciar()  -- Reiniciamos la partida si la bola sale de pantalla
  bola.x , bola. y = love.graphics.getWidth()/2 - 16 , love.graphics.getHeight()/2 - 16
  bola.movX = - bola.movX
  bola.movY = - bola.movY
  play(score)
end

function play(sonido)  -- Un simple control de sonido.
  if sonido:isPlaying() then
    love.audio.stop()
    love.audio.play(sonido)
  else
    love.audio.play(sonido)
  end


love.update(dt)

En el update, añadiremos el movimiento de la bola:

  --Movimiento de la bola
  bola.x = bola.x + bola.movX * dt
  bola.y = bola.y + bola.movY * dt


Luego añadimos el código para el rebote desde arriba y abajo:

  -- Rebote de la bola desde arriba hacia abajo
  if bola.y < 0 then
    bola.movY = bola.velocidad
    play(pop)
  elseif bola.y > love.graphics.getHeight() - 32 then
    bola.movY = - bola.velocidad
    play(pop)
  end


Ahora el en caso de que la bola salga de la pantalla por los lados:

  -- Si la bola sale de pantalla reinicia su posición y da puntajes
  if bola.x < -16 then
    reiniciar()
    puntaje2 = puntaje2 + 1
  elseif bola.x > love.graphics.getWidth() then
    reiniciar()
    puntaje1 = puntaje1 + 1
  end


Ahora añadimos el movimiento de las barras, el control del juego:

  -- Control del juego
  if love.keyboard.isDown("a") then
    barra1.y = barra1.y - velocidadBarra * dt
  elseif love.keyboard.isDown("z") then
    barra1.y = barra1.y + velocidadBarra * dt
  end
  if love.keyboard.isDown("up") then
    barra2.y = barra2.y - velocidadBarra * dt
  elseif love.keyboard.isDown("down") then
    barra2.y = barra2.y + velocidadBarra * dt
  end


Ahora limitamos el movimiento de las barras para que no salga de la pantalla:

  barra1.y = clamp(0, barra1.y, love.graphics.getHeight() - 128) -- 128 píxeles mide el alto de la barra
  barra2.y = clamp(0, barra2.y, love.graphics.getHeight() - 128)


Ahora añadimos el código que controla el rebote de la bola en las barras:

  --Rebote de la bola cuando golpea las barras
  if bola.x <= barra1.x + 32 and bola.x >= barra1.x and bola.y >= barra1.y and bola.y + 32 <= barra1.y + 128 then
    bola.movX = bola.velocidad
    play(pop)
  elseif bola.x + 32 >= barra2.x and bola.x <= barra2.x and bola.y >= barra2.y and bola.y + 32 <= barra2.y + 128 then
    bola.movX = - bola.velocidad
    play(pop)
  end



Ahora ya puedes jugar.

Puedes encontrar el proyecto en mi Github: https://github.com/DeybisMelendez/Love2DBlog/tree/master/pong
Tambien puedes jugar el juego en Itch.io:  https://damv.itch.io/pong

No hay comentarios:

Publicar un comentario

Como hacer un Snake en Love2D

Archivos Comenzamos creando los archivos main.lua y conf.lua, en el conf.lua solo añadimos lo siguiente: function love.conf(t)   t.win...