5
7
__ = require 'underscore'
6
8
--inspect = require 'inspect'
15
elseif dir == 'y' then
18
if STRICT then error('dir '..dir) end
8
23
Player = Animation:extend {
9
24
image = 'data/player.png',
13
28
stand = { frames = { 1 }, fps = 1 },
14
29
walk = { frames = { 2, 3 }, fps = 5 },
15
jump = { frames = { 4 }, fps = 1 }
30
jump = { frames = { 4 }, fps = 1 },
31
climbLeft = { frames = { 5, 6 }, fps = 5 },
32
climbRight = { frames = { 7, 8 }, fps = 5 }
19
37
onNew = function (self)
20
38
self.velocity.y = 0
21
39
self.maxVelocity.y = 400
61
79
if minVel[dir] and vel[dir] < minVel[dir] then vel[dir] = minVel[dir] end
62
80
if maxVel[dir] and vel[dir] > maxVel[dir] then vel[dir] = maxVel[dir] end
82
-- ugly hack for falling through floor on really slow frames
83
if math.abs(vel[dir] * elapsed) > 32 then
64
88
if vel[dir] ~= 0 then self[dir] = self[dir] + vel[dir] * elapsed end
90
if self[dir] < 0 then self[dir] = 0 end
91
local edge = the.view.map[util.dim(dir)] -
92
the.player[util.dim(dir)]
93
-- TODO: take map position into account
94
if self[dir] > edge then self[dir] = edge end
66
96
onStartFrame = function (self)
67
97
-- this is all in startframe so it happens before
80
109
self.acceleration.y = 800
82
111
if self.onWall then
83
112
self.acceleration.y = 0
114
if self.onWall == 'right' then
115
self:play('climbRight')
116
elseif self.onWall == 'left' then
117
self:play('climbLeft')
85
120
if the.keys:pressed('up') then
86
121
self.velocity.y = -200
88
122
elseif the.keys:pressed('down') then
89
123
self.velocity.y = 200
92
125
self.velocity.y = 0
126
self:freeze(self.sequences[self.currentName].frames[1])
97
130
if the.keys:pressed('left') then
98
131
self.velocity.x = -200
99
132
if self.onGround then self:play('walk') end
100
if self.onWall == 'right' then self.onWall = false end
101
if self.onWall == 'right' then self.onWall = false end
133
if self.onWall == 'right' then
135
self.leftWallAt = love.timer.getTime()
102
137
elseif the.keys:pressed('right') then
103
138
self.velocity.x = 200
104
139
if self.onGround then self:play('walk') end
105
if self.onWall == 'left' then self.onWall = false end
140
if self.onWall == 'left' then
142
self.leftWallAt = love.timer.getTime()
107
if self.onGround then self:play('stand') end
145
if not self.onWall then
146
if self.onGround then self:play('stand') end
110
if the.keys:justPressed('up') and self.onGround then
151
if the.keys:justPressed('up') and
152
(self.onGround or the.console.visible or
153
(love.timer.getTime() - self.leftWallAt < .1) ) then
111
154
self.velocity.y = -400
112
155
self.jumping = true
119
162
self:collide(the.view.map)
121
164
-- handle X collisions
122
166
for _, col in ipairs(self.collisions) do
123
167
col.other:displaceDir(self, 'x')
124
168
if self.velocity.x > 0 then
197
234
other[dir] = other[dir] + chg
237
-- don't use zoetrope physics
238
function Sprite:update (elapsed)
239
if self.onUpdate then self:onUpdate(elapsed) end
200
242
GameView = View:extend {
201
243
onNew = function (self)
202
244
self:loadLayers('data/map.lua')
203
245
self.focus = the.player
204
246
self:clampTo(self.map)
248
the.recorder = Recorder:new{mousePosInterval = 9999}
249
the.app.meta:add(the.recorder)
251
the.recorder:startRecording()
253
local storage = Storage:new{filename = 'record.lua'}
255
--print(inspect(storage.data))
256
the.recorder.record = storage.data
257
the.recorder:startPlaying()
206
260
onUpdate = function (self)
261
--print('drawTook: ', the.drawTook)
208
263
--the.player:collide(self.map)
209
264
--self.map:collide(the.player)
266
-- draw = function (self, x, y)
267
-- View.draw(self, x, y)
269
-- love.graphics.print('FPS:' .. love.timer.getFPS(), 20, 20)
213
273
the.app = App:new {
215
275
self.view = GameView:new()
216
276
self.console:watch('onGround', 'the.player.onGround')
217
277
self.console:watch('onWall', 'the.player.onWall')
278
self.console:watch('updateTook', 'the.updateTook')
279
self.console:watch('drawTook', 'the.drawTook')
280
self.console:watch('recorder state', 'the.recorder.state')
282
--the.profiler = newProfiler('time', 2000)
283
--the.profiler = newProfiler()
284
--the.profiler:start()
219
286
onUpdate = function (self, dt)
220
if the.keys:justPressed('escape') and
221
not self.console.visible then
287
if the.keys:justPressed('escape') then
290
local outfile = io.open( "profile.txt", "w+" )
291
the.profiler:report( outfile )
296
if not love.filesystem.remove('record.lua') then
297
error('could not remove record.lua')
299
local storage = Storage:new{
300
data = the.recorder.record,
301
filename = 'record.lua'
304
--print(inspect(the.recorder.record))
b'\\ No newline at end of file'
310
update = function (self, dt)
311
the.updateStart = love.timer.getMicroTime()
313
if the.updateStart then
314
the.updateTook = love.timer.getMicroTime() - the.updateStart