@@ -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.path = {} | |||
self.dottimer = 0.5 | |||
self.fuel = 0 | |||
end | |||
function ship:newPathDot(dotx, doty) | |||
return { | |||
@@ -28,7 +29,7 @@ function ship:update(dt) | |||
self.dottimer = self.dottimer - dt | |||
if self.dottimer < 0 then | |||
table.insert(self.path, self:newPathDot(self.x, self.y)) | |||
self.dottimer = 0.5 | |||
self.dottimer = 0.2 | |||
end | |||
if love.timer.getFPS() < 20 then | |||
self.path = {} | |||
@@ -38,15 +39,16 @@ function ship:update(dt) | |||
if self.dx ~= 0 then | |||
self.vector = math.atan( self.dy/ self.dx) | |||
end | |||
if love.keyboard.isDown('s') then | |||
--[[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') 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 = self.speed + 0.5 | |||
self.dx = math.cos(self.vector) * self.speed | |||
@@ -3,6 +3,8 @@ local levelLoaded = false | |||
local M = {} | |||
function level1.load() | |||
shipsleft = 1 | |||
thrusterMax = 50 | |||
firstShip.fuel = 50 | |||
local planetImage = love.graphics.newImage("entities/planet/planet" .. math.random(1, 18) .. ".png") | |||
planetsleft = 3 | |||
gameStatus = "setup" | |||
@@ -27,9 +29,9 @@ function level1.load() | |||
end | |||
)) | |||
table.insert(guibutts, menu:addButton("To menu", function () | |||
level1.goBack() | |||
level.goBack() | |||
end)) | |||
table.insert(planets, planet(700, 200, 50, 0.3, planetImage, "nodelete")) | |||
-- table.insert(planets, planet(700, 200, 50, 0.3, planetImage, "nodelete")) | |||
end | |||
function level1.reset() | |||
firstShip:reset() | |||
@@ -40,6 +42,7 @@ function level1.reset() | |||
table.insert(planets, planet(700, 200, 50, 0.3, planetImage)) | |||
shipsleft = 1 | |||
shipIsHit = false | |||
firstShip.fuel = 50 | |||
planetsleft = 3 | |||
end | |||
function level1.GUIControl() | |||
@@ -50,5 +53,8 @@ function level1.GUIControl() | |||
VCAM.x = VCAM.x + 10 | |||
end | |||
end | |||
function level1.goBack() | |||
levelgeneral.goBack() | |||
end | |||
return level1 | |||
@@ -5,6 +5,8 @@ function level2.load() | |||
shipsleft = 1 | |||
local planetImage = love.graphics.newImage("entities/planet/planet" .. math.random(1, 18) .. ".png") | |||
planetsleft = 3 | |||
thrusterMax = 100 | |||
firstShip.fuel = 100 | |||
gameStatus = "setup" | |||
playbutts = {} | |||
guibutts = {} | |||
@@ -36,6 +38,7 @@ function level2.reset() | |||
for k in pairs(planets) do | |||
planets[k] = nil | |||
end | |||
firstShip.fuel = 100 | |||
local planetImage = love.graphics.newImage("entities/planet/planet" .. math.random(1, 18) .. ".png") | |||
table.insert(planets, planet(700, 500, 50, 0.3, planetImage)) | |||
shipsleft = 1 | |||
@@ -50,5 +53,8 @@ function level2.GUIControl() | |||
VCAM.x = VCAM.x + 10 | |||
end | |||
end | |||
function level2.goBack() | |||
levelgeneral.goBack() | |||
end | |||
return level2 | |||
@@ -7,6 +7,8 @@ function level3.load() | |||
planetsleft = 3 | |||
gameStatus = "setup" | |||
playbutts = {} | |||
thrusterMax = 150 | |||
firstShip.fuel = 150 | |||
guibutts = {} | |||
VCAM.x, VCAM.y = WINDOW_WIDTH/2, WINDOW_HEIGHT/2 | |||
explosions = {} | |||
@@ -43,6 +45,7 @@ function level3.reset() | |||
end | |||
local planetImage = love.graphics.newImage("entities/planet/planet" .. math.random(1, 18) .. ".png") | |||
shipsleft = 1 | |||
firstShip.fuel = 150 | |||
shipIsHit = false | |||
planetsleft = 3 | |||
end | |||
@@ -54,5 +57,8 @@ function level3.GUIControl() | |||
VCAM.x = VCAM.x + 10 | |||
end | |||
end | |||
function level3.goBack() | |||
levelgeneral.goBack() | |||
end | |||
return level3 | |||
@@ -8,12 +8,14 @@ function level4.load() | |||
gameStatus = "setup" | |||
playbutts = {} | |||
guibutts = {} | |||
thrusterMax = 200 | |||
firstShip.fuel = 200 | |||
VCAM.x, VCAM.y = WINDOW_WIDTH/2, WINDOW_HEIGHT/2 | |||
explosions = {} | |||
shipIsHit = false | |||
guimenu = mainMenu() | |||
reachedGoal = false | |||
lvlbase = base(400, 300) | |||
lvlbase = base(-300, 300) | |||
levelLoaded = true | |||
table.insert(playbutts, menu:addButton("Return to setup", function() | |||
gameStatus = "setup" | |||
@@ -29,9 +31,8 @@ function level4.load() | |||
table.insert(guibutts, menu:addButton("To menu", function () | |||
levelgeneral.goBack() | |||
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 | |||
function level4.reset() | |||
@@ -43,16 +44,20 @@ function level4.reset() | |||
end | |||
local planetImage = love.graphics.newImage("entities/planet/planet" .. math.random(1, 18) .. ".png") | |||
shipsleft = 1 | |||
firstShip.fuel = 200 | |||
shipIsHit = false | |||
planetsleft = 3 | |||
end | |||
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 | |||
end | |||
if (love.keyboard.isDown('d')) then | |||
if (love.keyboard.isDown('d') and VCAM.x < WINDOW_WIDTH*2) then | |||
VCAM.x = VCAM.x + 10 | |||
end | |||
end | |||
function level4.goBack() | |||
levelgeneral.goBack() | |||
end | |||
return level4 | |||
@@ -1,19 +1,29 @@ | |||
levelgeneral = Class{} | |||
local levelLoaded = false | |||
local M = {} | |||
local thrusterMax = 0 | |||
local animationComplete = false | |||
local frame = 0 | |||
function levelgeneral.update(dt) | |||
if not levelLoaded then | |||
level = require("levels/level" .. currentLevel) | |||
level.load() | |||
frame = 0 | |||
animationComplete = false | |||
levelLoaded = true | |||
end | |||
if reachedGoal then | |||
if love.keyboard.isDown('return') then | |||
animationComplete = true | |||
end | |||
if saveData.levelsBeaten < currentLevel then | |||
saveData.levelsBeaten = currentLevel | |||
end | |||
--print("saveData.levelsBeaten is " .. saveData.levelsBeaten) | |||
if animationComplete then | |||
love.filesystem.write("save", serialize(saveData)) | |||
levelgeneral.goBack() | |||
end | |||
end | |||
camera:update(dt) | |||
if lvlbase ~= nil then | |||
@@ -47,13 +57,13 @@ else | |||
end | |||
levelgeneral.GUIControl() | |||
end | |||
function levelgeneral.draw() | |||
love.graphics.setColor(1,1,1,1) | |||
camera:attach() | |||
firstShip:draw() | |||
if lvlbase ~= nil then | |||
lvlbase:draw() | |||
end | |||
@@ -67,14 +77,37 @@ function levelgeneral.draw() | |||
--print("exploding") | |||
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: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") | |||
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) | |||
end | |||
end | |||
@@ -22,6 +22,14 @@ table.insert(levels, menu:addButton("Level 2", function () | |||
currentLevel = 3 | |||
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 | |||
local shipW = shipImage:getWidth() | |||
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) | |||
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 | |||
love.keyboard.mouseisReleased = false | |||
firstShip.x = 250 | |||