-
Notifications
You must be signed in to change notification settings - Fork 0
/
PhysicalWorld.lua
72 lines (59 loc) · 1.7 KB
/
PhysicalWorld.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
PhysicalWorld = class("PhysicalWorld", World)
PhysicalWorld.static.maxDelta = .03
PhysicalWorld._mt = {}
function PhysicalWorld._mt:__index(key)
local result = World._mt.__index(self, key)
if result then
return result
elseif self._world[key] then
PhysicalWorld[key] = function(s, ...) return s._world[key](s._world, ...) end
return PhysicalWorld[key]
end
end
PhysicalWorld:enableAccessors()
function PhysicalWorld:initialize(...)
World.initialize(self)
self.physicsActive = true
self._world = love.physics.newWorld(...)
self._world:setCallbacks(PhysicalWorld._onCollide)
self:applyAccessors()
end
function PhysicalWorld:update(dt)
if self.physicsActive then
if dt > PhysicalWorld.maxDelta then
local current = dt
while current > PhysicalWorld.maxDelta do
current = current - PhysicalWorld.maxDelta
self._world:update(PhysicalWorld.maxDelta)
end
self._world:update(current)
else
self._world:update(dt)
end
end
World.update(self, dt)
end
function PhysicalWorld:wakeAll()
for v in self._updates:iterate() do
if instanceOf(PhysicalEntity, v) and v._body then
v._body:wakeUp()
end
end
end
function PhysicalWorld:sleepAll()
for v in self._updates:iterate() do
if instanceOf(PhysicalEntity, v) and v._body then
v._body:putToSleep()
end
end
end
function PhysicalWorld._onCollide(a, b, contact)
local entityA = a:getUserData()
local entityB = b:getUserData()
if entityA.collided and not entityA._removalQueued then
entityA:collided(entityB, a, b, contact)
end
if entityB.collided and not entityB._removalQueued then
entityB:collided(entityA, a, b, contact)
end
end