-------------------------------------------------------------------------------- -- Colors local COLOR_PLAYER_1 = {200/255, 255/255, 200/255} local COLOR_PLAYER_2 = {200/255, 200/255, 255/255} local COLOR_WHITE = {255/255,255/255,255/255} local COLOR_LOWER = {230/255, 230/255, 255/255} local COLOR_BG = {26/255,26/255,26/255} -------------------------------------------------------------------------------- WINDOW_WIDTH, WINDOW_HEIGTH = 800, 600 local SOMEBODY_ONCE = false local SOMEBODY_MUSC = love.audio.newSource('/All_Star_NoIntro.mp3', 'stream') SOMEBODY_MUSC:setLooping(true) SOMEBODY_MUSC:play() local SOMEBODIES = {} local plat = require "plat" local color = require "color_tools" local FONT = love.graphics.newFont('star_font.ttf', 60) love.graphics.setFont(FONT) local system, player_1, player_2, reset_timer -- Stars local Stars = {} function Stars:generate (nr_stars) for i = 1, 200 do self[#self+1] = math.random() * WINDOW_WIDTH self[#self+1] = math.random() ^ 2 * WINDOW_HEIGTH end end function Stars:update (dt, scores) local star_speed = dt * (scores[2] - scores[1]) if star_speed == 0 then return end for i = 1, #self, 2 do self[i] = (self[i] + star_speed * self[i+1]/WINDOW_HEIGTH) % WINDOW_WIDTH end end function Stars:draw () love.graphics.points(self) end -- Scores local SCORES = { 0, 0 } local function draw_scores () love.graphics.printf(SCORES[1], 50, 600 - 80, 700, 'left') love.graphics.printf(SCORES[2], 50, 600 - 80, 700, 'right') end function reset_game () system = plat.PlatformSystem.new() system:addPlatform(50, 400, 100, 50) system:addPlatform(800-50-100, 400, 100, 50) system:addPlatform(300, 200, 200, 50) local lower = system:addPlatform(300, 550, 200, 50) lower.resistance = -0.4 lower.color = COLOR_LOWER player_1 = system:addPlayer(100, 50, 50, 50, {jump = 'w', left = 'a', right = 'd'}) player_1.start_t = 0 player_1.controller.last_dir = 1 player_2 = system:addPlayer(800 - 100 - 50, 50, 50, 50, {jump = 'up', left = 'left', right = 'right'}) player_2.start_t = 0 player_2.controller.last_dir = -1 reset_timer = nil if SOMEBODY_ONCE then local somb = SOMEBODY_MUSC:clone() somb:play() somb:setLooping(true) SOMEBODIES[#SOMEBODIES+1] = somb end end local function is_player_outside_bounds (player) return player.x + player.w < -100 or 900 < player.x or player.y > 700 end -------------------------------------------------------------------------------- function love.load () math.randomseed(os.time()) Stars:generate(1000) reset_game() end local PLAYER_1_SHOOT = 's' local PLAYER_2_SHOOT = 'down' function love.update (dt) Stars:update(dt, SCORES) system:update(dt) -- Update color player_1.color = color.interpolate_rgb(COLOR_PLAYER_1, COLOR_WHITE, love.keyboard.isDown(PLAYER_1_SHOOT) and math.max(0, math.min(1, love.timer.getTime() - player_1.start_t)) or 0) player_2.color = color.interpolate_rgb(COLOR_PLAYER_2, COLOR_WHITE, love.keyboard.isDown(PLAYER_2_SHOOT) and math.max(0, math.min(1, love.timer.getTime() - player_2.start_t)) or 0) if reset_timer then reset_timer = reset_timer - dt if reset_timer < 0 then reset_game() end end if is_player_outside_bounds(player_1) and player_1.movable then SCORES[2] = SCORES[2] + 1 player_1.movable = false reset_timer = 1 end if is_player_outside_bounds(player_2) and player_2.movable then SCORES[1] = SCORES[1] + 1 player_2.movable = false reset_timer = reset_timer or 1 end end local function shoot_bullet_at_player (player) -- TODO: Add Timeout when shooting bullets shorter than 0.2 local time = love.timer.getTime() - player.start_t local size = math.max(math.min( 1, time ), 0.2) local dx = player.controller.last_dir * (1.2 - size) * 600 + player.dx if dx ~= 0 then local bw, bh = math.floor(40*size + 0.5), math.floor(20*size + 0.5) local bx, by = player.x + player.w/2 - bw/2, player.y + player.h/2 - bh/2 system:addBullet(bx, by, bw, bh, dx, player) end end function love.keyreleased (key) if key == PLAYER_1_SHOOT then shoot_bullet_at_player(player_1) end if key == PLAYER_2_SHOOT then shoot_bullet_at_player(player_2) end end function love.keypressed (key) if key == 'escape' then love.event.quit() end if key == 's' and player_1.start_t < love.timer.getTime() then player_1.start_t = love.timer.getTime() end if key == 'down' and player_2.start_t < love.timer.getTime() then player_2.start_t = love.timer.getTime() end if key == 'f2' then SOMEBODY_MUSC:stop() end if key == 'f1' then SOMEBODY_ONCE = not SOMEBODY_ONCE if not SOMEBODY_ONCE then for _, track in ipairs(SOMEBODIES) do track:stop() end SOMEBODIES = {} end end end function love.draw () love.graphics.setBackgroundColor(COLOR_BG) love.graphics.setColor(COLOR_WHITE) -- Draw score draw_scores() -- Draw Stars Stars:draw() -- Draw System system:draw() if is_player_outside_bounds(player_1) then love.graphics.setColor(COLOR_PLAYER_1) love.graphics.rectangle('fill', player_1.x-4000, player_1.y, 8000, 50) love.graphics.rectangle('fill', player_1.x, player_1.y-4000, 50, 8000) end if is_player_outside_bounds(player_2) then love.graphics.setColor(COLOR_PLAYER_2) love.graphics.rectangle('fill', player_2.x-4000, player_2.y, 8000, 50) love.graphics.rectangle('fill', player_2.x, player_2.y-4000, 50, 8000) end end