@@ -2,10 +2,13 @@ planet = Class{} | |||||
G = 6.67e-1 | G = 6.67e-1 | ||||
function planet:init(x, y, mass, radius, img, arg) | function planet:init(x, y, mass, radius, img, arg) | ||||
self.x = x | self.x = x | ||||
self.y = y | self.y = y | ||||
self.mass = mass | self.mass = mass | ||||
self.attractionX = 0 | |||||
self.attractionY = 0 | |||||
self.r = radius | self.r = radius | ||||
self.w = img:getWidth() | self.w = img:getWidth() | ||||
self.image = img | self.image = img | ||||
@@ -19,6 +22,7 @@ end | |||||
end | end | ||||
function planet:update(dt) | function planet:update(dt) | ||||
if not reachedGoal then | |||||
local distanceToShip = math.sqrt((firstShip.x - self.x)^2 + (firstShip.y - self.y)^2) | local distanceToShip = math.sqrt((firstShip.x - self.x)^2 + (firstShip.y - self.y)^2) | ||||
local gravitationalAttraction = G*self.mass/(distanceToShip^2) | local gravitationalAttraction = G*self.mass/(distanceToShip^2) | ||||
@@ -33,9 +37,15 @@ function planet:update(dt) | |||||
love.window.setTitle(self.attractionX) | love.window.setTitle(self.attractionX) | ||||
firstShip.dx = firstShip.dx + self.attractionX | firstShip.dx = firstShip.dx + self.attractionX | ||||
firstShip.dy = firstShip.dy + self.attractionY | firstShip.dy = firstShip.dy + self.attractionY | ||||
if distanceToShip < 100 then | |||||
sounds["close"]:play() | |||||
end | |||||
if distanceToShip < self.w/4 then | if distanceToShip < self.w/4 then | ||||
shipIsHit = true | shipIsHit = true | ||||
sounds["close"]:stop() | |||||
sounds["boom"]:play() | |||||
end | end | ||||
end | |||||
end | end | ||||
function planet:draw() | function planet:draw() | ||||
@@ -30,7 +30,7 @@ function ship:update(dt) | |||||
if not shipIsHit then | if not shipIsHit then | ||||
self.dottimer = self.dottimer - dt | self.dottimer = self.dottimer - dt | ||||
if self.dottimer < 0 then | if self.dottimer < 0 then | ||||
if (love.keyboard.isDown('w') and self.fuel > 0) then | |||||
if (love.keyboard.isDown('w') and self.fuel > 0 and gameState == "levelgeneral") then | |||||
table.insert(self.path, self:newPathDot(self.x, self.y, 1)) | table.insert(self.path, self:newPathDot(self.x, self.y, 1)) | ||||
else | else | ||||
table.insert(self.path, self:newPathDot(self.x, self.y, 2)) | table.insert(self.path, self:newPathDot(self.x, self.y, 2)) | ||||
@@ -53,7 +53,7 @@ function ship:update(dt) | |||||
self.dx = math.cos(self.vector) * self.speed | self.dx = math.cos(self.vector) * self.speed | ||||
self.dy = math.sin(self.vector) * self.speed | self.dy = math.sin(self.vector) * self.speed | ||||
end ]]-- | end ]]-- | ||||
if love.keyboard.isDown('w') and self.fuel > 0 then | |||||
if love.keyboard.isDown('w') and self.fuel > 0 and gameState == "levelgeneral" then | |||||
self.fuel = self.fuel - 0.5 | self.fuel = self.fuel - 0.5 | ||||
self.speed = self.speed + 0.05 | self.speed = self.speed + 0.05 | ||||
@@ -31,7 +31,7 @@ function level1.load() | |||||
table.insert(guibutts, menu:addButton("To menu", function () | table.insert(guibutts, menu:addButton("To menu", function () | ||||
level.goBack() | level.goBack() | ||||
end)) | end)) | ||||
table.insert(planets, planet(700, 200, 50, 0.3, planetImage, "nodelete")) | |||||
table.insert(planets, planet(700, 200, 50, 0.3, asteroidImage, "nodelete")) | |||||
end | end | ||||
function level1.hint() | function level1.hint() | ||||
GUIDraw("left") | GUIDraw("left") | ||||
@@ -49,7 +49,7 @@ function level1.reset() | |||||
planets[k] = nil | planets[k] = nil | ||||
end | end | ||||
local planetImage = love.graphics.newImage("entities/planet/planet" .. math.random(1, 18) .. ".png") | local planetImage = love.graphics.newImage("entities/planet/planet" .. math.random(1, 18) .. ".png") | ||||
table.insert(planets, planet(700, 200, 50, 0.3, planetImage)) | |||||
table.insert(planets, planet(700, 200, 50, 0.3, asteroidImage)) | |||||
shipsleft = 1 | shipsleft = 1 | ||||
shipIsHit = false | shipIsHit = false | ||||
firstShip.fuel = 25 | firstShip.fuel = 25 | ||||
@@ -31,7 +31,7 @@ function level2.load() | |||||
table.insert(guibutts, menu:addButton("To menu", function () | table.insert(guibutts, menu:addButton("To menu", function () | ||||
level2.goBack() | level2.goBack() | ||||
end)) | end)) | ||||
table.insert(planets, planet(700, 500, 50, 0.3, planetImage, "nodelete")) | |||||
table.insert(planets, planet(700, 500, 50, 0.3, asteroidImage, "nodelete")) | |||||
end | end | ||||
function level2.reset() | function level2.reset() | ||||
firstShip:reset() | firstShip:reset() | ||||
@@ -40,7 +40,7 @@ function level2.reset() | |||||
end | end | ||||
firstShip.fuel = 50 | firstShip.fuel = 50 | ||||
local planetImage = love.graphics.newImage("entities/planet/planet" .. math.random(1, 18) .. ".png") | local planetImage = love.graphics.newImage("entities/planet/planet" .. math.random(1, 18) .. ".png") | ||||
table.insert(planets, planet(700, 500, 50, 0.3, planetImage)) | |||||
table.insert(planets, planet(700, 500, 50, 0.3, asteroidImage)) | |||||
shipsleft = 1 | shipsleft = 1 | ||||
shipIsHit = false | shipIsHit = false | ||||
planetsleft = 3 | planetsleft = 3 | ||||
@@ -31,9 +31,9 @@ function level3.load() | |||||
table.insert(guibutts, menu:addButton("To menu", function () | table.insert(guibutts, menu:addButton("To menu", function () | ||||
levelgeneral.goBack() | levelgeneral.goBack() | ||||
end)) | end)) | ||||
table.insert(planets, planet(900, 400, 50, 0.3, planetImage, "nodelete")) | |||||
table.insert(planets, planet(700, 300, 50, 0.3, planetImage, "nodelete")) | |||||
table.insert(planets, planet(900, 200, 50, 0.3, planetImage, "nodelete")) | |||||
table.insert(planets, planet(900, 400, 50, 0.3, asteroidImage, "nodelete")) | |||||
table.insert(planets, planet(700, 300, 50, 0.3, asteroidImage, "nodelete")) | |||||
table.insert(planets, planet(900, 200, 50, 0.3, asteroidImage, "nodelete")) | |||||
end | end | ||||
function level3.hint() | function level3.hint() | ||||
GUIDraw("left") | GUIDraw("left") | ||||
@@ -57,6 +57,7 @@ function level3.reset() | |||||
firstShip.fuel = 75 | firstShip.fuel = 75 | ||||
shipIsHit = false | shipIsHit = false | ||||
planetsleft = 3 | planetsleft = 3 | ||||
end | end | ||||
function level3.GUIControl() | function level3.GUIControl() | ||||
if (love.keyboard.isDown('a') and VCAM.x > WINDOW_WIDTH/2) then | if (love.keyboard.isDown('a') and VCAM.x > WINDOW_WIDTH/2) then | ||||
@@ -31,8 +31,8 @@ function level4.load() | |||||
table.insert(guibutts, menu:addButton("To menu", function () | table.insert(guibutts, menu:addButton("To menu", function () | ||||
levelgeneral.goBack() | levelgeneral.goBack() | ||||
end)) | end)) | ||||
table.insert(planets, planet(-200, 400, 50, 0.3, planetImage, "nodelete")) | |||||
table.insert(planets, planet(-200, 200, 50, 0.3, planetImage, "nodelete")) | |||||
table.insert(planets, planet(-200, 400, 50, 0.3, asteroidImage, "nodelete")) | |||||
table.insert(planets, planet(-200, 200, 50, 0.3, asteroidImage, "nodelete")) | |||||
end | end | ||||
function level4.reset() | function level4.reset() | ||||
@@ -4,7 +4,7 @@ local M = {} | |||||
function level5.load() | function level5.load() | ||||
shipsleft = 1 | shipsleft = 1 | ||||
local planetImage = love.graphics.newImage("entities/planet/planet" .. math.random(1, 18) .. ".png") | local planetImage = love.graphics.newImage("entities/planet/planet" .. math.random(1, 18) .. ".png") | ||||
planetsleft = 5 | |||||
planetsleft = 10 | |||||
gameStatus = "setup" | gameStatus = "setup" | ||||
playbutts = {} | playbutts = {} | ||||
guibutts = {} | guibutts = {} | ||||
@@ -31,9 +31,9 @@ function level5.load() | |||||
table.insert(guibutts, menu:addButton("To menu", function () | table.insert(guibutts, menu:addButton("To menu", function () | ||||
levelgeneral.goBack() | levelgeneral.goBack() | ||||
end)) | end)) | ||||
table.insert(planets, planet(0, 2000, 50, 0.3, planetImage, "nodelete")) | |||||
table.insert(planets, planet(100, 2000, 50, 0.3, planetImage, "nodelete")) | |||||
table.insert(planets, planet(50, 1700, 50, 0.3, planetImage, "nodelete")) | |||||
table.insert(planets, planet(0, 2000, 50, 0.3, asteroidImage, "nodelete")) | |||||
table.insert(planets, planet(100, 2000, 50, 0.3, asteroidImage, "nodelete")) | |||||
table.insert(planets, planet(50, 1700, 50, 0.3, asteroidImage, "nodelete")) | |||||
end | end | ||||
function level5.reset() | function level5.reset() | ||||
@@ -47,7 +47,7 @@ function level5.reset() | |||||
shipsleft = 1 | shipsleft = 1 | ||||
firstShip.fuel = 100 | firstShip.fuel = 100 | ||||
shipIsHit = false | shipIsHit = false | ||||
planetsleft = 5 | |||||
planetsleft = 10 | |||||
end | end | ||||
function level5.GUIControl() | function level5.GUIControl() | ||||
if (love.keyboard.isDown('w') and VCAM.y > -WINDOW_WIDTH) then | if (love.keyboard.isDown('w') and VCAM.y > -WINDOW_WIDTH) then | ||||
@@ -4,6 +4,7 @@ local M = {} | |||||
local thrusterMax = 0 | local thrusterMax = 0 | ||||
local animationComplete = false | local animationComplete = false | ||||
local frame = 0 | local frame = 0 | ||||
asteroidImage = love.graphics.newImage("entities/planet/asteroid.png") | |||||
function levelgeneral.update(dt) | function levelgeneral.update(dt) | ||||
if not levelLoaded then | if not levelLoaded then | ||||
level = require("levels/level" .. currentLevel) | level = require("levels/level" .. currentLevel) | ||||
@@ -81,6 +82,7 @@ function levelgeneral.draw() | |||||
love.graphics.clear(0,0,0,1) | love.graphics.clear(0,0,0,1) | ||||
love.graphics.setColor(30/255, 30/255, 30/255, 1) | love.graphics.setColor(30/255, 30/255, 30/255, 1) | ||||
if frame < WINDOW_WIDTH then | if frame < WINDOW_WIDTH then | ||||
sounds["finish"]:play() | |||||
love.graphics.circle("fill", firstShip.x, firstShip.y, WINDOW_WIDTH - frame) | love.graphics.circle("fill", firstShip.x, firstShip.y, WINDOW_WIDTH - frame) | ||||
end | end | ||||
frame = frame + 20 | frame = frame + 20 | ||||
@@ -1,6 +1,7 @@ | |||||
practice = Class{} | practice = Class{} | ||||
local levelLoaded = false | local levelLoaded = false | ||||
local M = {} | local M = {} | ||||
local currenctScore = 0 | |||||
function practice.update(dt) | function practice.update(dt) | ||||
if not levelLoaded then | if not levelLoaded then | ||||
shipsleft = 1 | shipsleft = 1 | ||||
@@ -9,7 +10,10 @@ function practice.update(dt) | |||||
playbutts = {} | playbutts = {} | ||||
guibutts = {} | guibutts = {} | ||||
XCAM = 0 | XCAM = 0 | ||||
currentScore = 0 | |||||
thrusterMax = 0 | |||||
YCAM = 0 | YCAM = 0 | ||||
firstShip.fuel = 0 | |||||
explosions = {} | explosions = {} | ||||
shipIsHit = false | shipIsHit = false | ||||
guimenu = mainMenu() | guimenu = mainMenu() | ||||
@@ -31,7 +35,6 @@ function practice.update(dt) | |||||
levelLoaded = true | levelLoaded = true | ||||
end | end | ||||
camera:update(dt) | camera:update(dt) | ||||
--print(camera.x .. " " .. camera.y) | --print(camera.x .. " " .. camera.y) | ||||
for i, explosion in ipairs(explosions) do | for i, explosion in ipairs(explosions) do | ||||
explosion:update(dt) | explosion:update(dt) | ||||
@@ -54,6 +57,7 @@ function practice.update(dt) | |||||
for i in ipairs(planets) do | for i in ipairs(planets) do | ||||
planets[i]:update(dt) | planets[i]:update(dt) | ||||
end | end | ||||
currentScore = currentScore + math.sqrt(firstShip.dx^2 + firstShip.dy^2) | |||||
else | else | ||||
camera:follow(VCAM.x, VCAM.y) | camera:follow(VCAM.x, VCAM.y) | ||||
end | end | ||||
@@ -81,7 +85,10 @@ function practice.draw() | |||||
if gameStatus == "setup" then | if gameStatus == "setup" then | ||||
GUIDraw("anywhere") | GUIDraw("anywhere") | ||||
practice.hint() | |||||
elseif gameStatus == "play" then | elseif gameStatus == "play" then | ||||
local textW = tinyfont:getWidth("Score: " .. math.floor(currentScore/100)) | |||||
love.graphics.print("Score: " .. math.floor(currentScore/100), WINDOW_WIDTH/2-textW/2, 10) | |||||
guimenu:butt(playbutts, WINDOW_WIDTH, WINDOW_HEIGHT, 1100, WINDOW_HEIGHT-50, 40, WINDOW_WIDTH/3) | guimenu:butt(playbutts, WINDOW_WIDTH, WINDOW_HEIGHT, 1100, WINDOW_HEIGHT-50, 40, WINDOW_WIDTH/3) | ||||
love.keyboard.mouseisReleased = false | love.keyboard.mouseisReleased = false | ||||
end | end | ||||
@@ -102,8 +109,13 @@ function practice.reset() | |||||
planets[k] = nil | planets[k] = nil | ||||
end | end | ||||
shipsleft = 1 | shipsleft = 1 | ||||
if currentScore > saveData.score then | |||||
saveData.score = currentScore | |||||
end | |||||
currentScore = 0 | |||||
shipIsHit = false | shipIsHit = false | ||||
planetsleft = 10 | planetsleft = 10 | ||||
firstShip.fuel = 99999 | |||||
end | end | ||||
function practice.GUIControl() | function practice.GUIControl() | ||||
if (love.keyboard.isDown('w')) then | if (love.keyboard.isDown('w')) then | ||||
@@ -125,6 +137,8 @@ function practice.hint() | |||||
love.graphics.print("↓[S]",50,100) | love.graphics.print("↓[S]",50,100) | ||||
love.graphics.print("←[A]",10,50) | love.graphics.print("←[A]",10,50) | ||||
love.graphics.print("→[D]",100,50) | love.graphics.print("→[D]",100,50) | ||||
end | end | ||||
return practice | return practice |
@@ -15,7 +15,8 @@ OFFSET_Y = 0 | |||||
currentLevel = 0 | currentLevel = 0 | ||||
saveData = { | saveData = { | ||||
levelsBeaten = 0 | |||||
levelsBeaten = 0, | |||||
score = 0 | |||||
} | } | ||||
planets = {} | planets = {} | ||||
@@ -45,6 +45,7 @@ function GUIDraw(mode) | |||||
love.keyboard.mouseisReleased = false | love.keyboard.mouseisReleased = false | ||||
firstShip.x = vmx | firstShip.x = vmx | ||||
firstShip.y = vmy | firstShip.y = vmy | ||||
sounds["appear"]:play() | |||||
shipsleft = shipsleft - 1 | shipsleft = shipsleft - 1 | ||||
end | end | ||||
if shipsleft == 0 then | if shipsleft == 0 then | ||||
@@ -11,6 +11,7 @@ require 'src/GUI' | |||||
require 'stateMachine' | require 'stateMachine' | ||||
require 'entities/base/base' | require 'entities/base/base' | ||||
require 'entities/camera/VCAM' | require 'entities/camera/VCAM' | ||||
require 'src/musicController' | |||||
tick = require 'src/tick' | tick = require 'src/tick' | ||||
utf8 = require("utf8") | utf8 = require("utf8") | ||||
serialize = require 'src/ser' | serialize = require 'src/ser' |
@@ -15,7 +15,7 @@ function mainMenu:butt(buttons, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, locationx, locati | |||||
local my = my * DIFFERENCE_Y | local my = my * DIFFERENCE_Y | ||||
local hot = (mx > ev_bx and mx < ev_bx + ev_button_width and my > ev_by and my < ev_by + ev_BUTTON_HEIGHT) and i | local hot = (mx > ev_bx and mx < ev_bx + ev_button_width and my > ev_by and my < ev_by + ev_BUTTON_HEIGHT) and i | ||||
if (hot == i) then | if (hot == i) then | ||||
color = {10, 10, 0, 255} | |||||
color = {10/255, 10/255, 10/255, 255} | |||||
end | end | ||||
button.now = love.keyboard.mouseisReleased | button.now = love.keyboard.mouseisReleased | ||||
if location == "android" then | if location == "android" then | ||||
@@ -24,6 +24,7 @@ function mainMenu:butt(buttons, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, locationx, locati | |||||
if button.now and hot == i then | if button.now and hot == i then | ||||
love.keyboard.mouseisReleased = false | love.keyboard.mouseisReleased = false | ||||
button.fn() | button.fn() | ||||
musicController("click") | |||||
hot = false | hot = false | ||||
break | break | ||||
end | end | ||||
@@ -36,7 +37,10 @@ function mainMenu:butt(buttons, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, locationx, locati | |||||
love.graphics.rectangle("fill", ev_bx,ev_by, ev_button_width, ev_BUTTON_HEIGHT) | love.graphics.rectangle("fill", ev_bx,ev_by, ev_button_width, ev_BUTTON_HEIGHT) | ||||
love.graphics.setColor(0, 0, 0, 255) | love.graphics.setColor(0, 0, 0, 255) | ||||
local textW = smallfont:getWidth(button.text) | local textW = smallfont:getWidth(button.text) | ||||
local textH = smallfont:getHeight(button.text) | |||||
local textH = smallfont:getHeight(button.text) | |||||
if hot == i then | |||||
love.graphics.setColor(1,1,1,255) | |||||
end | |||||
love.graphics.print(button.text, smallfont, ev_bx + ev_button_width*0.5 - textW*0.5, ev_by+textH*0.5) | love.graphics.print(button.text, smallfont, ev_bx + ev_button_width*0.5 - textW*0.5, ev_by+textH*0.5) | ||||
love.graphics.setColor(255, 255, 255, 255) | love.graphics.setColor(255, 255, 255, 255) | ||||
cursor_y = cursor_y + (ev_BUTTON_HEIGHT + margin) | cursor_y = cursor_y + (ev_BUTTON_HEIGHT + margin) | ||||
@@ -0,0 +1,35 @@ | |||||
sounds = { | |||||
["menu"] = love.audio.newSource("entities/music/menu.ogg", "static"), | |||||
["boom"] = love.audio.newSource("entities/planet/boom.wav", "static"), | |||||
["close"] = love.audio.newSource("entities/planet/close.wav", "static"), | |||||
["play"] = love.audio.newSource("entities/music/play.wav", "static"), | |||||
["appear"] = love.audio.newSource("entities/ship/Appear.wav", "static"), | |||||
["finish"] = love.audio.newSource("entities/ship/Finish.wav", "static") | |||||
} | |||||
mute = false | |||||
function musicController(orders, toggling) | |||||
if (orders == 'norm' and not mute) then | |||||
if (gameState == 'menu' or gameState == "selectlv") then | |||||
sounds['menu']:play() | |||||
elseif gameStatus == 'play' then | |||||
stopSounds() | |||||
sounds["play"]:play() | |||||
end | |||||
elseif orders == "mute" then | |||||
if toggling == 1 then | |||||
mute = true | |||||
else | |||||
mute = false | |||||
end | |||||
elseif orders == "click" then | |||||
-- print("entities/camera/button0" .. math.random(1, 5)..".mp3.flac") | |||||
local tempClick = love.audio.newSource("entities/camera/button0" .. math.random(1, 5)..".mp3.flac", "static") | |||||
tempClick:play() | |||||
end | |||||
end | |||||
function stopSounds() | |||||
for i, sound in ipairs(sounds) do | |||||
sound[i]:stop() | |||||
print("stopping sounds") | |||||
end | |||||
end |
@@ -6,6 +6,7 @@ function stateUpdate(dt) | |||||
if love.keyboard.isDown('escape') then | if love.keyboard.isDown('escape') then | ||||
love.event.quit() | love.event.quit() | ||||
end | end | ||||
musicController("norm") | |||||
end | end | ||||