pixie_dust 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README +16 -0
  5. data/README.md +29 -0
  6. data/Rakefile +1 -0
  7. data/game.js +9200 -0
  8. data/lib/corelib.js +3331 -0
  9. data/lib/pixie_dust/version.rb +3 -0
  10. data/lib/pixie_dust.rb +14 -0
  11. data/pixie.json +15 -0
  12. data/pixie_dust.gemspec +29 -0
  13. data/source/active_bounds.coffee +48 -0
  14. data/source/ageable.coffee +23 -0
  15. data/source/bounded.coffee +282 -0
  16. data/source/camera.coffee +138 -0
  17. data/source/camera.fade.coffee +69 -0
  18. data/source/camera.flash.coffee +69 -0
  19. data/source/camera.rotate.coffee +11 -0
  20. data/source/camera.shake.coffee +27 -0
  21. data/source/camera.zoom.coffee +25 -0
  22. data/source/camera.zsort.coffee +13 -0
  23. data/source/clampable.coffee +61 -0
  24. data/source/collidable.coffee +126 -0
  25. data/source/collision.coffee +272 -0
  26. data/source/collision_response.coffee +28 -0
  27. data/source/color.coffee +1113 -0
  28. data/source/color_table.coffee +2534 -0
  29. data/source/controllable.coffee +66 -0
  30. data/source/cooldown.coffee +82 -0
  31. data/source/debuggable.coffee +253 -0
  32. data/source/drawable.coffee +167 -0
  33. data/source/dust_emitter.coffee +36 -0
  34. data/source/easing.coffee +38 -0
  35. data/source/emitter.coffee +7 -0
  36. data/source/emitterable.coffee +68 -0
  37. data/source/engine.coffee +274 -0
  38. data/source/engine.collision.coffee +77 -0
  39. data/source/engine.data.coffee +23 -0
  40. data/source/engine.delay.coffee +41 -0
  41. data/source/engine.fps_counter.coffee +32 -0
  42. data/source/engine.game_state.coffee +86 -0
  43. data/source/engine.joysticks.coffee +47 -0
  44. data/source/engine.keyboard.coffee +17 -0
  45. data/source/engine.levels.coffee +69 -0
  46. data/source/engine.mouse.coffee +16 -0
  47. data/source/engine.selector.coffee +166 -0
  48. data/source/engine.stats.coffee +16 -0
  49. data/source/engine.tilemap.coffee +41 -0
  50. data/source/engine_background.coffee +32 -0
  51. data/source/expirable.coffee +47 -0
  52. data/source/flickerable.coffee +78 -0
  53. data/source/follow.coffee +65 -0
  54. data/source/framerate.coffee +42 -0
  55. data/source/game_object.coffee +181 -0
  56. data/source/game_object.effect.coffee +33 -0
  57. data/source/game_object.meter.coffee +191 -0
  58. data/source/game_over.coffee +40 -0
  59. data/source/game_state.coffee +67 -0
  60. data/source/game_state.save_state.coffee +76 -0
  61. data/source/game_state.single_camera.coffee +40 -0
  62. data/source/game_state_cameras.coffee +33 -0
  63. data/source/level_state.coffee +32 -0
  64. data/source/movable.coffee +57 -0
  65. data/source/oscillator.coffee +18 -0
  66. data/source/pixie_dust.coffee +2 -0
  67. data/source/resource_loader.coffee +35 -0
  68. data/source/rotatable.coffee +38 -0
  69. data/source/sprite.coffee +181 -0
  70. data/source/text_effect.coffee +74 -0
  71. data/source/text_effect.floating.coffee +22 -0
  72. data/source/text_screen.coffee +38 -0
  73. data/source/tilemap.coffee +56 -0
  74. data/source/timed_events.coffee +78 -0
  75. data/source/title_screen.coffee +38 -0
  76. data/source/tween.coffee +70 -0
  77. data/test/active_bounds.coffee +67 -0
  78. data/test/bounded.coffee +98 -0
  79. data/test/camera.coffee +29 -0
  80. data/test/clampable.coffee +18 -0
  81. data/test/collidable.coffee +51 -0
  82. data/test/collision.coffee +70 -0
  83. data/test/color.coffee +533 -0
  84. data/test/controllable.coffee +108 -0
  85. data/test/cooldown.coffee +116 -0
  86. data/test/debuggable.coffee +71 -0
  87. data/test/drawable.coffee +31 -0
  88. data/test/emitter.coffee +0 -0
  89. data/test/emitterable.coffee +15 -0
  90. data/test/engine.coffee +228 -0
  91. data/test/engine_data.coffee +12 -0
  92. data/test/engine_delay.coffee +14 -0
  93. data/test/engine_selector.coffee +100 -0
  94. data/test/expirable.coffee +35 -0
  95. data/test/flickerable.coffee +51 -0
  96. data/test/follow.coffee +34 -0
  97. data/test/game_object.coffee +78 -0
  98. data/test/game_object_effect.coffee +17 -0
  99. data/test/metered.coffee +33 -0
  100. data/test/movable.coffee +46 -0
  101. data/test/oscillator.coffee +28 -0
  102. data/test/resource_loader.coffee +7 -0
  103. data/test/rotatable.coffee +20 -0
  104. data/test/sprite.coffee +21 -0
  105. data/test/text.coffee +25 -0
  106. data/test/timed_events.coffee +23 -0
  107. data/test/tweening.coffee +18 -0
  108. metadata +233 -0
