diff --git a/data/settings.lua b/data/settings.lua index f1783b5..67243dc 100755 --- a/data/settings.lua +++ b/data/settings.lua @@ -2,7 +2,7 @@ settings = { zoom = { min = 0.0001, max = 4, - step = 0.01, + step = 0.05, reset = 0.0001 }, warp = { diff --git a/import.lua b/import.lua index 32b0f5a..a8deaea 100755 --- a/import.lua +++ b/import.lua @@ -13,10 +13,13 @@ texture = require "textures/textures" calc = require "src/calc" font = require "src/font" + + -- Game Classes: require "src/class/Player" require "src/class/Gui" require "src/class/Planet" +require "src/class/FX" -- Game Data: planetdata = require "data/planetdata" diff --git a/main.lua b/main.lua index d29fa18..a2754fd 100755 --- a/main.lua +++ b/main.lua @@ -25,6 +25,7 @@ function love.load() local spawnPlanet = planet[1] player = Player(spawnPlanet.x, spawnPlanet.y-spawnPlanet.r-1) gui = Gui(1) + effects = {} end @@ -62,7 +63,16 @@ function drawPlanets() end end - +function drawEffects() + for i=1, #effects do + effects[i]:draw() + end + for i, effect in ipairs(effects) do --Separate functions because if I remove something while processing it it WILL lead to an error + if effect.finished then + table.remove(effects, i) + end + end +end -- Camera @@ -75,10 +85,10 @@ function cameraControls() function love.wheelmoved(x, y) if y > 0 then -- Zoom in: - zoomlevel = zoomlevel + step + zoomlevel = zoomlevel + step*(zoomlevel*10) elseif y < 0 then -- Zoom out: - zoomlevel = zoomlevel - step + zoomlevel = zoomlevel - step*(zoomlevel*10) end end @@ -162,6 +172,7 @@ function love.draw() cam:attach() -- Game Objects: drawPlanets() + drawEffects() player:draw() -- Camera Zoom Player Location Indicator: OVERWORK SOON PLS KAY; IT UGLY diff --git a/src/calc.lua b/src/calc.lua index ca4cc81..8c67cb5 100755 --- a/src/calc.lua +++ b/src/calc.lua @@ -36,5 +36,20 @@ function calc.gPull(obj1, obj2) return grav end +-- Calculate closest space object to target: +function calc.closestObj(target) + local minDist = calc.distance(planet[1].x, planet[1].y, target.x, target.y)-planet[1].r + local minPlanet = planet[1] + for i, pla in ipairs(planet) do + if calc.distance(pla.x, pla.y, target.x, target.y)-pla.r < minDist then + minDist = calc.distance(pla.x, pla.y, target.x, target.y)-pla.r + minPlanet = pla + end + end + + return minPlanet + +end + return calc \ No newline at end of file diff --git a/src/class/FX.lua b/src/class/FX.lua new file mode 100755 index 0000000..73fe3f7 --- /dev/null +++ b/src/class/FX.lua @@ -0,0 +1,36 @@ +-- Effect object +FX = Class {} + +function FX:init(type, x, y, target) + self.type = type + self.id = #effects + self.frame = 0 + self.x = x + self.y = y + self.finished = false -- So that main can kill it later. For some reason it does not want to kill itself. + self.target = target +end + + +function FX:flash() + love.graphics.setColor(1,1,1,1-self.frame/1000) + love.graphics.circle("fill", self.x, self.y, self.frame) + self.frame = self.frame + 100/love.timer.getFPS() + --debug("Frame is " .. self.frame) + if self.frame > 500 then + self.target.exploding = false + self.target:reset() + end + if self.frame > 1000 then + self.finished = true + end +end + + + +function FX:draw() + debug("drawing flash") + if self.type == "flash" then + self:flash() + end +end \ No newline at end of file diff --git a/src/class/Player.lua b/src/class/Player.lua index 712e31c..4bb2520 100755 --- a/src/class/Player.lua +++ b/src/class/Player.lua @@ -26,6 +26,9 @@ function Player:init(tempX, tempY) -- Rotation: self.angle = calc.pi/2 + + -- Status: + self.exploding = false end @@ -70,36 +73,60 @@ function Player:reset() end function Player:flightControls() + -- Anti-clipping feature + local closestPla = calc.closestObj(player) + + -- Movement: local speedChange = self.speed * self.throttle - + -- Directional Thrust: if love.keyboard.isDown(controls.flight.thrust.up)then - self.ySpeed = self.ySpeed - speedChange - debug("Player control: up") + if (calc.distance(closestPla.x, closestPla.y, self.x, self.y) > calc.distance(closestPla.x, closestPla.y, self.x, self.y-10) and self:isLanded()) then + debug("Flying into a planet!") + else + self.ySpeed = self.ySpeed - speedChange + debug("Player control: up") + end end if love.keyboard.isDown(controls.flight.thrust.down) then - self.ySpeed = self.ySpeed + speedChange - debug("Player control: down") + if (calc.distance(closestPla.x, closestPla.y, self.x, self.y) > calc.distance(closestPla.x, closestPla.y, self.x, self.y+10) and self:isLanded()) then + debug("Flying into a planet!") + else + self.ySpeed = self.ySpeed + speedChange + debug("Player control: down") + end end if love.keyboard.isDown(controls.flight.thrust.left) then - self.xSpeed = self.xSpeed - speedChange - debug("Player control: left") + if (calc.distance(closestPla.x, closestPla.y, self.x, self.y) > calc.distance(closestPla.x, closestPla.y, self.x-10, self.y) and self:isLanded()) then + debug("Flying into a planet!") + else + self.xSpeed = self.xSpeed - speedChange + debug("Player control: left") + end end if love.keyboard.isDown(controls.flight.thrust.right) then - self.xSpeed = self.xSpeed + speedChange - debug("Player control: right") + if (calc.distance(closestPla.x, closestPla.y, self.x, self.y) > calc.distance(closestPla.x, closestPla.y, self.x+10, self.y) and self:isLanded()) then + debug("Flying into a planet!") + else + self.xSpeed = self.xSpeed + speedChange + debug("Player control: right") + end end -- Main Engine controls: if love.keyboard.isDown(controls.flight.thrust.engine) then - self.xSpeed = self.xSpeed + math.cos(self.angle) * speedChange - debug("Ship thrusters X: " .. math.cos(self.angle) .. " " .. math.sin(self.angle) .. " " .. self.angle) - self.ySpeed = self.ySpeed - math.sin(self.angle) * speedChange + if (calc.distance(closestPla.x, closestPla.y, self.x, self.y) > calc.distance(closestPla.x, closestPla.y, self.x+self.xSpeed + math.cos(self.angle) * speedChange*2, self.y+self.ySpeed - math.sin(self.angle) * speedChange*2) and self:isLanded()) then --Holy moly this is long + debug("Flying into a planet!") + else + self.xSpeed = self.xSpeed + math.cos(self.angle) * speedChange*2 + debug("Ship thrusters X: " .. math.cos(self.angle) .. " " .. math.sin(self.angle) .. " " .. self.angle) + self.ySpeed = self.ySpeed - math.sin(self.angle) * speedChange*2 + end end if love.keyboard.isDown(controls.flight.thrust.rotleft) then self.angle = self.angle + 1/love.timer.getFPS() @@ -127,21 +154,31 @@ function Player:getSpeed() return x+y end -function Player:isLanded() - local landed = false - for i=1, #planet do - local pla = planet[i] - if calc.distance(self.x, self.y, pla.x, pla.y) <= pla.r then - landed = true - end - end - -- Save Landing Speed: - if landed then - self.landingspeed = self:getSpeed() - --debug("Landing speed: "..self.landingspeed) - end +function Player:hasCrashed() --Testing function, see if a player is inside a planet + --debug(self.landingspeed) + if self.landingspeed > self.impacttolerance and not self.exploding then + -- Add explosion effect? + table.insert(effects, FX("flash", self.x, self.y, self)) + self.exploding = true + return + end +end - return landed +function Player:isLanded() + local landed = false + for i=1, #planet do + local pla = planet[i] + if calc.distance(self.x, self.y, pla.x, pla.y) <= pla.r then + landed = true + end + end + -- Save Landing Speed: + if landed then + self.landingspeed = self:getSpeed() + debug("Landing speed: "..self.landingspeed) + end + self:hasCrashed() + return landed end function Player:gravity() @@ -162,15 +199,17 @@ end function Player:update(dt) --debug(self.warpspeed) - + if self.angle > calc.pi*2 then self.angle = 0 elseif self.angle < 0 then self.angle = calc.pi*2 end - self:gravity() - self:flightControls() - self:updatePosition() + if not self.exploding then + self:gravity() + self:flightControls() + self:updatePosition() + end end function Player:draw() @@ -187,12 +226,14 @@ function Player:draw() -- Right Bottom x+dist, y+dist } - love.graphics.setColor(0.5, 0.5, 0.7) - love.graphics.polygon("fill", vertices) + if not self.exploding then + love.graphics.setColor(0.5, 0.5, 0.7) + love.graphics.polygon("fill", vertices) - love.graphics.setColor(1, 0, 0) - love.graphics.circle("fill", x, y, 5, 20) + love.graphics.setColor(1, 0, 0) + love.graphics.circle("fill", x, y, 5, 20) - -- Directional Circle (temporary until actual rotatable ship texture is made) - love.graphics.circle("fill", x+dist*(1/zoomlevel*2)*math.cos(self.angle), y-dist*(1/zoomlevel*2)*math.sin(self.angle), 1/zoomlevel*2) + -- Directional Circle (temporary until actual rotatable ship texture is made) + love.graphics.circle("fill", x+dist*(1/zoomlevel*2)*math.cos(self.angle), y-dist*(1/zoomlevel*2)*math.sin(self.angle), 1/zoomlevel*2) + end end \ No newline at end of file