108
78
self.acceleration.y = 800
110
80
if self.onWall then
111
81
self.acceleration.y = 0
113
if self.onWall == 'right' then
114
self:play('climbRight')
115
elseif self.onWall == 'left' then
116
self:play('climbLeft')
119
83
if the.keys:pressed('up') then
120
84
self.velocity.y = -200
121
86
elseif the.keys:pressed('down') then
122
87
self.velocity.y = 200
124
90
self.velocity.y = 0
125
self:freeze(self.sequences[self.currentName].frames[1])
129
95
if the.keys:pressed('left') then
130
96
self.velocity.x = -200
131
97
if self.onGround then self:play('walk') end
132
if self.onWall == 'right' then
134
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
136
100
elseif the.keys:pressed('right') then
137
101
self.velocity.x = 200
138
102
if self.onGround then self:play('walk') end
139
if self.onWall == 'left' then
141
self.leftWallAt = love.timer.getTime()
103
if self.onWall == 'left' then self.onWall = false end
144
if not self.onWall then
145
if self.onGround then self:play('stand') end
105
if self.onGround then self:play('stand') end
150
if the.keys:justPressed('up') and
151
(self.onGround or the.console.visible or
152
(love.timer.getTime() - self.leftWallAt < .1) ) then
108
if the.keys:justPressed('up') and self.onGround then
153
109
self.velocity.y = -400
154
110
self.jumping = true
158
114
-- NOTE: this is an override, not a callback
160
116
self:doPhysics('x', elapsed)
161
self:collide(the.view.map)
163
-- handle X collisions
165
for _, col in ipairs(self.collisions) do
166
col.other:displaceDir(self, 'x')
167
if self.velocity.x > 0 then
168
self.onWall = 'right'
169
elseif self.velocity.x < 0 then
176
118
self.onGround = false -- right before Y collision callbacks
177
119
self:doPhysics('y', elapsed)
178
121
self:collide(the.view.map)
180
-- handle Y collisions
181
for _, col in ipairs(self.collisions) do
182
if self.velocity.y > 0 then
186
col.other:displaceDir(self, 'y')
192
if not self.text then
193
self.text = Text:new{wordWrap = true, width = 50, tint = {0,0,0}}
194
self.textfill = Fill:new{width = 54, border = {0,0,255}}
195
--the.view:add(self.textfill)
196
--the.view:add(self.text)
198
self.text.text = "Blah blah big text etc etc wrapping"
199
self.text:centerAround(self.x+16, self.y+16, 'horizontal')
200
_, texth = self.text:getSize()
201
self.text.y = self.y - texth - 4
202
self.textfill.x = self.text.x - 2
203
self.textfill.y = self.text.y - 2
204
self.textfill.height = texth + 4
206
123
Animation.update(self, elapsed)
208
collide = function (self, ...)
210
Animation.collide(self, ...)
211
-- I could return a true/false value here if I wanted to...
213
125
onCollide = function (self, other, xOverlap, yOverlap)
126
-- seriously, why does this even fire?
214
127
if other == the.view.map then return end
216
table.insert(self.collisions, {other = other,
218
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
222
function Sprite:displaceDir(other, dir)
223
if not self.solid or self == other or not other.solid then return end
224
if STRICT then assert(other:instanceOf(Sprite), 'asked to displace a non-sprite') end
226
if other.sprites then
229
for _, spr in pairs(other.sprites) do
230
self:displace(spr, dir)
234
local dim = util.dim(dir)
236
local negMove = (other[dir] - self[dir]) + other[dim]
237
local posMove = (self[dir] + self[dim]) - other[dir]
239
-- TODO: re-add hinting?
240
if negMove < posMove then
247
other[dir] = other[dir] + chg
250
function Sprite:update (elapsed)
251
if self.onUpdate then self:onUpdate(elapsed) end
254
164
GameView = View:extend {
255
165
onNew = function (self)
256
166
self:loadLayers('data/map.lua')
257
167
self.focus = the.player
258
168
self:clampTo(self.map)
260
the.recorder = Recorder:new{mousePosInterval = 9999}
261
the.app.meta:add(the.recorder)
262
if the.app.record then
263
the.recorder:startRecording()
264
elseif the.app.playback then
265
local storage = Storage:new{filename = 'record.lua'}
267
--print(inspect(storage.data))
268
the.recorder.record = storage.data
269
the.recorder:startPlaying()
272
170
onUpdate = function (self)
273
--print('drawTook: ', the.drawTook)
275
172
--the.player:collide(self.map)
276
173
--self.map:collide(the.player)
278
-- draw = function (self, x, y)
279
-- View.draw(self, x, y)
281
-- love.graphics.print('FPS:' .. love.timer.getFPS(), 20, 20)
285
177
the.app = App:new {
287
178
onRun = function (self)
288
179
self.view = GameView:new()
180
--print(inspect(_(the.app):keys()))
289
181
self.console:watch('onGround', 'the.player.onGround')
290
182
self.console:watch('onWall', 'the.player.onWall')
291
self.console:watch('updateTook', 'the.updateTook')
292
self.console:watch('drawTook', 'the.drawTook')
293
self.console:watch('recorder state', 'the.recorder.state')
295
--the.profiler = newProfiler('time', 2000)
296
--the.profiler = newProfiler()
297
--the.profiler:start()
299
184
onUpdate = function (self, dt)
300
if the.keys:justPressed('escape') then
303
local outfile = io.open( "profile.txt", "w+" )
304
the.profiler:report( outfile )
309
if not love.filesystem.remove('record.lua') then
310
print('could not remove record.lua')
312
local storage = Storage:new{
313
data = the.recorder.record,
314
filename = 'record.lua'
317
--print(inspect(the.recorder.record))
185
if the.keys:justPressed('escape') and
186
not self.console.visible then
323
update = function (self, dt)
324
the.updateStart = love.timer.getMicroTime()
326
if the.updateStart then
327
the.updateTook = love.timer.getMicroTime() - the.updateStart
332
function love.load (arg)
333
opts = getopt(arg, '')
335
the.app.playback = true
336
the.app.record = false
337
elseif opts['r'] then
338
the.app.record = true
b'\\ No newline at end of file'
b'\\ No newline at end of file'