33
35
assert(drag, 'active sprite has no drag property')
34
36
assert(minVel, 'active sprite has no minVelocity property')
35
37
assert(maxVel, 'active sprite has no maxVelocity property')
36
assert(_.include({'x','y','rotation'}, dir), 'direction should be x, y, or rotation')
38
assert(__.include({'x','y','rotation'}, dir), 'direction should be x, y, or rotation')
114
116
-- NOTE: this is an override, not a callback
116
118
self:doPhysics('x', elapsed)
119
self:collide(the.view.map)
121
-- handle X collisions
122
for _, col in ipairs(self.collisions) do
123
col.other:displaceDir(self, 'x')
124
if self.velocity.x > 0 then
125
self.onWall = 'right'
126
elseif self.velocity.x < 0 then
118
133
self.onGround = false -- right before Y collision callbacks
119
134
self:doPhysics('y', elapsed)
121
135
self:collide(the.view.map)
137
-- handle Y collisions
138
for _, col in ipairs(self.collisions) do
139
if self.velocity.y > 0 then
143
col.other:displaceDir(self, 'y')
123
148
Animation.update(self, elapsed)
150
collide = function (self, ...)
152
Animation.collide(self, ...)
153
-- I could return a true/false value here if I wanted to...
125
155
onCollide = function (self, other, xOverlap, yOverlap)
126
-- seriously, why does this even fire?
127
156
if other == the.view.map then return end
129
--print(string.format('col s{x=%i y=%i w=%i h=%i} %s', self.x, self.y, self.width, self.height, tostring(other)))
130
--print('vel.x:'..self.velocity.x.." vel.y:"..self.velocity.y)
132
-- assumption: any other collision is with a solid map tile
133
if yOverlap > xOverlap then
136
if self.velocity.x > 0 then
137
self.onWall = 'right'
138
elseif self.velocity.x < 0 then
143
elseif xOverlap > yOverlap then
144
-- check if we've moved since collisions were generated
145
local xov, yov = self:overlap(other.x, other.y,
146
other.width, other.height)
147
if xov ~= 0 and yov ~= 0 then
148
--print('y collision')
149
if self.velocity.y > 0 then
158
table.insert(self.collisions, {other = other,
160
yOverlap = yOverlap })
164
-- displace on a specific axis (monkey patch Sprite)
165
function Sprite:displaceDir(other, dir)
166
if not self.solid or self == other or not other.solid then return end
167
if STRICT then assert(other:instanceOf(Sprite), 'asked to displace a non-sprite') end
169
if other.sprites then
172
for _, spr in pairs(other.sprites) do
173
self:displace(spr, dir)
180
elseif dir == 'y' then
186
local negMove = (other[dir] - self[dir]) + other[dim]
187
local posMove = (self[dir] + self[dim]) - other[dir]
189
-- TODO: re-add hinting?
190
if negMove < posMove then
197
other[dir] = other[dir] + chg
164
200
GameView = View:extend {
165
201
onNew = function (self)
166
202
self:loadLayers('data/map.lua')