summaryrefslogtreecommitdiffhomepage
path: root/not/PhysicalBody.lua
diff options
context:
space:
mode:
Diffstat (limited to 'not/PhysicalBody.lua')
-rw-r--r--not/PhysicalBody.lua93
1 files changed, 93 insertions, 0 deletions
diff --git a/not/PhysicalBody.lua b/not/PhysicalBody.lua
new file mode 100644
index 0000000..e9625fa
--- /dev/null
+++ b/not/PhysicalBody.lua
@@ -0,0 +1,93 @@
+--- `PhysicalBody`
+-- Abstract class for drawable entity existing in `not.World`.
+PhysicalBody = {
+ body =--[[love.physics.newBody]]nil,
+}
+
+-- `PhysicalBody` is a child of `Sprite`.
+require "not.Sprite"
+PhysicalBody.__index = PhysicalBody
+setmetatable(PhysicalBody, Sprite)
+
+--[[ Constructor of `PhysicalBody`.
+function PhysicalBody:new (world, x, y, imagePath)
+ local o = setmetatable({}, self)
+ o:init(world, x, y, imagePath)
+ return o
+end
+]]
+
+-- Initializer of `PhysicalBody`.
+function PhysicalBody:init (world, x, y, imagePath)
+ Sprite.init(self, imagePath)
+ self.body = love.physics.newBody(world.world, x, y)
+end
+
+-- Add new fixture to body.
+function PhysicalBody:addFixture (shape, density)
+ local shape = love.physics.newPolygonShape(shape)
+ local fixture = love.physics.newFixture(self.body, shape, density)
+ return fixture
+end
+
+-- Position-related methods.
+function PhysicalBody:getPosition ()
+ return self.body:getPosition()
+end
+function PhysicalBody:setPosition (x, y)
+ self.body:setPosition(x, y)
+end
+
+-- Velocity-related methods.
+function PhysicalBody:setLinearVelocity (x, y)
+ self.body:setLinearVelocity(x, y)
+end
+function PhysicalBody:getLinearVelocity ()
+ return self.body:getLinearVelocity()
+end
+
+-- Various setters from Body.
+-- type: BodyType ("static", "dynamic", "kinematic")
+function PhysicalBody:setBodyType (type)
+ self.body:setType(type)
+end
+function PhysicalBody:setBodyFixedRotation (bool)
+ self.body:setFixedRotation(bool)
+end
+function PhysicalBody:setBodyActive (bool)
+ self.body:setActive(bool)
+end
+
+-- Physical influence methods.
+function PhysicalBody:applyLinearImpulse (x, y)
+ self.body:applyLinearImpulse(x, y)
+end
+function PhysicalBody:applyForce (x, y)
+ self.body:applyForce(x, y)
+end
+
+-- Update of `PhysicalBody`.
+function PhysicalBody:update (dt)
+ Sprite.update(self, dt)
+end
+
+-- Draw of `PhysicalBody`.
+function PhysicalBody:draw (offset_x, offset_y, scale, debug)
+ Sprite.draw(self, offset_x, offset_y, scale)
+ if debug then
+ for _,fixture in pairs(self.body:getFixtureList()) do
+ local category = fixture:getCategory()
+ if category == 1 then
+ love.graphics.setColor(255, 69, 0, 140)
+ end
+ if category == 2 then
+ love.graphics.setColor(137, 255, 0, 120)
+ end
+ if category == 3 then
+ love.graphics.setColor(137, 0, 255, 40)
+ end
+ -- TODO: `world` is not a member of `PhysicalBody` or its instance normally.
+ love.graphics.polygon("fill", self.world.camera:translatePoints(self.body:getWorldPoints(fixture:getShape():getPoints())))
+ end
+ end
+end