7
5
__ = require 'underscore'
8
6
--inspect = require 'inspect'
15
elseif dir == 'y' then
18
if STRICT then error('dir '..dir) end
23
8
Player = Animation:extend {
24
9
image = 'data/player.png',
28
13
stand = { frames = { 1 }, fps = 1 },
29
14
walk = { frames = { 2, 3 }, fps = 5 },
30
jump = { frames = { 4 }, fps = 1 },
31
climbLeft = { frames = { 5, 6 }, fps = 5 },
32
climbRight = { frames = { 7, 8 }, fps = 5 }
15
jump = { frames = { 4 }, fps = 1 }
37
19
onNew = function (self)
38
20
self.velocity.y = 0
39
21
self.maxVelocity.y = 400
79
61
if minVel[dir] and vel[dir] < minVel[dir] then vel[dir] = minVel[dir] end
80
62
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
88
64
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
96
66
onStartFrame = function (self)
97
67
-- this is all in startframe so it happens before
111
81
if self.onWall then
112
82
self.acceleration.y = 0
114
if self.onWall == 'right' then
115
self:play('climbRight')
116
elseif self.onWall == 'left' then
117
self:play('climbLeft')
120
84
if the.keys:pressed('up') then
121
85
self.velocity.y = -200
122
87
elseif the.keys:pressed('down') then
123
88
self.velocity.y = 200
125
91
self.velocity.y = 0
126
self:freeze(self.sequences[self.currentName].frames[1])
130
96
if the.keys:pressed('left') then
131
97
self.velocity.x = -200
132
98
if self.onGround then self:play('walk') end
133
if self.onWall == 'right' then
135
self.leftWallAt = love.timer.getTime()
99
if self.onWall == 'right' then self.onWall = false end
137
100
elseif the.keys:pressed('right') then
138
101
self.velocity.x = 200
139
102
if self.onGround then self:play('walk') end
140
if self.onWall == 'left' then
142
self.leftWallAt = love.timer.getTime()
103
if self.onWall == 'left' then self.onWall = false end
105
if self.onGround then self:play('stand') end
145
106
if not self.onWall then
146
if self.onGround then self:play('stand') end
147
107
self.velocity.x = 0
151
if the.keys:justPressed('up') and
152
(self.onGround or the.console.visible or
153
(love.timer.getTime() - self.leftWallAt < .1) ) then
111
if the.keys:justPressed('up') and self.onGround then
154
112
self.velocity.y = -400
155
113
self.jumping = true
189
147
self.jumping = false
193
if not self.text then
194
self.text = Text:new{wordWrap = true, width = 50, tint = {0,0,0}}
195
self.textfill = Fill:new{width = 54, border = {0,0,255}}
196
--the.view:add(self.textfill)
197
--the.view:add(self.text)
199
self.text.text = "Blah blah big text etc etc wrapping"
200
self.text:centerAround(self.x+16, self.y+16, 'horizontal')
201
_, texth = self.text:getSize()
202
self.text.y = self.y - texth - 4
203
self.textfill.x = self.text.x - 2
204
self.textfill.y = self.text.y - 2
205
self.textfill.height = texth + 4
207
150
Animation.update(self, elapsed)
209
152
collide = function (self, ...)
249
199
other[dir] = other[dir] + chg
252
function Sprite:update (elapsed)
253
if self.onUpdate then self:onUpdate(elapsed) end
256
202
GameView = View:extend {
257
203
onNew = function (self)
258
204
self:loadLayers('data/map.lua')
259
205
self.focus = the.player
260
206
self:clampTo(self.map)
262
the.recorder = Recorder:new{mousePosInterval = 9999}
263
the.app.meta:add(the.recorder)
265
the.recorder:startRecording()
267
local storage = Storage:new{filename = 'record.lua'}
269
--print(inspect(storage.data))
270
the.recorder.record = storage.data
271
the.recorder:startPlaying()
274
208
onUpdate = function (self)
275
--print('drawTook: ', the.drawTook)
277
210
--the.player:collide(self.map)
278
211
--self.map:collide(the.player)
280
-- draw = function (self, x, y)
281
-- View.draw(self, x, y)
283
-- love.graphics.print('FPS:' .. love.timer.getFPS(), 20, 20)
287
215
the.app = App:new {
290
217
self.view = GameView:new()
291
218
self.console:watch('onGround', 'the.player.onGround')
292
219
self.console:watch('onWall', 'the.player.onWall')
293
self.console:watch('updateTook', 'the.updateTook')
294
self.console:watch('drawTook', 'the.drawTook')
295
self.console:watch('recorder state', 'the.recorder.state')
297
--the.profiler = newProfiler('time', 2000)
298
--the.profiler = newProfiler()
299
--the.profiler:start()
301
221
onUpdate = function (self, dt)
302
if the.keys:justPressed('escape') then
305
local outfile = io.open( "profile.txt", "w+" )
306
the.profiler:report( outfile )
311
if not love.filesystem.remove('record.lua') then
312
error('could not remove record.lua')
314
local storage = Storage:new{
315
data = the.recorder.record,
316
filename = 'record.lua'
319
--print(inspect(the.recorder.record))
222
if the.keys:justPressed('escape') and
223
not self.console.visible then
325
update = function (self, dt)
326
the.updateStart = love.timer.getMicroTime()
328
if the.updateStart then
329
the.updateTook = love.timer.getMicroTime() - the.updateStart
b'\\ No newline at end of file'