From e17d7b8139f249749b10f8b70529ef68c7f34614 Mon Sep 17 00:00:00 2001 From: Andros Fenollosa Date: Mon, 17 Oct 2016 23:41:41 +0200 Subject: [PATCH] Add collision --- main.lua | 180 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 126 insertions(+), 54 deletions(-) diff --git a/main.lua b/main.lua index 4ad4b7e..64a95fa 100644 --- a/main.lua +++ b/main.lua @@ -4,15 +4,41 @@ function table_length(T) return count end -function love.load(arg) +local clock = os.clock +function sleep(n) -- seconds + local t0 = clock() + while clock() - t0 <= n do end +end + +-- Collision detection function. +-- Returns true if two boxes overlap, false if they don't +-- x1,y1 are the left-top coords of the first box, while w1,h1 are its width and height +-- x2,y2,w2 & h2 are the same, but for the second box +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 + +function love.load() -- Configuración math.randomseed(os.time()) - love.window.setMode(1280, 720, {resizable=false}) - love.window.setTitle( 'Alunizaje' ) + camara_width = 1280 + camara_height = 720 + debug = false + play = true + win = false + font = love.graphics.newFont(40) + love.graphics.setFont(font) + love.window.setMode(camara_width, camara_height, {resizable=false}) + -- love.window.setFullscreen(true) + love.window.setTitle('Alunizaje') fondo = { x = 0, y = 0, img = love.graphics.newImage('assets/img/fondo.jpg') } game_height = 2880 game_width = 1280 gravedad = 2 + distancia_luna = 100 -- Fisicas love.physics.setMeter(64) -- Altura del mundo en metros world = love.physics.newWorld(0, gravedad * 64, true) -- Crea el mundo físico @@ -40,7 +66,7 @@ function love.load(arg) for i=1, num_asteroides do temp_img = img_asteroide[math.random(1, table_length(img_asteroide))] asteroides[i] = { x = math.random(0, game_width - temp_img:getWidth()), - y = math.random(0, game_height - temp_img:getHeight()), + y = math.random(200, game_height - temp_img:getHeight()), speed = math.random(1, max_speed), img = temp_img, angle = math.random(0, 90)} @@ -48,62 +74,95 @@ function love.load(arg) end function love.update(dt) - -- Fisicas del mundo - world:update(dt) + if play then + -- Fisicas del mundo + world:update(dt) - -- Controles - if love.keyboard.isDown('escape') then - love.event.push('quit') - end - - if love.keyboard.isDown("right") then - nave.body:applyForce(nave.power, 0) - elseif love.keyboard.isDown("left") then - nave.body:applyForce(-nave.power, 0) - end - if love.keyboard.isDown("up") then - nave.body:applyForce(0, -nave.power) - elseif love.keyboard.isDown("down") then - nave.body:applyForce(0, nave.power) - end - - - -- Asteroides rotar - for key, value in pairs(asteroides) do - -- Rota - value.angle = asteroides[key].angle + (dt * math.pi / 10) - value.x = asteroides[key].x - asteroides[key].speed - end - - -- Asteroides destruir - for key, value in pairs(asteroides) do - -- Destruye los que salen de pantalla - if value.x + asteroides[key].img:getWidth() < 0 then - table.remove(asteroides, key) + -- Controles + if love.keyboard.isDown('escape') then + love.event.push('quit') end - end - -- Asteroides crear - if table_length(asteroides) < num_asteroides then - temp_img = img_asteroide[math.random(1, table_length(img_asteroide))] - asteroides[table_length(asteroides) + 1] = { - x = game_width + temp_img:getWidth(), - y = math.random(0, game_height - temp_img:getHeight()), - speed = math.random(1, max_speed), - img = temp_img, - angle = math.random(0, 90)} + if love.keyboard.isDown("right") then + nave.body:applyForce(nave.power, 0) + elseif love.keyboard.isDown("left") then + nave.body:applyForce(-nave.power, 0) + end + if love.keyboard.isDown("up") then + nave.body:applyForce(0, -nave.power) + elseif love.keyboard.isDown("down") then + nave.body:applyForce(0, nave.power) + end + + + -- Asteroides rotar + for key, value in pairs(asteroides) do + -- Rota + value.angle = asteroides[key].angle + (dt * math.pi / 10) + value.x = asteroides[key].x - asteroides[key].speed + end + + -- Asteroides destruir + for key, value in pairs(asteroides) do + -- Destruye los que salen de pantalla + if value.x + asteroides[key].img:getWidth() < 0 then + table.remove(asteroides, key) + end + end + + -- Asteroides crear + if table_length(asteroides) < num_asteroides then + temp_img = img_asteroide[math.random(1, table_length(img_asteroide))] + asteroides[table_length(asteroides) + 1] = { + x = game_width + temp_img:getWidth(), + y = math.random(0, game_height - temp_img:getHeight()), + speed = math.random(1, max_speed), + img = temp_img, + angle = math.random(0, 90)} + end + + -- Camara + camara_y = 0 + if camara_height / 2 <= nave.body:getY() then -- Superior + camara_y = -nave.body:getY() + (camara_height / 2) + end + if game_height - camara_height / 2 < nave.body:getY() then --Inferior + camara_y = -game_height + camara_height + end + + -- Colision + if nave.body:getY() <= 0 then -- Arriba del juego + x, y = nave.body:getLinearVelocity() + nave.body:setLinearVelocity(x, -y) + end + if nave.body:getX() + nave.img:getWidth() > game_width then -- Derecha del juego + x, y = nave.body:getLinearVelocity() + nave.body:setLinearVelocity(-x, y) + end + if nave.body:getX() < 0 then -- Izquierda del juego + x, y = nave.body:getLinearVelocity() + nave.body:setLinearVelocity(-x, y) + end + if nave.body:getY() + nave.img:getHeight() + distancia_luna >= game_height then -- Abajo del juego + nave.body:setLinearVelocity(0, 0) + win = true + play = false + end + + for key, value in pairs(asteroides) do -- Con asteroides + if CheckCollision(asteroides[key].x - (asteroides[key].img:getWidth() / 2), asteroides[key].y - (asteroides[key].img:getHeight() / 2), asteroides[key].img:getWidth(), asteroides[key].img:getHeight(), nave.body:getX(), nave.body:getY(), nave.img:getWidth(), nave.img:getHeight()) then + play = false + end + end + else + sleep(2) + love.load() end end function love.draw() - -- Camara - camara_y = -nave.body:getY() + (game_height / 8) - nave.img:getHeight() - if (game_height / 8) - nave.img:getHeight() <= nave.body:getY() then - love.graphics.translate(0, camara_y) - end - if game_height - (game_height / 6) < nave.body:getY() then - love.graphics.translate(0, -game_height) - end + -- Camara + love.graphics.translate(0, camara_y) -- Fondo love.graphics.draw(fondo.img, fondo.x, fondo.y) @@ -111,9 +170,22 @@ function love.draw() -- Asteroides for key, value in pairs(asteroides) do love.graphics.draw(value.img, value.x, value.y, value.angle, 1, 1, value.img:getWidth() / 2, value.img:getHeight() / 2) + if debug then + love.graphics.rectangle("line", value.x - (value.img:getWidth() / 2), value.y - (value.img:getHeight() / 2), value.img:getWidth(), value.img:getHeight()) + end end -- Nave love.graphics.draw(nave.img, nave.body:getX(), nave.body:getY()) -end + if debug then + love.graphics.rectangle("line", nave.body:getX(), nave.body:getY(), nave.img:getWidth(), nave.img:getHeight()) + end + -- Textos + if not play and not win then + love.graphics.print('Game over', (camara_width / 2), -camara_y + (camara_height / 2)) + end + if not play and win then + love.graphics.print('You win!', (camara_width / 2), -camara_y + (camara_height / 2)) + end +end \ No newline at end of file