Tutorial: Crear un Juego Tipo Whack-a-Mole en Pico-8

PICO-8 es una consola virtual dishttps://amzn.to/4dSlvwheñada para la creación de videojuegos retro con gráficos de 8 bits y un estilo simplificado. Es muy popular entre los entusiastas de los videojuegos debido a su simplicidad y portabilidad. En este tutorial, te mostraremos cómo crear un juego tipo «Whack-a-Mole» en PICO-8, donde los jugadores deben golpear topos que aparecen aleatoriamente en pantalla. Este tutorial te guiará paso a paso para crear el juego, desde la configuración básica hasta el código del juego.

#Ad https://amzn.to/4dSlvwh

1. Configuración de PICO-8

Antes de comenzar, necesitas descargar PICO-8 desde su sitio web oficial. Una vez que lo hayas instalado y abierto, estarás listo para comenzar a crear tu juego.

2. Concepto del Juego

En un juego clásico de Whack-a-Mole, los topos aparecen en varios agujeros de la pantalla de manera aleatoria. El jugador debe reaccionar rápidamente para golpear los topos antes de que desaparezcan. Nuestro juego tendrá los siguientes elementos clave:

  • Un martillo controlado por el jugador.
  • Agujeros donde los topos aparecerán de manera aleatoria.
  • Un temporizador que limita el tiempo en el que los topos permanecen visibles.
  • Un sistema de puntuación basado en los topos golpeados.

3. Esqueleto Básico del Juego

En PICO-8, los juegos se desarrollan utilizando Lua, un lenguaje de programación simple y ligero. Para empezar, vamos a crear el esqueleto básico del juego, que consistirá en dos funciones: init() para inicializar variables y update() para manejar la lógica del juego en cada cuadro.

Función de inicialización

Vamos a crear algunas variables para controlar los topos y el martillo:

function init()
  -- Coordenadas de los agujeros de los topos
  moles = {
    {x=32, y=32, visible=false, timer=0},
    {x=96, y=32, visible=false, timer=0},
    {x=32, y=96, visible=false, timer=0},
    {x=96, y=96, visible=false, timer=0}
  }

  -- Martillo
  hammer = {x=64, y=64}

  -- Puntuación
  score = 0

  -- Tiempo entre la aparición de topos
  mole_interval = 60
  mole_timer = 0

  -- Iniciar el juego
  game_over = false
end

4. Dibujando los Elementos del Juego

En PICO-8, los gráficos se pueden dibujar utilizando sprites. Vamos a dibujar los agujeros de los topos, los topos mismos y el martillo.

Función de dibujo

function draw()
  cls()  -- Limpia la pantalla

  -- Dibujar agujeros y topos
  for mole in all(moles) do
    circfill(mole.x, mole.y, 10, 5)  -- Dibuja los agujeros

    if mole.visible then
      spr(1, mole.x - 8, mole.y - 8)  -- Dibuja el topo si es visible
    end
  end

  -- Dibujar el martillo
  spr(2, hammer.x - 8, hammer.y - 8)

  -- Dibujar la puntuación
  print("Score: "..score, 1, 1, 7)
end

5. Lógica del Juego

En esta sección, manejaremos el control del martillo, la aparición de los topos, y la lógica para golpear a los topos.

Control del martillo

El martillo debe seguir el movimiento del jugador. Podemos usar las teclas de flecha para mover el martillo y las coordenadas x e y se actualizarán de acuerdo.

function update()
  -- Movimiento del martillo
  if btn(0) then hammer.x -= 2 end  -- Izquierda
  if btn(1) then hammer.x += 2 end  -- Derecha
  if btn(2) then hammer.y -= 2 end  -- Arriba
  if btn(3) then hammer.y += 2 end  -- Abajo

  -- Mantener el martillo dentro de los límites de la pantalla
  hammer.x = mid(0, hammer.x, 128)
  hammer.y = mid(0, hammer.y, 128)

  -- Lógica de aparición de topos
  mole_timer += 1
  if mole_timer >= mole_interval then
    spawn_mole()
    mole_timer = 0
  end

  -- Golpear topos
  if btnp(4) then  -- Botón Z
    hit_mole()
  end

  -- Actualizar temporizadores de los topos
  update_moles()
end

Aparición de topos

Cada cierto tiempo, queremos que un topo aparezca aleatoriamente en uno de los agujeros. La función spawn_mole() se encargará de hacer esto:

function spawn_mole()
  local mole = moles[flr(rnd(#moles)) + 1]
  mole.visible = true
  mole.timer = 30  -- Tiempo que el topo estará visible
end

Golpear a los topos

Cuando el jugador presiona el botón de golpear (Z), verificamos si el martillo está sobre un topo visible. Si lo está, aumentamos la puntuación y hacemos que el topo desaparezca.

function hit_mole()
  for mole in all(moles) do
    if mole.visible and abs(mole.x - hammer.x) < 8 and abs(mole.y - hammer.y) < 8 then
      mole.visible = false
      score += 1
    end
  end
end

Actualización de topos

Los topos no deben permanecer visibles indefinidamente. Después de un tiempo, deben desaparecer. Actualizaremos los temporizadores de los topos en cada cuadro.

function update_moles()
  for mole in all(moles) do
    if mole.visible then
      mole.timer -= 1
      if mole.timer <= 0 then
        mole.visible = false
      end
    end
  end
end

6. Pantalla de Game Over

Es importante agregar una condición para finalizar el juego, como un temporizador global o un número máximo de topos golpeados. En este caso, terminaremos el juego cuando el jugador alcance una puntuación objetivo.

function check_game_over()
  if score >= 10 then
    game_over = true
  end
end

Y también podemos mostrar una pantalla de Game Over cuando el jugador gane:

function draw_game_over()
  cls()
  print("Game Over!", 48, 60, 7)
  print("Score: "..score, 48, 70, 7)
end

7. Integración Final

Finalmente, integramos todas las funciones. En el ciclo principal, verificamos si el juego está activo o si se debe mostrar la pantalla de Game Over.

function _init()
  init()
end

function _update()
  if not game_over then
    update()
    check_game_over()
  end
end

function _draw()
  if game_over then
    draw_game_over()
  else
    draw()
  end
end

8. Mejoras y Extensiones

Una vez que hayas implementado la versión básica del juego, puedes agregar funciones adicionales para mejorar la jugabilidad:

  • Ajustar la dificultad: Hacer que los topos aparezcan y desaparezcan más rápido a medida que el jugador aumenta su puntuación.
  • Sonidos: Añadir efectos de sonido cuando el martillo golpee un topo o cuando el jugador falle.
  • Más agujeros: Agregar más agujeros para que aparezcan los topos, aumentando el desafío.
  • Tiempo límite: Implementar un temporizador global que haga que el juego termine cuando se acabe el tiempo.

Conclusión

Este juego tipo «Whack-a-Mole» en PICO-8 es un excelente punto de partida para aprender a usar la consola virtual y familiarizarte con la programación de juegos retro. Con la estructura básica en su lugar, puedes personalizar el juego a tu gusto y explorar más funciones de PICO-8, como animaciones, efectos de sonido y más niveles. ¡Diviértete creando!

Deja un comentario

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