diff --git a/README.md b/README.md new file mode 100644 index 0000000..b982f75 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# Creando sencillos juegos con Löve2D + +![Löve2D Logo](logo.png) + +Cada uno de los pasos se encuentra en la carpeta de **STEPS**. + +- **1_hello**: Hola mundo. +- **2_layout**: Ventana. +- **3_background**: Fondo +- **4_spaceship1**: Nave estática. +- **4_spaceship2**: Nave animada. +- **5_move_spaceship**: Moviendo la nave. +- **6_asteroids1**: Creando un asteoride. +- **6_asteroids2**: Moviendo el asteroide. +- **6_asteroids2**: Generando asteroides aleatorios. +- **7_collision_detection**: Colisiones. +- **8_sounds**: Sonidos. + +## Ejecutar el juego terminado + +Descarga todos los archivos en zip y descomprimelos. + +Instala löve desde su [página oficial](https://love2d.org/). + +Ejecuta *love* seguido de la carpeta descargada del proyecto. + +``` bash +love love2d-tutorial-runner +``` \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..b92d348 Binary files /dev/null and b/logo.png differ diff --git a/main.lua b/main.lua index ed82916..460eea2 100644 --- a/main.lua +++ b/main.lua @@ -93,6 +93,7 @@ function love.update(dt) -- Colision if checkCollision(spaceship.x, spaceship.y[spaceship.pos], spaceship.img:getWidth(), spaceship.img:getHeight() / spaceship.num_frames / 2, asteroid.x, asteroid.y[asteroid.pos], asteroid.img:getWidth(), asteroid.img:getHeight()) then game.play = false + sounds.die:stop() sounds.die:play() explosion.animate = true explosion.x = spaceship.x diff --git a/steps/7_collision_detection/assets/sprites/asteroid_1.png b/steps/7_collision_detection/assets/sprites/asteroid_1.png new file mode 100755 index 0000000..643f55b Binary files /dev/null and b/steps/7_collision_detection/assets/sprites/asteroid_1.png differ diff --git a/steps/7_collision_detection/assets/sprites/asteroid_2.png b/steps/7_collision_detection/assets/sprites/asteroid_2.png new file mode 100755 index 0000000..91be634 Binary files /dev/null and b/steps/7_collision_detection/assets/sprites/asteroid_2.png differ diff --git a/steps/7_collision_detection/assets/sprites/asteroid_3.png b/steps/7_collision_detection/assets/sprites/asteroid_3.png new file mode 100755 index 0000000..17703d8 Binary files /dev/null and b/steps/7_collision_detection/assets/sprites/asteroid_3.png differ diff --git a/steps/7_collision_detection/assets/sprites/asteroid_4.png b/steps/7_collision_detection/assets/sprites/asteroid_4.png new file mode 100755 index 0000000..3c0edbc Binary files /dev/null and b/steps/7_collision_detection/assets/sprites/asteroid_4.png differ diff --git a/steps/7_collision_detection/assets/sprites/asteroid_5.png b/steps/7_collision_detection/assets/sprites/asteroid_5.png new file mode 100755 index 0000000..d0fb911 Binary files /dev/null and b/steps/7_collision_detection/assets/sprites/asteroid_5.png differ diff --git a/steps/7_collision_detection/assets/sprites/asteroid_6.png b/steps/7_collision_detection/assets/sprites/asteroid_6.png new file mode 100755 index 0000000..d6c43d4 Binary files /dev/null and b/steps/7_collision_detection/assets/sprites/asteroid_6.png differ diff --git a/steps/7_collision_detection/assets/sprites/asteroid_7.png b/steps/7_collision_detection/assets/sprites/asteroid_7.png new file mode 100755 index 0000000..316b7d7 Binary files /dev/null and b/steps/7_collision_detection/assets/sprites/asteroid_7.png differ diff --git a/steps/7_collision_detection/assets/sprites/asteroid_8.png b/steps/7_collision_detection/assets/sprites/asteroid_8.png new file mode 100755 index 0000000..08351b4 Binary files /dev/null and b/steps/7_collision_detection/assets/sprites/asteroid_8.png differ diff --git a/steps/7_collision_detection/assets/sprites/asteroid_9.png b/steps/7_collision_detection/assets/sprites/asteroid_9.png new file mode 100755 index 0000000..66ae682 Binary files /dev/null and b/steps/7_collision_detection/assets/sprites/asteroid_9.png differ diff --git a/steps/7_collision_detection/assets/sprites/background.jpg b/steps/7_collision_detection/assets/sprites/background.jpg new file mode 100644 index 0000000..cebdb04 Binary files /dev/null and b/steps/7_collision_detection/assets/sprites/background.jpg differ diff --git a/steps/7_collision_detection/assets/sprites/spaceship.png b/steps/7_collision_detection/assets/sprites/spaceship.png new file mode 100644 index 0000000..b6919e6 Binary files /dev/null and b/steps/7_collision_detection/assets/sprites/spaceship.png differ diff --git a/steps/7_collision_detection/main.lua b/steps/7_collision_detection/main.lua new file mode 100644 index 0000000..933fd90 --- /dev/null +++ b/steps/7_collision_detection/main.lua @@ -0,0 +1,110 @@ +function love.load() + math.randomseed(os.time()) + game = {} + game.width = 800 + game.height = 480 + game.play = true + love.window.setMode(game.width, game.height) + score = { x = 500, y = 40 } + -- Background + background = {} + background.img = love.graphics.newImage('assets/sprites/background.jpg') + background.x = 0 + background.y = 0 + -- Spaceship + spaceship = {} + spaceship.img = love.graphics.newImage('assets/sprites/spaceship.png') + spaceship.x = game.height / 8 + spaceship.num_frames = 4 + spaceship.pos_frame = 1 + spaceship.frame_height = spaceship.img:getHeight() / spaceship.num_frames + spaceship.y = { + (game.height / 4) - (spaceship.img:getHeight() / 8), + 2 * (game.height / 4) - (spaceship.img:getHeight() / 8), + 3 * (game.height / 4) - (spaceship.img:getHeight() / 8), + } + spaceship.pos = 1 + spaceship.frames = { + love.graphics.newQuad(0, spaceship.frame_height * 0, spaceship.img:getWidth(), spaceship.frame_height, spaceship.img:getWidth(), spaceship.img:getHeight()), + love.graphics.newQuad(0, spaceship.frame_height * 1, spaceship.img:getWidth(), spaceship.frame_height, spaceship.img:getWidth(), spaceship.img:getHeight()), + love.graphics.newQuad(0, spaceship.frame_height * 2, spaceship.img:getWidth(), spaceship.frame_height, spaceship.img:getWidth(), spaceship.img:getHeight()), + love.graphics.newQuad(0, spaceship.frame_height * 3, spaceship.img:getWidth(), spaceship.frame_height, spaceship.img:getWidth(), spaceship.img:getHeight()) + } + + -- Asteroids + num_asteroids = 3 + asteroids = {} + for i = 1, num_asteroids do + asteroid = {} + asteroid.img = love.graphics.newImage('assets/sprites/asteroid_' .. tostring(math.random(1, 9)) .. '.png') + asteroid.x = game.width + asteroid.y = { + (game.height / 4) - (asteroid.img:getHeight() / 2), + 2 * (game.height / 4) - (asteroid.img:getHeight() / 2), + 3 * (game.height / 4) - (asteroid.img:getHeight() / 2), + } + asteroid.pos = 2 + asteroid.speed = 600 + asteroids[i] = asteroid + if checkCollision(spaceship.x, spaceship.y[spaceship.pos], spaceship.img:getWidth(), spaceship.img:getHeight() / spaceship.num_frames / 2, asteroid.x, asteroid.y[asteroid.pos], asteroid.img:getWidth(), asteroid.img:getHeight()) then + game.play = false + explosion.animate = true + explosion.x = spaceship.x + explosion.y = spaceship.y[spaceship.pos] + end + + end +end + +function love.draw() + -- Background + love.graphics.draw(background.img, background.x, background.y) + -- Spaceship + if game.play then + love.graphics.draw(spaceship.img, spaceship.frames[spaceship.pos_frame], spaceship.x, spaceship.y[spaceship.pos]) + end + -- Asteroids + for key, asteroid in pairs(asteroids) do + love.graphics.draw(asteroid.img, asteroid.x, asteroid.y[asteroid.pos]) + end +end + +function love.update(dt) + -- Spaceship + if spaceship.pos_frame ~= spaceship.num_frames then + spaceship.pos_frame = spaceship.pos_frame + 1 + else + spaceship.pos_frame = 1 + end + -- Asteroids + for key, asteroid in pairs(asteroids) do + asteroid.x = asteroid.x - (dt * asteroid.speed) + if asteroid.x < -asteroid.img:getWidth() then + asteroid.x = game.width + math.random(0, game.width) + asteroid.pos = math.random(1, 3) + end + if checkCollision(spaceship.x, spaceship.y[spaceship.pos], spaceship.img:getWidth(), spaceship.img:getHeight() / spaceship.num_frames / 2, asteroid.x, asteroid.y[asteroid.pos], asteroid.img:getWidth(), asteroid.img:getHeight()) then + game.play = false + end + end +end + +-- Controls +function love.keypressed(key, scancode, isrepeat) + if key == 'escape' then + love.event.push('quit') + end + if key == 'up' and spaceship.pos > 1 then + spaceship.pos = spaceship.pos - 1 + elseif key == 'down' and spaceship.pos < 3 then + spaceship.pos = spaceship.pos + 1 + end +end + +function checkCollision(x1,y1,w1,h1, x2,y2,w2,h2) + return x1 < x2 + w2 and + x2 < x1 + w1 and + y1 < y2 + h2 and + y2 < y1 + h1 +end + diff --git a/steps/8_sounds/assets/sounds/ambient.wav b/steps/8_sounds/assets/sounds/ambient.wav new file mode 100644 index 0000000..98dbaec Binary files /dev/null and b/steps/8_sounds/assets/sounds/ambient.wav differ diff --git a/steps/8_sounds/assets/sprites/asteroid_1.png b/steps/8_sounds/assets/sprites/asteroid_1.png new file mode 100755 index 0000000..643f55b Binary files /dev/null and b/steps/8_sounds/assets/sprites/asteroid_1.png differ diff --git a/steps/8_sounds/assets/sprites/asteroid_2.png b/steps/8_sounds/assets/sprites/asteroid_2.png new file mode 100755 index 0000000..91be634 Binary files /dev/null and b/steps/8_sounds/assets/sprites/asteroid_2.png differ diff --git a/steps/8_sounds/assets/sprites/asteroid_3.png b/steps/8_sounds/assets/sprites/asteroid_3.png new file mode 100755 index 0000000..17703d8 Binary files /dev/null and b/steps/8_sounds/assets/sprites/asteroid_3.png differ diff --git a/steps/8_sounds/assets/sprites/asteroid_4.png b/steps/8_sounds/assets/sprites/asteroid_4.png new file mode 100755 index 0000000..3c0edbc Binary files /dev/null and b/steps/8_sounds/assets/sprites/asteroid_4.png differ diff --git a/steps/8_sounds/assets/sprites/asteroid_5.png b/steps/8_sounds/assets/sprites/asteroid_5.png new file mode 100755 index 0000000..d0fb911 Binary files /dev/null and b/steps/8_sounds/assets/sprites/asteroid_5.png differ diff --git a/steps/8_sounds/assets/sprites/asteroid_6.png b/steps/8_sounds/assets/sprites/asteroid_6.png new file mode 100755 index 0000000..d6c43d4 Binary files /dev/null and b/steps/8_sounds/assets/sprites/asteroid_6.png differ diff --git a/steps/8_sounds/assets/sprites/asteroid_7.png b/steps/8_sounds/assets/sprites/asteroid_7.png new file mode 100755 index 0000000..316b7d7 Binary files /dev/null and b/steps/8_sounds/assets/sprites/asteroid_7.png differ diff --git a/steps/8_sounds/assets/sprites/asteroid_8.png b/steps/8_sounds/assets/sprites/asteroid_8.png new file mode 100755 index 0000000..08351b4 Binary files /dev/null and b/steps/8_sounds/assets/sprites/asteroid_8.png differ diff --git a/steps/8_sounds/assets/sprites/asteroid_9.png b/steps/8_sounds/assets/sprites/asteroid_9.png new file mode 100755 index 0000000..66ae682 Binary files /dev/null and b/steps/8_sounds/assets/sprites/asteroid_9.png differ diff --git a/steps/8_sounds/assets/sprites/background.jpg b/steps/8_sounds/assets/sprites/background.jpg new file mode 100644 index 0000000..cebdb04 Binary files /dev/null and b/steps/8_sounds/assets/sprites/background.jpg differ diff --git a/steps/8_sounds/assets/sprites/spaceship.png b/steps/8_sounds/assets/sprites/spaceship.png new file mode 100644 index 0000000..b6919e6 Binary files /dev/null and b/steps/8_sounds/assets/sprites/spaceship.png differ diff --git a/steps/8_sounds/main.lua b/steps/8_sounds/main.lua new file mode 100644 index 0000000..e04bcde --- /dev/null +++ b/steps/8_sounds/main.lua @@ -0,0 +1,115 @@ +function love.load() + math.randomseed(os.time()) + game = {} + game.width = 800 + game.height = 480 + game.play = true + love.window.setMode(game.width, game.height) + score = { x = 500, y = 40 } + -- Background + background = {} + background.img = love.graphics.newImage('assets/sprites/background.jpg') + background.x = 0 + background.y = 0 + -- Spaceship + spaceship = {} + spaceship.img = love.graphics.newImage('assets/sprites/spaceship.png') + spaceship.x = game.height / 8 + spaceship.num_frames = 4 + spaceship.pos_frame = 1 + spaceship.frame_height = spaceship.img:getHeight() / spaceship.num_frames + spaceship.y = { + (game.height / 4) - (spaceship.img:getHeight() / 8), + 2 * (game.height / 4) - (spaceship.img:getHeight() / 8), + 3 * (game.height / 4) - (spaceship.img:getHeight() / 8), + } + spaceship.pos = 1 + spaceship.frames = { + love.graphics.newQuad(0, spaceship.frame_height * 0, spaceship.img:getWidth(), spaceship.frame_height, spaceship.img:getWidth(), spaceship.img:getHeight()), + love.graphics.newQuad(0, spaceship.frame_height * 1, spaceship.img:getWidth(), spaceship.frame_height, spaceship.img:getWidth(), spaceship.img:getHeight()), + love.graphics.newQuad(0, spaceship.frame_height * 2, spaceship.img:getWidth(), spaceship.frame_height, spaceship.img:getWidth(), spaceship.img:getHeight()), + love.graphics.newQuad(0, spaceship.frame_height * 3, spaceship.img:getWidth(), spaceship.frame_height, spaceship.img:getWidth(), spaceship.img:getHeight()) + } + + -- Asteroids + num_asteroids = 3 + asteroids = {} + for i = 1, num_asteroids do + asteroid = {} + asteroid.img = love.graphics.newImage('assets/sprites/asteroid_' .. tostring(math.random(1, 9)) .. '.png') + asteroid.x = game.width + asteroid.y = { + (game.height / 4) - (asteroid.img:getHeight() / 2), + 2 * (game.height / 4) - (asteroid.img:getHeight() / 2), + 3 * (game.height / 4) - (asteroid.img:getHeight() / 2), + } + asteroid.pos = 2 + asteroid.speed = 600 + asteroids[i] = asteroid + if checkCollision(spaceship.x, spaceship.y[spaceship.pos], spaceship.img:getWidth(), spaceship.img:getHeight() / spaceship.num_frames / 2, asteroid.x, asteroid.y[asteroid.pos], asteroid.img:getWidth(), asteroid.img:getHeight()) then + game.play = false + explosion.animate = true + explosion.x = spaceship.x + explosion.y = spaceship.y[spaceship.pos] + end + + end + -- Sound + ambient = love.audio.newSource('assets/sounds/ambient.wav', 'static') + ambient:play() + ambient:setLooping(true) + +end + +function love.draw() + -- Background + love.graphics.draw(background.img, background.x, background.y) + -- Spaceship + if game.play then + love.graphics.draw(spaceship.img, spaceship.frames[spaceship.pos_frame], spaceship.x, spaceship.y[spaceship.pos]) + end + -- Asteroids + for key, asteroid in pairs(asteroids) do + love.graphics.draw(asteroid.img, asteroid.x, asteroid.y[asteroid.pos]) + end +end + +function love.update(dt) + -- Spaceship + if spaceship.pos_frame ~= spaceship.num_frames then + spaceship.pos_frame = spaceship.pos_frame + 1 + else + spaceship.pos_frame = 1 + end + -- Asteroids + for key, asteroid in pairs(asteroids) do + asteroid.x = asteroid.x - (dt * asteroid.speed) + if asteroid.x < -asteroid.img:getWidth() then + asteroid.x = game.width + math.random(0, game.width) + asteroid.pos = math.random(1, 3) + end + if checkCollision(spaceship.x, spaceship.y[spaceship.pos], spaceship.img:getWidth(), spaceship.img:getHeight() / spaceship.num_frames / 2, asteroid.x, asteroid.y[asteroid.pos], asteroid.img:getWidth(), asteroid.img:getHeight()) then + game.play = false + end + end +end + +-- Controls +function love.keypressed(key, scancode, isrepeat) + if key == 'escape' then + love.event.push('quit') + end + if key == 'up' and spaceship.pos > 1 then + spaceship.pos = spaceship.pos - 1 + elseif key == 'down' and spaceship.pos < 3 then + spaceship.pos = spaceship.pos + 1 + end +end + +function checkCollision(x1,y1,w1,h1, x2,y2,w2,h2) + return x1 < x2 + w2 and + x2 < x1 + w1 and + y1 < y2 + h2 and + y2 < y1 + h1 +end +