作者 | SHA1 | 备注 | 提交日期 |
---|---|---|---|
Niro | fd64b84fcd | please work | 2 年前 |
Niro | 030e216bd6 | added broken textures, broken relative landing speed and something else i probably forgot | 2 年前 |
Madiwka |
b19d074d1f
|
Merge pull request #4 from NiroUwU/testing
Reworked gravity. added moons and stuff |
2 年前 |
Madiwka | b6738e3343 | Reworked gravity. added moons and stuff | 2 年前 |
@@ -29,7 +29,10 @@ controls = { | |||
reset = "-", | |||
down = ",", | |||
up = "." | |||
} | |||
}, | |||
-- Special | |||
special = "f" | |||
}, | |||
-- Player Camera Controls: | |||
@@ -1,19 +1,27 @@ | |||
planetdata = { | |||
{ | |||
x = 0, y = 0, | |||
r = 500000, m = 5e15, | |||
xSpeed = 0, ySpeed = 0, | |||
r = 500000, m = 1e12, | |||
xSpeed = 0, ySpeed = 100, | |||
name = "Testos", | |||
colour = {42, 04, 20}, | |||
parent = "star" | |||
}, | |||
{ | |||
x = 2000000, y = 0, | |||
r = 40000, m = 4e7, | |||
xSpeed = 0, ySpeed = 12000, | |||
r = 100000, m = 4e9, | |||
xSpeed = 0, ySpeed = 175, | |||
name = "Deez", | |||
colour = {50, 50, 50}, | |||
parent = 1 | |||
}, | |||
{ | |||
x = 2200000, y = 0, | |||
r = 10000, m = 1e4, | |||
xSpeed = 0, ySpeed = 35, | |||
name = "Ligos", | |||
colour = {10, 50, 20}, | |||
parent = 2 | |||
} | |||
} | |||
@@ -0,0 +1,14 @@ | |||
-- This is completely temporary, THIS WILL CHANGE | |||
starshipTypes = { | |||
orbiter = { | |||
name = "Classic Orbiter", | |||
description = "Dolor fugiat irure sit aliqua labore. Culpa voluptate occaecat anim exercitation proident sint ex dolor. Officia in labore sint Lorem ea. Ad minim aliqua aliqua non commodo qui in ea sit excepteur excepteur qui.", | |||
impacttolerance = 0.5, | |||
mass = 100000, -- idk, feels better but holy fuck thats a thicc ass boi xD | |||
speed = 0.05, | |||
specials = {"orbitSync"}, | |||
texture = texture.player.orbiter | |||
} | |||
} | |||
return starshipTypes |
@@ -5,9 +5,10 @@ require "libraries" | |||
-- General Data: | |||
info = require "data/info" | |||
texture = require "textures/textures" | |||
controls = require "data/controls" | |||
settings = require "data/settings" | |||
texture = require "textures/textures" | |||
starshipTypes = require "data/starshipTypes" | |||
-- Game Source: | |||
calc = require "src/calc" | |||
@@ -6,6 +6,7 @@ calc.isDebug = true | |||
function love.load() | |||
-- Declaration: | |||
love.window.setTitle(info.name.." - v"..info.version) | |||
--love.graphics.setDefaultFilter("nearest", "nearest") | |||
width, height = love.graphics.getDimensions() | |||
-- Camera: | |||
@@ -23,7 +24,8 @@ function love.load() | |||
loadPlanets() | |||
local spawnPlanet = planet[1] | |||
player = Player(spawnPlanet.x, spawnPlanet.y-spawnPlanet.r-1) | |||
player = Player(spawnPlanet.x, spawnPlanet.y-spawnPlanet.r-1, "orbiter") | |||
player.xSpeed, player.ySpeed = spawnPlanet.xSpeed, spawnPlanet.ySpeed | |||
gui = Gui(1) | |||
effects = {} | |||
end | |||
@@ -33,8 +35,7 @@ end | |||
function loadPlanets() | |||
debug("Planets in planet table: "..#planetdata) | |||
for i=1, #planetdata do | |||
local p = planetdata[i] | |||
for i, p in ipairs(planetdata) do | |||
debug(p.name.." is loading") | |||
table.insert(planet, i, | |||
Planet( | |||
@@ -0,0 +1,20 @@ | |||
-- THIS ENTIRE THING WILL NOT BE USED PROBABLY, JUST TESTING OUT POSSIBLE WAYS THIS COULD WORK | |||
Abilities = {} | |||
function Abilities.orbitSync() --Synchronise speed with closest orbit | |||
end | |||
function Abilities.update(dt) | |||
for i, #player.abilities do | |||
if player.abilities[i] == "orbitSync" then | |||
Abilities.orbitSync() | |||
end | |||
end | |||
end | |||
@@ -48,7 +48,6 @@ function calc.closestObj(target) | |||
end | |||
return minPlanet | |||
end | |||
@@ -29,7 +29,7 @@ end | |||
function FX:draw() | |||
debug("drawing flash") | |||
--debug("drawing flash") | |||
if self.type == "flash" then | |||
self:flash() | |||
end |
@@ -9,6 +9,10 @@ function Planet:init(tempX, tempY, tempR, tempM, tempXSpeed, tempYSpeed, tempNam | |||
self.xSpeed = 0 | |||
self.ySpeed = 0 | |||
-- Orbital speed: | |||
self.orbitalX = 0 | |||
self.orbitalY = 0 | |||
-- Speed Change: (throttle 0 - 1; variable) (speed; constant (max speed change)) | |||
self.throttle = 0.5 | |||
self.speed = 0.05 | |||
@@ -29,8 +33,6 @@ function Planet:init(tempX, tempY, tempR, tempM, tempXSpeed, tempYSpeed, tempNam | |||
self.parent = planet[tempP] | |||
table.insert(planet[tempP].children, self) | |||
end | |||
end | |||
@@ -38,10 +40,14 @@ end | |||
-- FUNCTIONS | |||
function Planet:getSpeed() | |||
return math.abs(self.xSpeed) + math.abs(self.ySpeed) | |||
end | |||
function Planet:updatePosition() | |||
self.x = self.x + self.xSpeed | |||
self.y = self.y + self.ySpeed | |||
debug("Updating position of planet " .. self.name .. ": " .. self.x .. " " .. self.y) | |||
self.x = self.x + self.xSpeed + self.orbitalX | |||
self.y = self.y + self.ySpeed + self.orbitalY | |||
--debug("Updating position of planet " .. self.name .. ": " .. self.x .. " " .. self.y) | |||
end | |||
function Planet:attract(dt) --Planet doing the attracting, divided in two parts: | |||
@@ -49,10 +55,16 @@ function Planet:attract(dt) --Planet doing the attracting, divided in two parts | |||
for i, child in ipairs(self.children) do | |||
local grav = calc.gPull(self, child) | |||
local dist = calc.distance(self.x, self.y, child.x, child.y) | |||
local pull = 20/dist * grav | |||
child.xSpeed = child.xSpeed - (child.x - self.x)*pull | |||
child.ySpeed = child.ySpeed - (child.y - self.y)*pull | |||
-- Reworked planetary gravity, now works with multiple layers of parent-children. Also more realistc?? | |||
local angle = math.atan((child.y-self.y)/(child.x-self.x)) | |||
if self.x < child.x then | |||
angle = angle - 3.14159 | |||
end | |||
child.orbitalX = self.xSpeed + self.orbitalX | |||
child.orbitalY = self.ySpeed + self.orbitalY | |||
child.xSpeed = child.xSpeed + grav/child.m*math.cos(angle)*1e9 | |||
child.ySpeed = child.ySpeed + grav/child.m*math.sin(angle)*1e9 | |||
end | |||
--Attracting the player | |||
@@ -83,5 +95,4 @@ function Planet:draw() | |||
local col = self.colour | |||
love.graphics.setColor(calc.c(col[1]), calc.c(col[2]), calc.c(col[3])) | |||
love.graphics.circle("fill", self.x, self.y, self.r) | |||
end |
@@ -1,6 +1,6 @@ | |||
Player = Class {} | |||
function Player:init(tempX, tempY) | |||
function Player:init(tempX, tempY, tempT) | |||
-- Position: (variable) | |||
self.x = tempX | |||
self.y = tempY | |||
@@ -15,20 +15,24 @@ function Player:init(tempX, tempY) | |||
-- Speed Change: (throttle 0 - 1; variable) (speed; constant (max speed change)) | |||
self.throttle = 0.5 | |||
self.speed = 0.05 | |||
self.speed = starshipTypes[tempT].speed | |||
-- Landings: | |||
self.impacttolerance = 0.5 | |||
self.impacttolerance = starshipTypes[tempT].impacttolerance | |||
self.landingspeed = 0 | |||
self.landedOn = nil | |||
-- Mass: | |||
self.m = 10 | |||
self.m = starshipTypes[tempT].mass | |||
-- Rotation: | |||
self.angle = calc.pi/2 | |||
-- Status: | |||
self.exploding = false | |||
--TEXTURE HERE? | |||
self.texture = love.graphics.newImage(starshipTypes[tempT].texture) | |||
end | |||
@@ -76,44 +80,39 @@ 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 | |||
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!") | |||
--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 | |||
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!") | |||
--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 | |||
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!") | |||
--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 | |||
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!") | |||
--debug("Flying into a planet!") | |||
else | |||
self.xSpeed = self.xSpeed + speedChange | |||
debug("Player control: right") | |||
end | |||
end | |||
@@ -124,7 +123,7 @@ function Player:flightControls() | |||
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) | |||
--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 | |||
@@ -139,19 +138,19 @@ function Player:flightControls() | |||
-- Reset: | |||
if love.keyboard.isDown(controls.flight.reset) then | |||
self:reset() | |||
debug("Player control: reset") | |||
end | |||
end | |||
function Player:getSpeed() | |||
local x, y = self.xSpeed, self.ySpeed | |||
if x < 0 then | |||
x = -x | |||
end | |||
if y < 0 then | |||
y = -y | |||
end | |||
return x+y | |||
function Player:getSpeed() -- absolute speed | |||
return math.abs(self.xSpeed) + math.abs(self.ySpeed) | |||
end | |||
function Player:getSpeedTo(obj) -- relative speed to an object | |||
return math.abs(self:getSpeed() - obj:getSpeed()) | |||
end | |||
function Player:getOrbitHeight(obj) -- gets the height of the orbit (above surface) | |||
return calc.distance(self.x, self.y, obj.x, obj.y)-obj.r | |||
end | |||
function Player:hasCrashed() --Testing function, see if a player is inside a planet | |||
@@ -166,15 +165,19 @@ 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 | |||
for i, p in ipairs(planet) do | |||
if self:getOrbitHeight(p) <= 0 then | |||
landed = true | |||
self.landedOn = p | |||
debug("Player touched down on: "..p.name) | |||
end | |||
end | |||
-- Save Landing Speed: | |||
if landed then | |||
self.landingspeed = self:getSpeed() | |||
local player = math.abs(self:getSpeed()) | |||
local planet = math.abs(self.landedOn:getSpeed()) | |||
self.landingspeed = math.abs(player-planet) | |||
debug("Landing speed: "..self.landingspeed) | |||
end | |||
self:hasCrashed() | |||
@@ -184,7 +187,8 @@ end | |||
function Player:gravity() | |||
if self:isLanded() then | |||
-- Player is landed: | |||
self.xSpeed, self.ySpeed = 0, 0 | |||
local p = self.landedOn | |||
self.xSpeed, self.ySpeed = math.abs(p.xSpeed), math.abs(p.ySpeed) | |||
end | |||
end | |||
@@ -193,13 +197,23 @@ function Player:updatePosition() | |||
self.y = self.y + self.ySpeed | |||
end | |||
function Player:drawTexture(x, y, r) | |||
-- Texture offset and size | |||
local t = {s = 50} | |||
t.x = x - love.graphics.getPixelWidth(self.texture)/2 -- ????????????????????????????????? | |||
t.y = y - love.graphics.getPixelHeight(self.texture)/2 | |||
-- Draw Texture | |||
love.graphics.setColor(1, 1, 1) | |||
love.graphics.draw(self.texture, t.x, t.y, r) | |||
debug("Angle: "..self.angle) | |||
end | |||
-- MAIN | |||
function Player:update(dt) | |||
--debug(self.warpspeed) | |||
if self.angle > calc.pi*2 then | |||
self.angle = 0 | |||
elseif self.angle < 0 then | |||
@@ -215,23 +229,15 @@ end | |||
function Player:draw() | |||
local x, y = self.x, self.y | |||
local dist = 10 | |||
-- Funky arrow type form | |||
local vertices = { | |||
-- Top | |||
x, y-dist, | |||
-- Left Bottom | |||
x-dist, y+dist, | |||
-- Middle Down | |||
x, y+dist/2, | |||
-- Right Bottom | |||
x+dist, y+dist | |||
} | |||
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) | |||
self:drawTexture(x, y, calc.pi/2 - self.angle) | |||
if not self.exploding then | |||
if calc.isDebug then | |||
-- Debugging Draw of actual Player Position | |||
love.graphics.setColor(1, 0, 0) | |||
love.graphics.circle("fill", x, y, 5, 20) | |||
end | |||
-- 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) | |||
@@ -1,3 +1,10 @@ | |||
texture = {} | |||
texture = { | |||
player = { | |||
orbiter = "textures/player/orbiter.png" | |||
}, | |||
planet = { | |||
-- here will go planet textures in future | |||
} | |||
} | |||
return texture |