Add physics bootstrap and settings files
This commit is contained in:
parent
9a7d17170d
commit
b055603e8b
7 changed files with 223 additions and 3 deletions
17
conf.lua
Normal file
17
conf.lua
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
-- LÖVE configuration values
|
||||||
|
|
||||||
|
function love.conf(t)
|
||||||
|
-- Disable unneeded modules
|
||||||
|
t.modules.joystick = false
|
||||||
|
|
||||||
|
t.window.title = "Fysplane"
|
||||||
|
t.window.width = 1024
|
||||||
|
t.window.height = 768
|
||||||
|
t.window.resizable = false
|
||||||
|
|
||||||
|
-- LÖVE version
|
||||||
|
t.version = "0.9.1"
|
||||||
|
|
||||||
|
-- Game save directory name
|
||||||
|
t.identity = "fysplane"
|
||||||
|
end
|
42
entities/entity.lua
Normal file
42
entities/entity.lua
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
Class = require 'hump.class'
|
||||||
|
|
||||||
|
-- Entity is the basic building block of all objects in fysplane. All other
|
||||||
|
-- objects in game that are not part of the background derive from this class.
|
||||||
|
|
||||||
|
entity_id = 1
|
||||||
|
|
||||||
|
Entity = Class{
|
||||||
|
init = function(self, x, y, level)
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
self.level = level
|
||||||
|
|
||||||
|
self.id = entity_id
|
||||||
|
entity_id = entity_id + 1
|
||||||
|
|
||||||
|
self.level.entity_list[self.id] = self
|
||||||
|
end;
|
||||||
|
|
||||||
|
draw = function(self)
|
||||||
|
end;
|
||||||
|
|
||||||
|
update = function(self, dt)
|
||||||
|
end;
|
||||||
|
|
||||||
|
delete = function(self)
|
||||||
|
self.level.entity_list[self.id] = nil
|
||||||
|
end;
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawEntities()
|
||||||
|
-- Do we need ordering? If so, use ipairs instead of pairs
|
||||||
|
for key, entity in pairs(entity_list) do
|
||||||
|
entity:draw()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function updateEntities(dt)
|
||||||
|
for key, entity in pairs(entity_list) do
|
||||||
|
entity:update(dt)
|
||||||
|
end
|
||||||
|
end
|
18
entities/fixedentity.lua
Normal file
18
entities/fixedentity.lua
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
Class = require 'hump.class'
|
||||||
|
require 'entities/entity'
|
||||||
|
|
||||||
|
FixedEntity = Class{
|
||||||
|
__includes = Entity,
|
||||||
|
|
||||||
|
init = function(self, x, y, level)
|
||||||
|
Entity.init(self, x, y, level)
|
||||||
|
end;
|
||||||
|
|
||||||
|
draw = function(self)
|
||||||
|
-- Noop, implement in child
|
||||||
|
end;
|
||||||
|
|
||||||
|
update = function(self, dt)
|
||||||
|
-- Noop, implement in child
|
||||||
|
end;
|
||||||
|
}
|
62
entities/physicsentity.lua
Normal file
62
entities/physicsentity.lua
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
Class = require 'hump.class'
|
||||||
|
require 'entities/entity'
|
||||||
|
require 'utils'
|
||||||
|
|
||||||
|
PhysicsEntity = Class{
|
||||||
|
__includes = Entity,
|
||||||
|
|
||||||
|
init = function(self, x, y, level, physics_type, restitution)
|
||||||
|
Entity.init(self, x, y, level)
|
||||||
|
self.physicsType = physics_type
|
||||||
|
self.main_color = main_color
|
||||||
|
self.restitution = restitution
|
||||||
|
|
||||||
|
self:initPhysics(self)
|
||||||
|
end;
|
||||||
|
|
||||||
|
initPhysics = function(self)
|
||||||
|
self.body = love.physics.newBody(self.level.world, self.x, self.y,
|
||||||
|
self.physicsType)
|
||||||
|
end;
|
||||||
|
|
||||||
|
-- This should only be called once the child has created their shapes, maybe
|
||||||
|
-- in the child constructor
|
||||||
|
-- You can add a density too. I don't know what that means
|
||||||
|
attachShape = function(self, density)
|
||||||
|
density = density or 1
|
||||||
|
self.fixture = love.physics.newFixture(self.body, self.shape, density)
|
||||||
|
self.fixture:setRestitution(self.restitution)
|
||||||
|
|
||||||
|
-- Add reference to this object so we can get it in collisions
|
||||||
|
self.fixture:setUserData(self)
|
||||||
|
end;
|
||||||
|
|
||||||
|
-- Reimplement
|
||||||
|
draw = function(self)
|
||||||
|
love.graphics.setColor({255, 255, 255, 255})
|
||||||
|
end;
|
||||||
|
|
||||||
|
-- Only update if physics is not static
|
||||||
|
update = function(self, dt)
|
||||||
|
if self.physicsType ~= "static" then
|
||||||
|
self.x = self.body:getX()
|
||||||
|
self.y = self.body:getY()
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
delete = function(self)
|
||||||
|
if self.body ~= nil then
|
||||||
|
self.body:destroy()
|
||||||
|
end
|
||||||
|
|
||||||
|
Entity.delete(self)
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
-- Apply linear impulse with given direction and power
|
||||||
|
punch = function(self, angle, power)
|
||||||
|
local forces = deg_dist_to_xy(angle, power)
|
||||||
|
self.body:applyLinearImpulse(forces[1], forces[2])
|
||||||
|
end;
|
||||||
|
}
|
||||||
|
|
|
@ -76,8 +76,8 @@ local function new(class)
|
||||||
else
|
else
|
||||||
table.insert(class.class_tree, class_id)
|
table.insert(class.class_tree, class_id)
|
||||||
end
|
end
|
||||||
class.class_id = class_id
|
|
||||||
|
|
||||||
|
class.class_id = class_id
|
||||||
class_id = class_id + 1
|
class_id = class_id + 1
|
||||||
|
|
||||||
-- Check if object is instance of given class
|
-- Check if object is instance of given class
|
||||||
|
@ -95,8 +95,6 @@ local function new(class)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
class_id = class_id + 1
|
|
||||||
|
|
||||||
-- constructor call
|
-- constructor call
|
||||||
return setmetatable(class, {__call = function(c, ...)
|
return setmetatable(class, {__call = function(c, ...)
|
||||||
local o = setmetatable({}, c)
|
local o = setmetatable({}, c)
|
||||||
|
|
6
settings.lua
Normal file
6
settings.lua
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
-- Game specific settings go here
|
||||||
|
-- LÖVE settings should go to conf.lua
|
||||||
|
|
||||||
|
PIXELS_PER_METER = 10
|
||||||
|
|
||||||
|
|
77
utils.lua
Normal file
77
utils.lua
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
--[[
|
||||||
|
Some random utilities that can be useful
|
||||||
|
]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- Calculate XY position from given degrees (not rad!) and distance
|
||||||
|
-- Returns tuple {X, Y} coordinates
|
||||||
|
-- Note that either may be negative
|
||||||
|
function deg_dist_to_xy(degrees, distance)
|
||||||
|
local rad = deg_to_rad(degrees)
|
||||||
|
return rad_dist_to_xy(rad, distance)
|
||||||
|
end
|
||||||
|
|
||||||
|
function rad_dist_to_xy(radians, distance)
|
||||||
|
return {distance * math.cos(radians), distance * math.sin(radians)}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Convert degrees to radians
|
||||||
|
function deg_to_rad(degrees)
|
||||||
|
return degrees * math.pi / 180
|
||||||
|
end
|
||||||
|
|
||||||
|
function rad_to_deg(radians)
|
||||||
|
return radians * 180 / math.pi
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Convert X,Y to rad from horizontal axle (pointing right)
|
||||||
|
function xy_to_rad(x, y)
|
||||||
|
-- Avoid division by 0
|
||||||
|
if x == 0 then
|
||||||
|
if y >= 0 then
|
||||||
|
return math.pi / 2
|
||||||
|
else
|
||||||
|
return math.pi * 1.5
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local angle = math.atan(math.abs(y) / math.abs(x))
|
||||||
|
|
||||||
|
-- Take into account the quadrant we are in
|
||||||
|
if x >= 0 and y < 0 then
|
||||||
|
return 2 * math.pi - angle
|
||||||
|
elseif x < 0 and y < 0 then
|
||||||
|
return math.pi + angle
|
||||||
|
elseif x < 0 and y >= 0 then
|
||||||
|
return math.pi - angle
|
||||||
|
else
|
||||||
|
return angle
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function xy_to_deg(x, y)
|
||||||
|
return rad_to_deg(xy_to_rad(x, y))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Get distance between two points
|
||||||
|
function distance(x1, y1, x2, y2)
|
||||||
|
return math.sqrt(math.pow(x1 - x2, 2) + math.pow(y1 - y2, 2))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Get objects within a radius from given coordinates in given level
|
||||||
|
function getObjectsInRadius(x, y, radius, level, include_player)
|
||||||
|
include_player = include_player or false
|
||||||
|
local objs = level.world:getBodyList()
|
||||||
|
local ret = {}
|
||||||
|
for _, body in pairs(objs) do
|
||||||
|
if distance(x, y, body:getX(), body:getY()) <= radius then
|
||||||
|
if body:getFixtureList()[1]:getUserData() ~= player
|
||||||
|
or include_player then
|
||||||
|
table.insert(ret, body)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return ret
|
||||||
|
end
|
Loading…
Reference in a new issue