@@ -0,0 +1,118 @@ | |||||
ship = Class{} | |||||
function ship:init(x, y, image) | |||||
self.x = x | |||||
self.y = y | |||||
self.ox = x | |||||
self.oy = y | |||||
self.dy = 0 | |||||
self.dx = 5 | |||||
self.image = love.graphics.newImage(image) | |||||
self.width = self.image:getWidth() | |||||
self.height = self.image:getHeight() | |||||
self.rotation = 1.5708 | |||||
self.vector = 1.5708 | |||||
self.color = {1,1,1,1} | |||||
self.path = {} | |||||
self.dottimer = 0.5 | |||||
self.fuel = 0 | |||||
end | |||||
function ship:newPathDot(dotx, doty) | |||||
return { | |||||
x = dotx, | |||||
y = doty | |||||
} | |||||
end | |||||
function ship:update(dt) | |||||
if not shipIsHit then | |||||
self.dottimer = self.dottimer - dt | |||||
if self.dottimer < 0 then | |||||
table.insert(self.path, self:newPathDot(self.x, self.y)) | |||||
self.dottimer = 0.2 | |||||
end | |||||
if love.timer.getFPS() < 20 then | |||||
self.path = {} | |||||
end | |||||
self.x = self.x + self.dx/2 | |||||
self.y = self.y + self.dy/2 | |||||
if self.dx ~= 0 then | |||||
self.vector = math.atan( self.dy/ self.dx) | |||||
end | |||||
--[[if love.keyboard.isDown('s') then | |||||
self.speed = math.sqrt(self.dx^2 + self.dy^2) | |||||
if self.speed > 0 then | |||||
self.speed = self.speed - 0.5 | |||||
end | |||||
self.dx = math.cos(self.vector) * self.speed | |||||
self.dy = math.sin(self.vector) * self.speed | |||||
end ]]-- | |||||
if love.keyboard.isDown('w') and self.fuel > 0 then | |||||
self.fuel = self.fuel - 0.5 | |||||
self.speed = math.sqrt(self.dx^2 + self.dy^2) | |||||
self.speed = self.speed + 0.5 | |||||
self.dx = math.cos(self.vector) * self.speed | |||||
self.dy = math.sin(self.vector) * self.speed | |||||
end | |||||
--[[ | |||||
if love.keyboard.isDown('left') then | |||||
self.dx = self.dx - 0.5 | |||||
end | |||||
if love.keyboard.isDown('right') then | |||||
self.dx = self.dx + 0.5 | |||||
end | |||||
if love.keyboard.isDown('up') then | |||||
self.dy = self.dy - 0.5 | |||||
end | |||||
if love.keyboard.isDown('down') then | |||||
self.dy = self.dy + 0.5 | |||||
end | |||||
]]-- | |||||
--print(self.speed) | |||||
--[[ | |||||
if love.keyboard.isDown('right') then | |||||
self.rotation = self.rotation + 10 | |||||
elseif love.keyboard.isDown('left') then | |||||
self.rotation = self.rotation - 10 | |||||
end]]-- | |||||
--print("rotation:" .. self.rotation) | |||||
--print("speed:" .. self.dx .. " " .. self.dy) | |||||
if self.dx < 0 then | |||||
self.vector = self.vector - 3.14159 | |||||
end | |||||
self.vector = self.vector + 1.5708 | |||||
end | |||||
end | |||||
function ship:draw() | |||||
-- Draw the `self.canvas` to screen | |||||
love.graphics.setColor(unpack(self.color)) | |||||
--print("DAW" .. camera.x) | |||||
love.graphics.draw(self.image, self.x, self.y, self.vector, 1, 1, self.width/2, self.height/2) | |||||
for i in ipairs(self.path) do | |||||
if i > 1 then | |||||
love.graphics.setColor(0.9,0.9,0.9,1) | |||||
--print("DOING".. i) | |||||
love.graphics.line(self.path[i].x, self.path[i].y, self.path[i-1].x, self.path[i-1].y) | |||||
end | |||||
end | |||||
love.graphics.setColor(1,1,1,1) | |||||
end | |||||
function ship:reset() | |||||
self.x = self.ox | |||||
self.y = self.oy | |||||
self.dy = 0 | |||||
self.dx = 5 | |||||
self.rotation = 1.57 | |||||
self.canvas = love.graphics.newCanvas(WINDOW_WIDTH, WINDOW_HEIGHT) | |||||
self.vector = 1.56 | |||||
self.speed = 0 | |||||
self.path = {} | |||||
self.dottimer = 0.5 | |||||
end |
@@ -16,6 +16,7 @@ self.vector = 1.5708 | |||||
self.color = {1,1,1,1} | self.color = {1,1,1,1} | ||||
self.path = {} | self.path = {} | ||||
self.dottimer = 0.5 | self.dottimer = 0.5 | ||||
self.fuel = 0 | |||||
end | end | ||||
function ship:newPathDot(dotx, doty) | function ship:newPathDot(dotx, doty) | ||||
return { | return { | ||||
@@ -28,7 +29,7 @@ function ship:update(dt) | |||||
self.dottimer = self.dottimer - dt | self.dottimer = self.dottimer - dt | ||||
if self.dottimer < 0 then | if self.dottimer < 0 then | ||||
table.insert(self.path, self:newPathDot(self.x, self.y)) | table.insert(self.path, self:newPathDot(self.x, self.y)) | ||||
self.dottimer = 0.5 | |||||
self.dottimer = 0.2 | |||||
end | end | ||||
if love.timer.getFPS() < 20 then | if love.timer.getFPS() < 20 then | ||||
self.path = {} | self.path = {} | ||||
@@ -38,15 +39,16 @@ function ship:update(dt) | |||||
if self.dx ~= 0 then | if self.dx ~= 0 then | ||||
self.vector = math.atan( self.dy/ self.dx) | self.vector = math.atan( self.dy/ self.dx) | ||||
end | end | ||||
if love.keyboard.isDown('s') then | |||||
--[[if love.keyboard.isDown('s') then | |||||
self.speed = math.sqrt(self.dx^2 + self.dy^2) | self.speed = math.sqrt(self.dx^2 + self.dy^2) | ||||
if self.speed > 0 then | if self.speed > 0 then | ||||
self.speed = self.speed - 0.5 | self.speed = self.speed - 0.5 | ||||
end | end | ||||
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 | |||||
if love.keyboard.isDown('w') then | |||||
end ]]-- | |||||
if love.keyboard.isDown('w') and self.fuel > 0 then | |||||
self.fuel = self.fuel - 0.5 | |||||
self.speed = math.sqrt(self.dx^2 + self.dy^2) | self.speed = math.sqrt(self.dx^2 + self.dy^2) | ||||
self.speed = self.speed + 0.5 | self.speed = self.speed + 0.5 | ||||
self.dx = math.cos(self.vector) * self.speed | self.dx = math.cos(self.vector) * self.speed | ||||
@@ -3,6 +3,8 @@ local levelLoaded = false | |||||
local M = {} | local M = {} | ||||
function level1.load() | function level1.load() | ||||
shipsleft = 1 | shipsleft = 1 | ||||
thrusterMax = 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") | ||||
planetsleft = 3 | planetsleft = 3 | ||||
gameStatus = "setup" | gameStatus = "setup" | ||||
@@ -27,9 +29,9 @@ function level1.load() | |||||
end | end | ||||
)) | )) | ||||
table.insert(guibutts, menu:addButton("To menu", function () | table.insert(guibutts, menu:addButton("To menu", function () | ||||
level1.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, planetImage, "nodelete")) | |||||
end | end | ||||
function level1.reset() | function level1.reset() | ||||
firstShip:reset() | firstShip:reset() | ||||
@@ -40,6 +42,7 @@ function level1.reset() | |||||
table.insert(planets, planet(700, 200, 50, 0.3, planetImage)) | table.insert(planets, planet(700, 200, 50, 0.3, planetImage)) | ||||
shipsleft = 1 | shipsleft = 1 | ||||
shipIsHit = false | shipIsHit = false | ||||
firstShip.fuel = 50 | |||||
planetsleft = 3 | planetsleft = 3 | ||||
end | end | ||||
function level1.GUIControl() | function level1.GUIControl() | ||||
@@ -50,5 +53,8 @@ function level1.GUIControl() | |||||
VCAM.x = VCAM.x + 10 | VCAM.x = VCAM.x + 10 | ||||
end | end | ||||
end | end | ||||
function level1.goBack() | |||||
levelgeneral.goBack() | |||||
end | |||||
return level1 | return level1 | ||||
@@ -5,6 +5,8 @@ function level2.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 = 3 | planetsleft = 3 | ||||
thrusterMax = 100 | |||||
firstShip.fuel = 100 | |||||
gameStatus = "setup" | gameStatus = "setup" | ||||
playbutts = {} | playbutts = {} | ||||
guibutts = {} | guibutts = {} | ||||
@@ -36,6 +38,7 @@ function level2.reset() | |||||
for k in pairs(planets) do | for k in pairs(planets) do | ||||
planets[k] = nil | planets[k] = nil | ||||
end | end | ||||
firstShip.fuel = 100 | |||||
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, planetImage)) | ||||
shipsleft = 1 | shipsleft = 1 | ||||
@@ -50,5 +53,8 @@ function level2.GUIControl() | |||||
VCAM.x = VCAM.x + 10 | VCAM.x = VCAM.x + 10 | ||||
end | end | ||||
end | end | ||||
function level2.goBack() | |||||
levelgeneral.goBack() | |||||
end | |||||
return level2 | return level2 | ||||
@@ -7,6 +7,8 @@ function level3.load() | |||||
planetsleft = 3 | planetsleft = 3 | ||||
gameStatus = "setup" | gameStatus = "setup" | ||||
playbutts = {} | playbutts = {} | ||||
thrusterMax = 150 | |||||
firstShip.fuel = 150 | |||||
guibutts = {} | guibutts = {} | ||||
VCAM.x, VCAM.y = WINDOW_WIDTH/2, WINDOW_HEIGHT/2 | VCAM.x, VCAM.y = WINDOW_WIDTH/2, WINDOW_HEIGHT/2 | ||||
explosions = {} | explosions = {} | ||||
@@ -43,6 +45,7 @@ function level3.reset() | |||||
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") | ||||
shipsleft = 1 | shipsleft = 1 | ||||
firstShip.fuel = 150 | |||||
shipIsHit = false | shipIsHit = false | ||||
planetsleft = 3 | planetsleft = 3 | ||||
end | end | ||||
@@ -54,5 +57,8 @@ function level3.GUIControl() | |||||
VCAM.x = VCAM.x + 10 | VCAM.x = VCAM.x + 10 | ||||
end | end | ||||
end | end | ||||
function level3.goBack() | |||||
levelgeneral.goBack() | |||||
end | |||||
return level3 | return level3 | ||||
@@ -8,12 +8,14 @@ function level4.load() | |||||
gameStatus = "setup" | gameStatus = "setup" | ||||
playbutts = {} | playbutts = {} | ||||
guibutts = {} | guibutts = {} | ||||
thrusterMax = 200 | |||||
firstShip.fuel = 200 | |||||
VCAM.x, VCAM.y = WINDOW_WIDTH/2, WINDOW_HEIGHT/2 | VCAM.x, VCAM.y = WINDOW_WIDTH/2, WINDOW_HEIGHT/2 | ||||
explosions = {} | explosions = {} | ||||
shipIsHit = false | shipIsHit = false | ||||
guimenu = mainMenu() | guimenu = mainMenu() | ||||
reachedGoal = false | reachedGoal = false | ||||
lvlbase = base(400, 300) | |||||
lvlbase = base(-300, 300) | |||||
levelLoaded = true | levelLoaded = true | ||||
table.insert(playbutts, menu:addButton("Return to setup", function() | table.insert(playbutts, menu:addButton("Return to setup", function() | ||||
gameStatus = "setup" | gameStatus = "setup" | ||||
@@ -29,9 +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(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(-200, 400, 50, 0.3, planetImage, "nodelete")) | |||||
table.insert(planets, planet(-200, 200, 50, 0.3, planetImage, "nodelete")) | |||||
end | end | ||||
function level4.reset() | function level4.reset() | ||||
@@ -43,16 +44,20 @@ function level4.reset() | |||||
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") | ||||
shipsleft = 1 | shipsleft = 1 | ||||
firstShip.fuel = 200 | |||||
shipIsHit = false | shipIsHit = false | ||||
planetsleft = 3 | planetsleft = 3 | ||||
end | end | ||||
function level4.GUIControl() | function level4.GUIControl() | ||||
if (love.keyboard.isDown('a') and VCAM.x > WINDOW_WIDTH/2) then | |||||
if (love.keyboard.isDown('a') and VCAM.x > -WINDOW_WIDTH) then | |||||
VCAM.x = VCAM.x - 10 | VCAM.x = VCAM.x - 10 | ||||
end | end | ||||
if (love.keyboard.isDown('d')) then | |||||
if (love.keyboard.isDown('d') and VCAM.x < WINDOW_WIDTH*2) then | |||||
VCAM.x = VCAM.x + 10 | VCAM.x = VCAM.x + 10 | ||||
end | end | ||||
end | end | ||||
function level4.goBack() | |||||
levelgeneral.goBack() | |||||
end | |||||
return level4 | return level4 | ||||
@@ -1,19 +1,29 @@ | |||||
levelgeneral = Class{} | levelgeneral = Class{} | ||||
local levelLoaded = false | local levelLoaded = false | ||||
local M = {} | local M = {} | ||||
local thrusterMax = 0 | |||||
local animationComplete = false | |||||
local frame = 0 | |||||
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) | ||||
level.load() | level.load() | ||||
frame = 0 | |||||
animationComplete = false | |||||
levelLoaded = true | levelLoaded = true | ||||
end | end | ||||
if reachedGoal then | if reachedGoal then | ||||
if love.keyboard.isDown('return') then | |||||
animationComplete = true | |||||
end | |||||
if saveData.levelsBeaten < currentLevel then | if saveData.levelsBeaten < currentLevel then | ||||
saveData.levelsBeaten = currentLevel | saveData.levelsBeaten = currentLevel | ||||
end | end | ||||
--print("saveData.levelsBeaten is " .. saveData.levelsBeaten) | --print("saveData.levelsBeaten is " .. saveData.levelsBeaten) | ||||
if animationComplete then | |||||
love.filesystem.write("save", serialize(saveData)) | love.filesystem.write("save", serialize(saveData)) | ||||
levelgeneral.goBack() | levelgeneral.goBack() | ||||
end | |||||
end | end | ||||
camera:update(dt) | camera:update(dt) | ||||
if lvlbase ~= nil then | if lvlbase ~= nil then | ||||
@@ -47,13 +57,13 @@ else | |||||
end | end | ||||
levelgeneral.GUIControl() | levelgeneral.GUIControl() | ||||
end | end | ||||
function levelgeneral.draw() | function levelgeneral.draw() | ||||
love.graphics.setColor(1,1,1,1) | love.graphics.setColor(1,1,1,1) | ||||
camera:attach() | camera:attach() | ||||
firstShip:draw() | |||||
if lvlbase ~= nil then | if lvlbase ~= nil then | ||||
lvlbase:draw() | lvlbase:draw() | ||||
end | end | ||||
@@ -67,14 +77,37 @@ function levelgeneral.draw() | |||||
--print("exploding") | --print("exploding") | ||||
end | end | ||||
end | end | ||||
if reachedGoal then | |||||
love.graphics.clear(0,0,0,1) | |||||
love.graphics.setColor(30/255, 30/255, 30/255, 1) | |||||
if frame < WINDOW_WIDTH then | |||||
love.graphics.circle("fill", firstShip.x, firstShip.y, WINDOW_WIDTH - frame) | |||||
end | |||||
frame = frame + 20 | |||||
end | |||||
firstShip:draw() | |||||
camera:detach() | camera:detach() | ||||
camera:draw() | camera:draw() | ||||
if gameStatus == "setup" then | |||||
if reachedGoal then | |||||
love.graphics.setColor(1,1,1,1-1/frame) | |||||
love.graphics.setFont(smallfont) | |||||
love.graphics.printf("Press Enter to continue",0, 600, WINDOW_WIDTH, "center") | |||||
end | |||||
if gameStatus == "setup" and not reachedGoal then | |||||
GUIDraw("left") | GUIDraw("left") | ||||
elseif gameStatus == "play" then | elseif gameStatus == "play" then | ||||
if not reachedGoal then | |||||
love.graphics.printf("Thrusters: ", 0, WINDOW_HEIGHT-50, 600, "center") | |||||
local m = smallfont:getWidth("Thrusters: ") | |||||
local n = smallfont:getHeight("Thrusters: ") | |||||
love.graphics.setColor(1,0,0,1) | |||||
love.graphics.rectangle("fill",m + 100, WINDOW_HEIGHT-50, thrusterMax/2, n) | |||||
love.graphics.setColor(0,1,0,1) | |||||
love.graphics.rectangle("fill",m + 100, WINDOW_HEIGHT-50, firstShip.fuel/2, n) | |||||
love.graphics.setColor(1,1,1,1) | |||||
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) | ||||
end | |||||
end | end | ||||
@@ -22,6 +22,14 @@ table.insert(levels, menu:addButton("Level 2", function () | |||||
currentLevel = 3 | currentLevel = 3 | ||||
end | end | ||||
end )) | end )) | ||||
table.insert(levels, menu:addButton("Level 4", function () | |||||
if saveData.levelsBeaten > 2 then | |||||
menuLoaded = false | |||||
objReset() | |||||
gameState = "levelgeneral" | |||||
currentLevel = 4 | |||||
end | |||||
end )) | |||||
@@ -53,7 +53,14 @@ function GUIDraw(mode) | |||||
if selectedItem == "ship" and mx < menuX then | if selectedItem == "ship" and mx < menuX then | ||||
local shipW = shipImage:getWidth() | local shipW = shipImage:getWidth() | ||||
local shipH = shipImage:getHeight() | local shipH = shipImage:getHeight() | ||||
if VCAM.x > WINDOW_WIDTH/2-1 then | |||||
love.graphics.draw(shipImage,10,my, 1.5708, 1, 1, shipW/2, shipH/2) | love.graphics.draw(shipImage,10,my, 1.5708, 1, 1, shipW/2, shipH/2) | ||||
elseif VCAM.x > -WINDOW_WIDTH/2+(WINDOW_WIDTH-(menuX-firstShip.height/2)) then | |||||
local timex, timey = camera:toCameraCoords(250, 0) | |||||
love.graphics.draw(shipImage,timex,my, 1.5708, 1, 1, shipW/2, shipH/2) | |||||
else | |||||
love.graphics.draw(shipImage,menuX-firstShip.height/2,my, 1.5708, 1, 1, shipW/2, shipH/2) | |||||
end | |||||
if love.keyboard.mouseisReleased then | if love.keyboard.mouseisReleased then | ||||
love.keyboard.mouseisReleased = false | love.keyboard.mouseisReleased = false | ||||
firstShip.x = 250 | firstShip.x = 250 | ||||