13
13
stand = { frames = { 1 }, fps = 1 },
14
14
walk = { frames = { 2, 3 }, fps = 5 },
15
jump = { frames = { 4 }, fps = 1 },
16
climbLeft = { frames = { 5, 6 }, fps = 5 },
17
climbRight = { frames = { 7, 8 }, fps = 5 }
15
jump = { frames = { 4 }, fps = 1 }
22
17
onNew = function (self)
23
18
self.velocity.y = 0
24
19
self.maxVelocity.y = 400
38
33
assert(drag, 'active sprite has no drag property')
39
34
assert(minVel, 'active sprite has no minVelocity property')
40
35
assert(maxVel, 'active sprite has no maxVelocity property')
41
assert(__.include({'x','y','rotation'}, dir), 'direction should be x, y, or rotation')
36
assert(_.include({'x','y','rotation'}, dir), 'direction should be x, y, or rotation')
82
78
self.acceleration.y = 800
84
80
if self.onWall then
85
81
self.acceleration.y = 0
87
if self.onWall == 'right' then
88
self:play('climbRight')
89
elseif self.onWall == 'left' then
90
self:play('climbLeft')
93
83
if the.keys:pressed('up') then
94
84
self.velocity.y = -200
95
86
elseif the.keys:pressed('down') then
96
87
self.velocity.y = 200
98
90
self.velocity.y = 0
99
self:freeze(self.sequences[self.currentName].frames[1])
103
95
if the.keys:pressed('left') then
104
96
self.velocity.x = -200
105
97
if self.onGround then self:play('walk') end
106
if self.onWall == 'right' then
108
self.leftWallAt = love.timer.getTime()
98
if self.onWall == 'right' then self.onWall = false end
99
if self.onWall == 'right' then self.onWall = false end
110
100
elseif the.keys:pressed('right') then
111
101
self.velocity.x = 200
112
102
if self.onGround then self:play('walk') end
113
if self.onWall == 'left' then
115
self.leftWallAt = love.timer.getTime()
103
if self.onWall == 'left' then self.onWall = false end
118
if not self.onWall then
119
if self.onGround then self:play('stand') end
105
if self.onGround then self:play('stand') end
124
if the.keys:justPressed('up') and
126
(love.timer.getTime() - self.leftWallAt < .1) ) then
108
if the.keys:justPressed('up') and self.onGround then
127
109
self.velocity.y = -400
128
110
self.jumping = true
132
114
-- NOTE: this is an override, not a callback
134
116
self:doPhysics('x', elapsed)
135
self:collide(the.view.map)
137
-- handle X collisions
139
for _, col in ipairs(self.collisions) do
140
col.other:displaceDir(self, 'x')
141
if self.velocity.x > 0 then
142
self.onWall = 'right'
143
elseif self.velocity.x < 0 then
150
118
self.onGround = false -- right before Y collision callbacks
151
119
self:doPhysics('y', elapsed)
152
121
self:collide(the.view.map)
154
-- handle Y collisions
155
for _, col in ipairs(self.collisions) do
156
if self.velocity.y > 0 then
160
col.other:displaceDir(self, 'y')
165
123
Animation.update(self, elapsed)
167
collide = function (self, ...)
169
Animation.collide(self, ...)
170
-- I could return a true/false value here if I wanted to...
172
125
onCollide = function (self, other, xOverlap, yOverlap)
126
-- seriously, why does this even fire?
173
127
if other == the.view.map then return end
175
table.insert(self.collisions, {other = other,
177
yOverlap = yOverlap })
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
181
function Sprite:displaceDir(other, dir)
182
if not self.solid or self == other or not other.solid then return end
183
if STRICT then assert(other:instanceOf(Sprite), 'asked to displace a non-sprite') end
185
if other.sprites then
188
for _, spr in pairs(other.sprites) do
189
self:displace(spr, dir)
196
elseif dir == 'y' then
202
local negMove = (other[dir] - self[dir]) + other[dim]
203
local posMove = (self[dir] + self[dim]) - other[dir]
205
-- TODO: re-add hinting?
206
if negMove < posMove then
213
other[dir] = other[dir] + chg
216
164
GameView = View:extend {
217
165
onNew = function (self)
218
166
self:loadLayers('data/map.lua')