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
data/test/color.coffee ADDED
@@ -0,0 +1,533 @@
1
+ equalEnough = (actual, expected, tolerance=3, message) ->
2
+ message ||= "" + expected + " within " + tolerance + " of " + actual
3
+ ok(expected + tolerance >= actual && expected - tolerance <= actual, message)
4
+
5
+ module "Color"
6
+
7
+ test "r, g, b default to 0, a defaults to 1", ->
8
+ color = Color()
9
+
10
+ equal color.r, 0
11
+ equal color.g, 0
12
+ equal color.b, 0
13
+ equal color.a, 0
14
+
15
+ test "accepts a single array of length 3", ->
16
+ color = Color([255, 1, 2])
17
+
18
+ equalEnough color.r, 255
19
+ equalEnough color.g, 1
20
+ equalEnough color.b, 2
21
+
22
+ test "accepts a single array of length 4", ->
23
+ color = Color([255, 4, 3, 0.8])
24
+
25
+ equalEnough color.r, 255
26
+ equalEnough color.g, 4
27
+ equalEnough color.b, 3
28
+ equalEnough color.a, 0.8
29
+
30
+ test "accepts an array of length 3 as the first argument and an alpha value as the second", ->
31
+ color = Color([100, 5, 3], 0.4)
32
+
33
+ equalEnough color.r, 100
34
+ equalEnough color.g, 5
35
+ equalEnough color.b, 3
36
+ equalEnough color.a, 0.4
37
+
38
+ test "accepts an array of length 4 as the first argument and an alpha value. The alpha value passed as the second argument overrides the alpha in the array", ->
39
+ color = Color([4, 20, 90, 0.1], 0.6)
40
+
41
+ equalEnough color.r, 4
42
+ equalEnough color.g, 20
43
+ equalEnough color.b, 90
44
+ equalEnough color.a, 0.6
45
+
46
+ test "accepts an rgb string as the first argument and an alpha value as the second", ->
47
+ color = Color('rgb(255, 40, 30)', 0.4)
48
+
49
+ equalEnough color.r, 255
50
+ equalEnough color.g, 40
51
+ equalEnough color.b, 30
52
+ equalEnough color.a, 0.4
53
+
54
+ test "accepts an rgba string as the first argument and an alpha value as the second. The alpha value takes precedence over the alpha from the rgba string", ->
55
+ color = Color('rgba(30, 20, 15, 0.8)', 0.35)
56
+
57
+ equal color.r, 30
58
+ equal color.g, 20
59
+ equal color.b, 15
60
+ equal color.a, 0.35
61
+
62
+ test "parses rgba(0, 0, 0, 0) correctly", ->
63
+ color = Color('rgba(0, 0, 0, 0)')
64
+
65
+ equal color.r, 0
66
+ equal color.g, 0
67
+ equal color.b, 0
68
+ equal color.a, 0
69
+
70
+ test "parses rgb(0, 0, 0) correctly", ->
71
+ color = Color('rgba(0, 0, 0)')
72
+
73
+ equal color.r, 0
74
+ equal color.g, 0
75
+ equal color.b, 0
76
+ equal color.a, 1
77
+
78
+ test "parses hsla(60, 1, 0.5, 0) correctly", ->
79
+ color = Color('hsla(60, 1, 0.5, 0)')
80
+
81
+ equal color.r, 255
82
+ equal color.g, 255
83
+ equal color.b, 0
84
+ equal color.a, 0
85
+
86
+ test "parses hsl(60, 1, 0.5) correctly", ->
87
+ color = Color('hsl(60, 1, 0.5)')
88
+
89
+ equal color.r, 255
90
+ equal color.g, 255
91
+ equal color.b, 0
92
+ equal color.a, 1
93
+
94
+ test "accepts an hsl string as the first argument and an alpha value as the second", ->
95
+ color = Color('hsl(63, 0.4, 0.3)', 0.21)
96
+
97
+ equalEnough color.r, 104
98
+ equalEnough color.g, 107
99
+ equalEnough color.b, 46
100
+ equalEnough color.a, 0.21
101
+
102
+ test "accepts an hsla string as the first argument and an alpha value as the second. The alpha value takes precedence over the hsla string alpha value", ->
103
+ color = Color('hsla(45, 0.3, 0.5, 0.1)', 0.47)
104
+
105
+ equalEnough color.r, 166
106
+ equalEnough color.g, 147
107
+ equalEnough color.b, 89
108
+ equalEnough color.a, 0.47
109
+
110
+ test "should have peridot", ->
111
+ color = Color('peridot')
112
+
113
+ equals color.toHex(), '#87b84a'
114
+
115
+ test "accepts hex value of length 3 as first argument and alpha value as second argument", ->
116
+ color = Color('#ff0', 0.5)
117
+
118
+ equalEnough color.r, 255
119
+ equalEnough color.g, 255
120
+ equalEnough color.b, 0
121
+ equalEnough color.a, 0.5
122
+
123
+ test "accepts hex value of length 4 as first argument and alpha value as second argument. The alpha value takes precedence over the alpha from the hex string.", ->
124
+ color = Color('#ef3c', 0.3)
125
+
126
+ equalEnough color.r, 238
127
+ equalEnough color.g, 255
128
+ equalEnough color.b, 51
129
+ equalEnough color.a, 0.3
130
+
131
+ test "accepts hex value of length 6 as first argument and alpha value as second argument", ->
132
+ color = Color('#de34ab', 0.27)
133
+
134
+ equalEnough color.r, 222
135
+ equalEnough color.g, 52
136
+ equalEnough color.b, 171
137
+ equalEnough color.a, 0.27
138
+
139
+ test "accepts hex value of length 8 as first argument and alpha value as second argument. Alpha value takes precedence over hex alpha.", ->
140
+ color = Color('#ab45cd', 0.59)
141
+
142
+ equalEnough color.r, 171
143
+ equalEnough color.g, 69
144
+ equalEnough color.b, 205
145
+ equalEnough color.a, 0.59
146
+
147
+ test "accepts hex string of length 3", ->
148
+ color = Color('#df2')
149
+
150
+ equalEnough color.r, 221
151
+ equalEnough color.g, 255
152
+ equalEnough color.b, 34
153
+ equalEnough color.a, 1.0
154
+
155
+ test "accepts hex string of length 4", ->
156
+ color = Color('#c987')
157
+
158
+ equalEnough color.r, 204
159
+ equalEnough color.g, 153
160
+ equalEnough color.b, 136
161
+ equalEnough color.a.toFixed(2), 0.47
162
+
163
+ test "accepts hex string of length 6", ->
164
+ color = Color('#cdef12')
165
+
166
+ equalEnough color.r, 205
167
+ equalEnough color.g, 239
168
+ equalEnough color.b, 18
169
+ equalEnough color.a, 1.0
170
+
171
+ test "accepts hex string of length 8", ->
172
+ color = Color('#ef1234af')
173
+
174
+ equalEnough color.r, 239
175
+ equalEnough color.g, 18
176
+ equalEnough color.b, 52
177
+ equalEnough color.a.toFixed(2), 0.69
178
+
179
+ test "accepts 3 numeric values", ->
180
+ color = Color(34, 54, 39)
181
+
182
+ equalEnough color.r, 34
183
+ equalEnough color.g, 54
184
+ equalEnough color.b, 39
185
+ equalEnough color.a, 1.0
186
+
187
+ test "accepts 4 numeric values", ->
188
+ color = Color(23, 43, 100, 0.32)
189
+
190
+ equalEnough color.r, 23
191
+ equalEnough color.g, 43
192
+ equalEnough color.b, 100
193
+ equalEnough color.a, 0.32
194
+
195
+ test "accepts a color object", ->
196
+ color = Color(23, 54, 49, 1)
197
+
198
+ newColor = Color(color)
199
+
200
+ equal newColor.r, 23
201
+ equal newColor.g, 54
202
+ equal newColor.b, 49
203
+ equal newColor.a, 1
204
+
205
+ test "invalid color throws error", ->
206
+ raises ->
207
+ Color("A Fake Color")
208
+
209
+ test "#copy", ->
210
+ color = Color(123, 231, 2)
211
+ copiedColor = color.copy()
212
+
213
+ ok color.equal(copiedColor)
214
+ ok color != copiedColor
215
+
216
+ test "#equal", ->
217
+ color1 = Color(255, 255, 255, 1)
218
+ color2 = Color([255, 255, 255])
219
+
220
+ ok color1.equal(color2)
221
+
222
+ test "#toString", ->
223
+ noAlpha = Color(30, 40, 23)
224
+ withAlpha = Color(29, 49, 50, 0.45)
225
+ decimalValues = Color(34.7, 52.2, 50.1, 0.45)
226
+
227
+ equal noAlpha.toString(), "rgba(30, 40, 23, 1)"
228
+ equal withAlpha.toString(), "rgba(29, 49, 50, 0.45)"
229
+ equal decimalValues.toString(), "rgba(35, 52, 50, 0.45)"
230
+
231
+ test "#toHex", ->
232
+ color = Color(23, 45, 100)
233
+
234
+ equal color.toHex(), "#172d64"
235
+ equal color.toHex(false), "172d64"
236
+
237
+ test "#toHsl", ->
238
+ color = Color(45, 29, 20)
239
+
240
+ hsl = color.toHsl()
241
+
242
+ equalEnough hsl[0].round(), 22
243
+ equalEnough hsl[1].toFixed(2), 0.38
244
+ equalEnough hsl[2].toFixed(2), 0.13
245
+ equalEnough hsl[3], 1.0
246
+
247
+ test "#hue", ->
248
+ color = Color(20, 45, 49)
249
+ color.hue(60)
250
+
251
+ equalEnough color.r, 51
252
+ equalEnough color.g, 51
253
+ equalEnough color.b, 21
254
+ equalEnough color.a, 1.0
255
+
256
+ test "#saturation", ->
257
+ color = Color(40, 39, 29)
258
+ color.saturation(0.3)
259
+
260
+ equalEnough color.r, 46
261
+ equalEnough color.g, 45
262
+ equalEnough color.b, 25
263
+ equalEnough color.a, 1.0
264
+
265
+ test "#lightness", ->
266
+ color = Color(4, 200, 49)
267
+ color.lightness(0.47)
268
+
269
+ equalEnough color.r, 5
270
+ equalEnough color.g, 235
271
+ equalEnough color.b, 58
272
+ equalEnough color.a, 1.0
273
+
274
+ test "#shiftHue", ->
275
+ color = Color(34, 54, 239).shiftHue(20)
276
+
277
+ equalEnough color.r, 84
278
+ equalEnough color.g, 37
279
+ equalEnough color.b, 239
280
+ equalEnough color.a, 1.0
281
+
282
+ test "#shiftHue$", ->
283
+ color = Color(34, 54, 239)
284
+
285
+ color.shiftHue$(60)
286
+
287
+ equalEnough color.r, 218
288
+ equalEnough color.g, 37
289
+ equalEnough color.b, 239
290
+ equalEnough color.a, 1.0
291
+
292
+ test "#channels", ->
293
+ no_alpha = Color(128, 2, 50)
294
+
295
+ no_alpha_channels = no_alpha.channels()
296
+
297
+ equal no_alpha_channels[0], 128
298
+ equal no_alpha_channels[1], 2
299
+ equal no_alpha_channels[2], 50
300
+ equal no_alpha_channels[3], 1
301
+
302
+ alpha = Color(128, 2, 50, 0.3)
303
+
304
+ alpha_channels = alpha.channels()
305
+
306
+ equal alpha_channels[0], 128
307
+ equal alpha_channels[1], 2
308
+ equal alpha_channels[2], 50
309
+ equal alpha_channels[3], 0.3
310
+
311
+ test "#complement", ->
312
+ color = Color(10, 30, 50).complement()
313
+
314
+ equalEnough color.r, 51
315
+ equalEnough color.g, 31
316
+ equalEnough color.b, 10
317
+ equalEnough color.a, 1.0
318
+
319
+ test "#complement$", ->
320
+ color = Color(10, 30, 50)
321
+
322
+ color.complement$()
323
+
324
+ equalEnough color.r, 51
325
+ equalEnough color.g, 31
326
+ equalEnough color.b, 10
327
+ equalEnough color.a, 1.0
328
+
329
+ test "#grayscale", ->
330
+ color = Color(30, 40, 29).grayscale()
331
+
332
+ equalEnough color.r, 35
333
+ equalEnough color.g, 35
334
+ equalEnough color.b, 35
335
+ equalEnough color.a, 1.0
336
+
337
+ test "#grayscale$", ->
338
+ color = Color(30, 40, 29)
339
+
340
+ color.grayscale$()
341
+
342
+ equalEnough color.r, 35
343
+ equalEnough color.g, 35
344
+ equalEnough color.b, 35
345
+ equalEnough color.a, 1.0
346
+
347
+ test "#saturate", ->
348
+ color = Color(100, 200, 150).saturate(0.3)
349
+
350
+ equalEnough color.r, 69
351
+ equalEnough color.g, 232
352
+ equalEnough color.b, 150
353
+ equalEnough color.a, 1.0
354
+
355
+ test "#saturate$", ->
356
+ color = Color(100, 200, 150)
357
+
358
+ color.saturate$(0.3)
359
+
360
+ equalEnough color.r, 69
361
+ equalEnough color.g, 232
362
+ equalEnough color.b, 150
363
+ equalEnough color.a, 1.0
364
+
365
+ test "#desaturate", ->
366
+ color = Color(69, 232, 150).desaturate(0.3)
367
+
368
+ equalEnough color.r, 100
369
+ equalEnough color.g, 200
370
+ equalEnough color.b, 150
371
+ equalEnough color.a, 1.0
372
+
373
+ test "#desaturate$", ->
374
+ color = Color(69, 232, 150)
375
+
376
+ color.desaturate$(0.3)
377
+
378
+ equalEnough color.r, 100
379
+ equalEnough color.g, 200
380
+ equalEnough color.b, 150
381
+ equalEnough color.a, 1.0
382
+
383
+ test "#darken", ->
384
+ color = Color(45, 64, 39).darken(0.1)
385
+
386
+ equalEnough color.r, 22
387
+ equalEnough color.g, 32
388
+ equalEnough color.b, 19
389
+ equalEnough color.a, 1.0
390
+
391
+ test "#darken$", ->
392
+ color = Color(45, 64, 39)
393
+
394
+ color.darken$(0.1)
395
+
396
+ equalEnough color.r, 22
397
+ equalEnough color.g, 32
398
+ equalEnough color.b, 19
399
+ equalEnough color.a, 1.0
400
+
401
+ test "#lighten", ->
402
+ color = Color(22, 32, 19).lighten(0.1)
403
+
404
+ equalEnough color.r, 45
405
+ equalEnough color.g, 64
406
+ equalEnough color.b, 39
407
+ equalEnough color.a, 1.0
408
+
409
+ test "#lighten$", ->
410
+ color = Color(22, 32, 19)
411
+
412
+ color.lighten$(0.1)
413
+
414
+ equalEnough color.r, 45
415
+ equalEnough color.g, 64
416
+ equalEnough color.b, 39
417
+ equalEnough color.a, 1.0
418
+
419
+ test "#mixWith", ->
420
+ color1 = Color(50, 40, 60, 0.3)
421
+ color2 = Color(10, 5, 16, 0.2)
422
+
423
+ mixedColor = color1.mixWith(color2)
424
+
425
+ equalEnough mixedColor.r, 30
426
+ equalEnough mixedColor.g, (45 / 2).round()
427
+ equalEnough mixedColor.b, (76 / 2).round()
428
+ equalEnough mixedColor.a, 0.5 / 2
429
+
430
+ weightedMixedColor = color1.mixWith(color2, 0.1)
431
+
432
+ equalEnough weightedMixedColor.r, ((50 * 0.1) + (10 * 0.9)).round()
433
+ equalEnough weightedMixedColor.g, ((40 * 0.1) + (5 * 0.9)).round()
434
+ equalEnough weightedMixedColor.b, ((60 * 0.1) + (16 * 0.9)).round()
435
+ equalEnough weightedMixedColor.a, (0.3 * 0.1) + (0.2 * 0.9)
436
+
437
+ test "#mixWith$", ->
438
+ color1 = Color(50, 40, 60, 0.3)
439
+ color2 = Color(10, 5, 16, 0.2)
440
+
441
+ color3 = Color(50, 40, 60, 0.3)
442
+
443
+ color1.mixWith$(color2)
444
+
445
+ equalEnough color1.r, 30
446
+ equalEnough color1.g, (45 / 2).round()
447
+ equalEnough color1.b, (76 / 2).round()
448
+ equalEnough color1.a, 0.5 / 2
449
+
450
+ color3.mixWith$(color2, 0.1)
451
+
452
+ equalEnough color3.r, ((50 * 0.1) + (10 * 0.9)).round()
453
+ equalEnough color3.g, ((40 * 0.1) + (5 * 0.9)).round()
454
+ equalEnough color3.b, ((60 * 0.1) + (16 * 0.9)).round()
455
+ equalEnough color3.a, (0.3 * 0.1) + (0.2 * 0.9)
456
+
457
+ test "Color.random", ->
458
+ color = Color.random()
459
+
460
+ ok 0 <= color.r <= 255
461
+ ok 0 <= color.g <= 255
462
+ ok 0 <= color.b <= 255
463
+ equalEnough color.a, 1.0
464
+
465
+ test "Color.mix", ->
466
+ mixedColor = Color.mix(
467
+ Color("red"),
468
+ Color("sky blue")
469
+ )
470
+
471
+ equalEnough mixedColor.r, 173
472
+ equalEnough mixedColor.g, 94
473
+ equalEnough mixedColor.b, 127
474
+ equalEnough mixedColor.a, 1
475
+
476
+ weightedMixedColor = Color.mix(Color(0, 255, 0, 1), Color(255, 0, 255, 0.6), 0.1)
477
+
478
+ equalEnough weightedMixedColor.r, ((0 * 0.1) + (255 * 0.9)).round()
479
+ equalEnough weightedMixedColor.g, ((255 * 0.1) + (0 * 0.9)).round()
480
+ equalEnough weightedMixedColor.b, ((0 * 0.1) + (255 * 0.9)).round()
481
+ equalEnough weightedMixedColor.a, (1 * 0.1) + (0.6 * 0.9)
482
+
483
+ test "accepts named colors", ->
484
+ white = Color("white")
485
+
486
+ equalEnough white.r, 255
487
+ equalEnough white.g, 255
488
+ equalEnough white.b, 255
489
+ equalEnough white.a, 1.0
490
+
491
+ piPink = Color("Paul Irish Pink")
492
+
493
+ equalEnough piPink.r, 255
494
+ equalEnough piPink.g, 94
495
+ equalEnough piPink.b, 153
496
+ equalEnough piPink.a, 1.0
497
+
498
+ test "#transparentize", ->
499
+ color = Color(0, 0, 0, 1)
500
+
501
+ transparentColor = color.transparentize(0.5)
502
+
503
+ equal color.a, 1
504
+ equal transparentColor.a, 0.5
505
+
506
+ test "#transparentize$", ->
507
+ color = Color(0, 0, 0, 1)
508
+
509
+ equal color.a, 1
510
+
511
+ color.transparentize$(0.5)
512
+
513
+ equal color.a, 0.5
514
+
515
+ test "#opacify", ->
516
+ color = Color(0, 0, 0, 0)
517
+
518
+ opaqueColor = color.opacify(0.5)
519
+
520
+ equal color.a, 0
521
+ equal opaqueColor.a, 0.5
522
+
523
+ test "#opacify$", ->
524
+ color = Color(0, 0, 0, 0)
525
+
526
+ equal color.a, 0
527
+
528
+ color.opacify$(0.5)
529
+
530
+ equal color.a, 0.5
531
+
532
+ module()
533
+
@@ -0,0 +1,108 @@
1
+ module "Controllable"
2
+
3
+ # sets up player object before each test
4
+ QUnit.testStart = ->
5
+ window.player = GameObject
6
+ x: 10
7
+ y: 20
8
+ width: 10
9
+ height: 20
10
+ speed: 3
11
+
12
+ player.include Controllable
13
+
14
+ # Mock the keydown object
15
+ window.keydown = {}
16
+
17
+ test "should update velocity while left is held", ->
18
+ window.keydown.left = true
19
+
20
+ player.update()
21
+
22
+ equals player.I.velocity.x, -3
23
+
24
+ window.keydown.left = false
25
+
26
+ player.update()
27
+
28
+ equals player.I.velocity.x, 0
29
+
30
+ test "should move player right while key is pressed", ->
31
+ window.keydown.right = true
32
+
33
+ player.update()
34
+
35
+ equals player.I.velocity.x, 3
36
+
37
+ window.keydown.right = false
38
+
39
+ player.update()
40
+
41
+ equals player.I.velocity.x, 0
42
+
43
+ test "should move player up while key is pressed", ->
44
+ window.keydown.up = true
45
+
46
+ player.update()
47
+
48
+ equals player.I.velocity.y, -3
49
+
50
+ window.keydown.up = false
51
+
52
+ player.update()
53
+
54
+ equals player.I.velocity.y, 0
55
+
56
+ test "should move player down while key is pressed", ->
57
+ window.keydown.down = true
58
+
59
+ player.update()
60
+
61
+ equals player.I.velocity.y, 3
62
+
63
+ window.keydown.down = false
64
+
65
+ player.update()
66
+
67
+ equals player.I.velocity.y, 0
68
+
69
+ test "should handle moving diagonally", ->
70
+ window.keydown.left = true
71
+ window.keydown.up = true
72
+
73
+ player.update()
74
+
75
+ equals player.I.velocity.x, Point(-1, -1).norm().x * player.I.speed
76
+ equals player.I.velocity.y, Point(-1, -1).norm().y * player.I.speed
77
+
78
+ test "should handle tracking facing direction diagonally", ->
79
+ window.keydown.left = true
80
+ window.keydown.up = true
81
+
82
+ player.update()
83
+
84
+ equals player.I.facing.x, Point(-1, -1).norm().x
85
+ equals player.I.facing.y, Point(-1, -1).norm().y
86
+
87
+ window.keydown.left = false
88
+ window.keydown.up = false
89
+
90
+ equals player.I.facing.x, Point(-1, -1).norm().x
91
+ equals player.I.facing.y, Point(-1, -1).norm().y
92
+
93
+ test "should correctly track facing direction", ->
94
+ ok player.I.facing.equal(Point(1, 0))
95
+
96
+ window.keydown.left = true
97
+
98
+ player.update()
99
+
100
+ ok player.I.facing.equal(Point(-1, 0))
101
+
102
+ window.keydown.left = false
103
+
104
+ player.update()
105
+
106
+ ok player.I.facing.equal(Point(-1, 0))
107
+
108
+ module()