@@ -0,0 +1,274 @@
1
+ ( ->
2
+ ###*
3
+ The Engine controls the game world and manages game state. Once you
4
+ set it up and let it run it pretty much takes care of itself.
5
+
6
+ You can use the engine to add or remove objects from the game world.
7
+
8
+ There are several modules that can include to add additional capabilities
9
+ to the engine.
10
+
11
+ The engine fires events that you may bind listeners to. Event listeners
12
+ may be bound with <code>engine.bind(eventName, callback)</code>
13
+
14
+ @name Engine
15
+ @constructor
16
+ @param {Object} I Instance variables of the engine
17
+ ###
18
+
19
+ ###*
20
+ Observe or modify the
21
+ entity data before it is added to the engine.
22
+ @name beforeAdd
23
+ @methodOf Engine#
24
+ @event
25
+ @param {Object} entityData
26
+ ###
27
+
28
+ ###*
29
+ Observe or configure a <code>gameObject</code> that has been added
30
+ to the engine.
31
+ @name afterAdd
32
+ @methodOf Engine#
33
+ @event
34
+ @param {GameObject} object The object that has just been added to the
35
+ engine.
36
+ ###
37
+
38
+ ###*
39
+ Called when the engine updates all the game objects.
40
+
41
+ @name update
42
+ @methodOf Engine#
43
+ @event
44
+ @param {Number} elapsedTime The time in seconds that has elapsed since the last update.
45
+ ###
46
+
47
+ ###*
48
+ Called after the engine completes an update. Here it is
49
+ safe to modify the game objects array.
50
+
51
+ @name afterUpdate
52
+ @methodOf Engine#
53
+ @event
54
+ ###
55
+
56
+ ###*
57
+ Called before the engine draws the game objects on the canvas. The current camera transform is applied.
58
+
59
+ @name beforeDraw
60
+ @methodOf Engine#
61
+ @event
62
+ @params {PixieCanvas} canvas A reference to the canvas to draw on.
63
+ ###
64
+
65
+ ###*
66
+ Called after the engine draws on the canvas. The current camera transform is applied.
67
+
68
+ engine.bind "draw", (canvas) ->
69
+ # print some directions for the player
70
+ canvas.drawText
71
+ text: "Go this way =>"
72
+ x: 200
73
+ y: 200
74
+
75
+ @name draw
76
+ @methodOf Engine#
77
+ @event
78
+ @params {PixieCanvas} canvas A reference to the canvas to draw on.
79
+ ###
80
+
81
+ ###*
82
+ Called after the engine draws.
83
+
84
+ The current camera transform is not applied. This is great for
85
+ adding overlays.
86
+
87
+ engine.bind "overlay", (canvas) ->
88
+ # print the player's health. This will be
89
+ # positioned absolutely according to the viewport.
90
+ canvas.drawText
91
+ text: "HEALTH:"
92
+ position: Point(20, 20)
93
+
94
+ canvas.drawText
95
+ text: player.health()
96
+ position: Point(50, 20)
97
+
98
+ @name overlay
99
+ @methodOf Engine#
100
+ @event
101
+ @params {PixieCanvas} canvas A reference to the canvas to draw on.
102
+ ###
103
+
104
+ Engine = (I={}) ->
105
+ Object.reverseMerge I,
106
+ FPS: 60
107
+ paused: false
108
+
109
+ frameAdvance = false
110
+
111
+ running = false
112
+ startTime = +new Date()
113
+ lastStepTime = -Infinity
114
+ animLoop = (timestamp) ->
115
+ timestamp ||= +new Date()
116
+ msPerFrame = (1000 / I.FPS)
117
+
118
+ delta = timestamp - lastStepTime
119
+ remainder = delta - msPerFrame
120
+
121
+ if remainder > 0
122
+ lastStepTime = timestamp - Math.min(remainder, msPerFrame)
123
+ step()
124
+
125
+ if running
126
+ window.requestAnimationFrame(animLoop)
127
+
128
+ update = (elapsedTime) ->
129
+ self.trigger "beforeUpdate", elapsedTime
130
+ self.trigger "update", elapsedTime
131
+ self.trigger "afterUpdate", elapsedTime
132
+
133
+ draw = ->
134
+ return unless canvas = I.canvas
135
+
136
+ self.trigger "beforeDraw", canvas
137
+ self.trigger "draw", canvas
138
+ self.trigger "overlay", canvas
139
+
140
+ step = ->
141
+ if !I.paused || frameAdvance
142
+ elapsedTime = (1 / I.FPS)
143
+ update(elapsedTime)
144
+
145
+ draw()
146
+
147
+ self = Core(I).extend {
148
+ ###*
149
+ Start the game simulation.
150
+
151
+ engine.start()
152
+
153
+ @methodOf Engine#
154
+ @name start
155
+ ###
156
+ start: ->
157
+ unless running
158
+ running = true
159
+ window.requestAnimationFrame(animLoop)
160
+
161
+ ###*
162
+ Stop the simulation.
163
+
164
+ engine.stop()
165
+
166
+ @methodOf Engine#
167
+ @name stop
168
+ ###
169
+ stop: ->
170
+ running = false
171
+
172
+ ###*
173
+ Pause the game and step through 1 update of the engine.
174
+
175
+ engine.frameAdvance()
176
+
177
+ @methodOf Engine#
178
+ @name frameAdvance
179
+ ###
180
+ frameAdvance: ->
181
+ I.paused = true
182
+ frameAdvance = true
183
+ step()
184
+ frameAdvance = false
185
+
186
+ ###*
187
+ Resume the game.
188
+
189
+ engine.play()
190
+
191
+ @methodOf Engine#
192
+ @name play
193
+ ###
194
+ play: ->
195
+ I.paused = false
196
+
197
+ ###*
198
+ Toggle the paused state of the simulation.
199
+
200
+ engine.pause()
201
+
202
+ @methodOf Engine#
203
+ @name pause
204
+ @param {Boolean} [setTo] Force to pause by passing true or unpause by passing false.
205
+ ###
206
+ pause: (setTo) ->
207
+ if setTo?
208
+ I.paused = setTo
209
+ else
210
+ I.paused = !I.paused
211
+
212
+ ###*
213
+ Query the engine to see if it is paused.
214
+
215
+ engine.pause()
216
+
217
+ engine.paused()
218
+ # true
219
+
220
+ engine.play()
221
+
222
+ engine.paused()
223
+ # false
224
+
225
+ @methodOf Engine#
226
+ @name paused
227
+ ###
228
+ paused: ->
229
+ I.paused
230
+
231
+ ###*
232
+ Change the framerate of the game. The default framerate is 30 fps.
233
+
234
+ engine.setFramerate(60)
235
+
236
+ @methodOf Engine#
237
+ @name setFramerate
238
+ ###
239
+ setFramerate: (newFPS) ->
240
+ I.FPS = newFPS
241
+ self.stop()
242
+ self.start()
243
+
244
+ update: update
245
+ draw: draw
246
+ }
247
+
248
+ self.include Ageable
249
+
250
+ Engine.defaultModules.each (moduleName) ->
251
+ fullModuleName = "Engine.#{moduleName}"
252
+ throw "##{fullModuleName} is not a valid engine module" unless Engine[moduleName]
253
+
254
+ self.include fullModuleName
255
+
256
+ self.trigger "init"
257
+
258
+ return self
259
+
260
+ Engine.defaultModules = [
261
+ "Data"
262
+ "Keyboard"
263
+ "Mouse"
264
+ "Background"
265
+ "Delay"
266
+ "GameState"
267
+ "Selector"
268
+ "Collision"
269
+ "Tilemap"
270
+ "Levels"
271
+ ]
272
+
273
+ (exports ? this)["Engine"] = Engine
274
+ )()
@@ -0,0 +1,77 @@
1
+ ###*
2
+ The <code>Collision</code> module provides some simple collision detection methods to engine.
3
+
4
+ @name Collision
5
+ @fieldOf Engine
6
+ @module
7
+ @param {Object} I Instance variables
8
+ @param {Object} self Reference to the engine
9
+ ###
10
+ Engine.Collision = (I, self) ->
11
+ ###*
12
+ Detects collisions between a bounds and the game objects.
13
+
14
+ @name collides
15
+ @methodOf Engine#
16
+ @param bounds The bounds to check collisions with.
17
+ @param [sourceObject] An object to exclude from the results.
18
+ @returns {Boolean} true if the bounds object collides with any of the game objects, false otherwise.
19
+ ###
20
+ collides: (bounds, sourceObject, selector=".solid") ->
21
+ self.find(selector).inject false, (collided, object) ->
22
+ collided or (object != sourceObject) and object.collides(bounds)
23
+
24
+ ###*
25
+ Detects collisions between a bounds and the game objects.
26
+ Returns an array of objects colliding with the bounds provided.
27
+
28
+ @name collidesWith
29
+ @methodOf Engine#
30
+ @param bounds The bounds to check collisions with.
31
+ @param [sourceObject] An object to exclude from the results.
32
+ @returns {Array} An array of objects that collide with the given bounds.
33
+ ###
34
+ collidesWith: (bounds, sourceObject, selector=".solid") ->
35
+ self.find(selector).select (object) ->
36
+ object != sourceObject and object.collides(bounds)
37
+
38
+ ###*
39
+ Detects collisions between a ray and the game objects.
40
+
41
+ @name rayCollides
42
+ @methodOf Engine#
43
+ @param source The origin point
44
+ @param direction A point representing the direction of the ray
45
+ @param [sourceObject] An object to exclude from the results.
46
+ @param [selector] A selector to choos which objects in the engine to collide with
47
+ ###
48
+ rayCollides: ({source, direction, sourceObject, selector}) ->
49
+ selector ?= ""
50
+
51
+ hits = self.find(selector).map (object) ->
52
+ hit = (object != sourceObject) and Collision.rayRectangle(source, direction, object.centeredBounds())
53
+ hit.object = object if hit
54
+
55
+ hit
56
+
57
+ nearestDistance = Infinity
58
+ nearestHit = null
59
+
60
+ hits.each (hit) ->
61
+ if hit && (d = hit.distance(source)) < nearestDistance
62
+ nearestDistance = d
63
+ nearestHit = hit
64
+
65
+ nearestHit
66
+
67
+ # TODO Allow specification of collision type (i.e. circular)
68
+ objectsUnderPoint: (point, selector="") ->
69
+ bounds = {
70
+ x: point.x
71
+ y: point.y
72
+ width: 0
73
+ height: 0
74
+ }
75
+
76
+ self.find(selector).select (object) ->
77
+ object.collides(bounds)
@@ -0,0 +1,23 @@
1
+ ###*
2
+ The <code>Data</code> module provides methods to store global and persistent data in the engine.
3
+
4
+ engine.data.score = 0
5
+ engine.data.score += 10
6
+
7
+ engine.data.score # => 10
8
+
9
+ @name Data
10
+ @fieldOf Engine
11
+ @module
12
+ @param {Object} I Instance variables
13
+ @param {Object} self Reference to the engine
14
+ ###
15
+ Engine.Data = (I={}, self) ->
16
+ Object.reverseMerge I,
17
+ data: {}
18
+
19
+ Object.defineProperty self, 'data',
20
+ get: ->
21
+ I.data
22
+
23
+ {}
@@ -0,0 +1,41 @@
1
+ ###*
2
+ The <code>Delay</code> module provides methods to trigger events after a number of steps have passed.
3
+
4
+ @name Delay
5
+ @fieldOf Engine
6
+ @module
7
+ @param {Object} I Instance variables
8
+ @param {Object} self Reference to the engine
9
+ ###
10
+ Engine.Delay = (I, self) ->
11
+ delayedEvents = []
12
+
13
+ self.bind 'afterUpdate', (elapsedTime) ->
14
+ [delayedEvents, firingEvents] = delayedEvents.partition (event) ->
15
+ (event.delay -= elapsedTime) >= 0
16
+
17
+ firingEvents.each (event) ->
18
+ event.callback()
19
+
20
+ return
21
+
22
+ ###*
23
+ Execute a callback after a number of seconds have passed.
24
+
25
+ engine.delay 5, ->
26
+ engine.add
27
+ class: "Ghost"
28
+
29
+ @name delay
30
+ @methodOf Engine#
31
+ @param {Number} seconds The number of steps to wait before executing the callback
32
+ @param {Function} callback The callback to be executed.
33
+
34
+ @returns {Engine} self
35
+ ###
36
+ delay: (seconds, callback) ->
37
+ delayedEvents.push
38
+ delay: seconds
39
+ callback: callback
40
+
41
+ return self
@@ -0,0 +1,32 @@
1
+ ###*
2
+ The <code>FPSCounter</code> module tracks and displays the framerate.
3
+
4
+ window.engine = Engine
5
+ ...
6
+ includedModules: ["FPSCounter"]
7
+ FPSColor: "#080"
8
+
9
+ @name FPSCounter
10
+ @fieldOf Engine
11
+ @module
12
+
13
+ @param {Object} I Instance variables
14
+ @param {Object} self Reference to the engine
15
+ ###
16
+ Engine.FPSCounter = (I, self) ->
17
+ Object.reverseMerge I,
18
+ showFPS: true
19
+ FPSColor: "#FFF"
20
+
21
+ framerate = Framerate()
22
+
23
+ self.bind "overlay", (canvas) ->
24
+ if I.showFPS
25
+ canvas.font("bold 9pt consolas, 'Courier New', 'andale mono', 'lucida console', monospace")
26
+
27
+ canvas.drawText
28
+ color: I.FPSColor
29
+ position: Point(6, 18)
30
+ text: "fps: #{framerate.fps}"
31
+
32
+ framerate.rendered()
@@ -0,0 +1,86 @@
1
+ Engine.GameState = (I, self) ->
2
+ Object.reverseMerge I,
3
+ currentState: GameState()
4
+
5
+ requestedState = null
6
+
7
+ # The idea is that all the engine#beforeUpdate triggers happen
8
+ # before the state beforeUpdate triggers, then the state update
9
+ # then the state after update, then the engine after update
10
+ # like a layered cake with states in the middle.
11
+ self.bind "update", (elapsedTime) ->
12
+ I.currentState.trigger "beforeUpdate", elapsedTime
13
+ I.currentState.trigger "update", elapsedTime
14
+ I.currentState.trigger "afterUpdate", elapsedTime
15
+
16
+ self.bind "afterUpdate", ->
17
+ # Handle state change
18
+ if requestedState?
19
+ I.currentState.trigger "exit", requestedState
20
+ self.trigger 'stateExited', I.currentState
21
+
22
+ previousState = I.currentState
23
+ I.currentState = requestedState
24
+
25
+ I.currentState.trigger "enter", previousState
26
+ self.trigger 'stateEntered', I.currentState
27
+
28
+ requestedState = null
29
+
30
+ self.bind "draw", (canvas) ->
31
+ I.currentState.trigger "beforeDraw", canvas
32
+ I.currentState.trigger "draw", canvas
33
+ I.currentState.trigger "overlay", canvas
34
+
35
+
36
+ # Just pass through to the current state
37
+ add: (classNameOrEntityData, entityData={}) ->
38
+ # Allow optional add "Class", data form
39
+ if classNameOrEntityData.isString?()
40
+ entityData.class = classNameOrEntityData
41
+ else
42
+ entityData = classNameOrEntityData
43
+
44
+ self.trigger "beforeAdd", entityData
45
+ object = I.currentState.add(entityData)
46
+ self.trigger "afterAdd", object
47
+
48
+ return object
49
+
50
+ camera: (n=0) ->
51
+ self.cameras()[n]
52
+
53
+ cameras: (newCameras) ->
54
+ if newCameras?
55
+ I.currentState.cameras(newCameras)
56
+
57
+ return self
58
+ else
59
+ I.currentState.cameras()
60
+
61
+ fadeIn: (options={}) ->
62
+ self.cameras().invoke('fadeIn', options)
63
+
64
+ fadeOut: (options={}) ->
65
+ self.cameras().invoke('fadeOut', options)
66
+
67
+ flash: (options={}) ->
68
+ self.camera(options.camera).flash(options)
69
+
70
+ objects: ->
71
+ I.currentState.objects()
72
+
73
+ setState: (newState) ->
74
+ requestedState = newState
75
+
76
+ shake: (options={}) ->
77
+ self.camera(options.camera).shake(options)
78
+
79
+ saveState: ->
80
+ I.currentState.saveState()
81
+
82
+ loadState: (newState) ->
83
+ I.currentState.loadState(newState)
84
+
85
+ reload: ->
86
+ I.currentState.reload()
@@ -0,0 +1,47 @@
1
+ ###*
2
+ The <code>Joysticks</code> module gives the engine access to joysticks.
3
+
4
+ # First you need to add the joysticks module to the engine
5
+ window.engine = Engine
6
+ ...
7
+ includedModules: ["Joysticks"]
8
+ # Then you need to get a controller reference
9
+ # id = 0 for player 1, etc.
10
+ controller = engine.controller(id)
11
+
12
+ # Point indicating direction primary axis is held
13
+ direction = controller.position()
14
+
15
+ # Check if buttons are held
16
+ controller.actionDown("A")
17
+ controller.actionDown("B")
18
+ controller.actionDown("X")
19
+ controller.actionDown("Y")
20
+
21
+ @name Joysticks
22
+ @fieldOf Engine
23
+ @module
24
+
25
+ @param {Object} I Instance variables
26
+ @param {Object} self Reference to the engine
27
+ ###
28
+ Engine.Joysticks = (I, self) ->
29
+ Joysticks.init()
30
+
31
+ self.bind "update", ->
32
+ # Handle hotswapping, does nothing if already initialized
33
+ Joysticks.init()
34
+
35
+ # Update the joysticks, this also fires joystick events to listeners
36
+ Joysticks.update()
37
+
38
+ ###*
39
+ Get a controller for a given joystick id.
40
+
41
+ @name controller
42
+ @methodOf Engine.Joysticks#
43
+
44
+ @param {Number} i The joystick id to get the controller of.
45
+ ###
46
+ controller: (i) ->
47
+ Joysticks.getController(i)
@@ -0,0 +1,17 @@
1
+ ###*
2
+ This module sets up the keyboard inputs for each engine update.
3
+
4
+ @name Keyboard
5
+ @fieldOf Engine
6
+ @module
7
+ @param {Object} I Instance variables
8
+ @param {Object} self Reference to the engine
9
+ ###
10
+ Engine.Keyboard = (I, self) ->
11
+ self.bind "beforeUpdate", ->
12
+ # TODO: Make a Gamepad/Keyboard input module that has web and XNA
13
+ # implementations
14
+ updateKeys?()
15
+
16
+ return {}
17
+
@@ -0,0 +1,69 @@
1
+ ###*
2
+ This module provides methods for transitioning between levels.
3
+
4
+ @name Levels
5
+ @fieldOf Engine
6
+ @module
7
+ @param {Object} I Instance variables
8
+ @param {Object} self Reference to the engine
9
+ ###
10
+ Engine.Levels = (I, self) ->
11
+ Object.reverseMerge I,
12
+ levels: []
13
+ currentLevel: -1
14
+ currentLevelName: null
15
+
16
+ I.transitioning = false
17
+
18
+ loadLevel = (level) ->
19
+ unless I.transitioning
20
+ I.transitioning = true
21
+
22
+ levelState = LevelState
23
+ level: level
24
+
25
+ I.currentLevelName = level
26
+ engine.setState levelState
27
+
28
+ ###*
29
+ Load map for the next level.
30
+
31
+ engine.nextLevel()
32
+
33
+ @name nextLevel
34
+ @methodOf Engine#
35
+ ###
36
+ nextLevel: ->
37
+ unless I.transitioning
38
+ I.currentLevel += 1
39
+
40
+ if level = I.levels[I.currentLevel]
41
+ loadLevel level
42
+ else
43
+ engine.setState GameOver()
44
+
45
+ ###*
46
+ Load map named <code>level</code>
47
+
48
+ engine.goToLevel 'bossFight'
49
+
50
+ @name goToLevel
51
+ @methodOf Engine#
52
+ ###
53
+ goToLevel: (level) ->
54
+ #TODO Handle integer levels?
55
+ loadLevel level
56
+
57
+ ###*
58
+ Reload the current level. Useful for retrying after a player dies.
59
+
60
+ engine.reloadLevel()
61
+
62
+ @name reloadLevel
63
+ @methodOf Engine#
64
+ ###
65
+ restartLevel: ->
66
+ loadLevel I.currentLevelName
67
+
68
+ reloadLevel: ->
69
+ self.restartLevel()
@@ -0,0 +1,16 @@
1
+ ###*
2
+ This module sets up the mouse inputs for each engine update.
3
+
4
+ @name Mouse
5
+ @fieldOf Engine
6
+ @module
7
+ @param {Object} I Instance variables
8
+ @param {Object} self Reference to the engine
9
+ ###
10
+ Engine.Mouse = (I, self) ->
11
+ self.bind "beforeUpdate", ->
12
+ # TODO: Make a Gamepad/Keyboard/Mouse input module that has web and XNA
13
+ # implementations
14
+ updateMouse?()
15
+
16
+ return {}