2
function Sprite:displaceDir(other, dir)
3
if not self.solid or self == other or not other.solid then return end
4
if STRICT then assert(other:instanceOf(Sprite), 'asked to displace a non-sprite') end
9
for _, spr in pairs(other.sprites) do
10
self:displace(spr, dir)
14
local dim = util.dim(dir)
16
local negMove = (other[dir] - self[dir]) + other[dim]
17
local posMove = (self[dir] + self[dim]) - other[dir]
19
-- TODO: re-add hinting?
20
if negMove < posMove then
27
other[dir] = other[dir] + chg
30
function Sprite:update(elapsed)
31
if self.onUpdate then self:onUpdate(elapsed) end
34
function Sprite:doPhysics(dir, elapsed)
35
local vel = self.velocity
36
local acc = self.acceleration
37
local drag = self.drag
38
local minVel = self.minVelocity
39
local maxVel = self.maxVelocity
41
-- check existence of properties
44
assert(vel, 'active sprite has no velocity property')
45
assert(acc, 'active sprite has no acceleration property')
46
assert(drag, 'active sprite has no drag property')
47
assert(minVel, 'active sprite has no minVelocity property')
48
assert(maxVel, 'active sprite has no maxVelocity property')
49
assert(dir=='x' or dir=='y' or dir=='rotation', 'direction should be x, y, or rotation')
54
vel.rotation = vel.rotation or 0
58
if acc[dir] and acc[dir] ~= 0 then
59
vel[dir] = vel[dir] + acc[dir] * elapsed
63
vel[dir] = vel[dir] - drag[dir] * elapsed
64
if vel[dir] < 0 then vel[dir] = 0 end
65
elseif vel[dir] < 0 then
66
vel[dir] = vel[dir] + drag[dir] * elapsed
67
if vel[dir] > 0 then vel[dir] = 0 end
72
if minVel[dir] and vel[dir] < minVel[dir] then vel[dir] = minVel[dir] end
73
if maxVel[dir] and vel[dir] > maxVel[dir] then vel[dir] = maxVel[dir] end
75
-- ugly hack for falling through floor on really slow frames
76
if math.abs(vel[dir] * elapsed) > 32 then
81
if vel[dir] ~= 0 then self[dir] = self[dir] + vel[dir] * elapsed end
83
if self[dir] < 0 then self[dir] = 0 end
84
local edge = the.view.map[util.dim(dir)] - the.player[util.dim(dir)]
85
-- TODO: take map position into account
86
if self[dir] > edge then self[dir] = edge end