entityjs 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. data/.gitignore +7 -6
  2. data/.rspec +2 -0
  3. data/README.md +170 -49
  4. data/Rakefile +9 -0
  5. data/bin/entityjs +24 -14
  6. data/entityjs.gemspec +15 -9
  7. data/lib/entityjs/assets.rb +167 -0
  8. data/lib/entityjs/command.rb +52 -27
  9. data/lib/entityjs/commands/build.rb +128 -0
  10. data/lib/entityjs/commands/comp.rb +74 -0
  11. data/lib/entityjs/commands/font.rb +73 -0
  12. data/lib/entityjs/commands/new.rb +59 -0
  13. data/lib/entityjs/commands/server.rb +54 -0
  14. data/lib/entityjs/commands/templates.rb +28 -0
  15. data/lib/entityjs/commands/test.rb +69 -0
  16. data/lib/entityjs/config.rb +130 -0
  17. data/lib/entityjs/dirc.rb +184 -0
  18. data/lib/entityjs/parsers/parse_tmx.rb +41 -0
  19. data/lib/entityjs/parsers/parse_xml.rb +39 -0
  20. data/lib/entityjs/version.rb +1 -1
  21. data/lib/entityjs.rb +53 -0
  22. data/license.txt +1 -1
  23. data/public/play.html +122 -0
  24. data/public/qunit/qunit.css +226 -0
  25. data/public/qunit/qunit.entity.js +190 -0
  26. data/public/qunit/qunit.input.js +200 -0
  27. data/public/qunit/qunit.js +1598 -0
  28. data/public/qunit/qunit.mock.js +97 -0
  29. data/public/tests.html +45 -0
  30. data/spec/javascripts/helpers/accept.png +0 -0
  31. data/spec/javascripts/helpers/alligator.mp3 +0 -0
  32. data/spec/javascripts/helpers/alligator.ogg +0 -0
  33. data/spec/javascripts/helpers/canvas.js +15 -0
  34. data/spec/javascripts/helpers/entityunit.js +50 -0
  35. data/spec/javascripts/helpers/factories.js +11 -0
  36. data/spec/javascripts/helpers/jquery-1.7.1.min.js +4 -0
  37. data/spec/javascripts/src/core/comp_spec.js +145 -0
  38. data/spec/javascripts/src/core/entity_spec.js +324 -0
  39. data/spec/javascripts/src/core/load_spec.js +71 -0
  40. data/spec/javascripts/src/core/query_spec.js +157 -0
  41. data/spec/javascripts/src/core/re_spec.js +61 -0
  42. data/spec/javascripts/src/core/system_spec.js +41 -0
  43. data/spec/javascripts/src/cycle/draw_spec.js +106 -0
  44. data/spec/javascripts/src/cycle/tick_spec.js +20 -0
  45. data/spec/javascripts/src/cycle/update_spec.js +86 -0
  46. data/spec/javascripts/src/display/align_spec.js +43 -0
  47. data/spec/javascripts/src/display/circle_spec.js +26 -0
  48. data/spec/javascripts/src/display/group_spec.js +7 -0
  49. data/spec/javascripts/src/display/image_spec.js +32 -0
  50. data/spec/javascripts/src/display/imgtext_spec.js +32 -0
  51. data/spec/javascripts/src/display/rect_spec.js +13 -0
  52. data/spec/javascripts/src/display/screen_spec.js +47 -0
  53. data/spec/javascripts/src/display/sprite_spec.js +28 -0
  54. data/spec/javascripts/src/display/text_spec.js +30 -0
  55. data/spec/javascripts/src/input/keyboard_spec.js +67 -0
  56. data/spec/javascripts/src/input/mouse_spec.js +133 -0
  57. data/spec/javascripts/src/input/pressed_spec.js +31 -0
  58. data/spec/javascripts/src/math/bisect_spec.js +59 -0
  59. data/spec/javascripts/src/math/body_spec.js +30 -0
  60. data/spec/javascripts/src/math/drag_spec.js +38 -0
  61. data/spec/javascripts/src/math/force_spec.js +134 -0
  62. data/spec/javascripts/src/math/hit_spec.js +28 -0
  63. data/spec/javascripts/src/math/hitmap_spec.js +52 -0
  64. data/spec/javascripts/src/math/limit_spec.js +35 -0
  65. data/spec/javascripts/src/math/point_spec.js +57 -0
  66. data/spec/javascripts/src/math/tile_spec.js +78 -0
  67. data/spec/javascripts/src/media/sound_spec.js +40 -0
  68. data/spec/javascripts/src/pattern/automap_spec.js +93 -0
  69. data/spec/javascripts/src/pattern/flicker_spec.js +66 -0
  70. data/spec/javascripts/src/pattern/timestep_spec.js +23 -0
  71. data/spec/javascripts/src/save/storage_spec.js +37 -0
  72. data/spec/javascripts/src/util/log_spec.js +9 -0
  73. data/spec/javascripts/src/util/polyfill_spec.js +13 -0
  74. data/spec/javascripts/src/util/random_spec.js +33 -0
  75. data/spec/javascripts/src/util/scene_spec.js +52 -0
  76. data/spec/javascripts/src/util/sheet_spec.js +25 -0
  77. data/spec/javascripts/src/util/support_spec.js +17 -0
  78. data/spec/javascripts/support/jasmine.yml +76 -0
  79. data/spec/javascripts/support/jasmine_config.rb +32 -0
  80. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  81. data/spec/lib/entityjs/assets_spec.rb +216 -0
  82. data/spec/lib/entityjs/command_spec.rb +53 -0
  83. data/spec/lib/entityjs/commands/build_spec.rb +69 -0
  84. data/spec/lib/entityjs/commands/comp_spec.rb +45 -0
  85. data/spec/lib/entityjs/commands/font_spec.rb +7 -0
  86. data/spec/lib/entityjs/commands/new_spec.rb +20 -0
  87. data/spec/lib/entityjs/commands/templates_spec.rb +9 -0
  88. data/spec/lib/entityjs/commands/test_spec.rb +31 -0
  89. data/spec/lib/entityjs/config_spec.rb +19 -0
  90. data/spec/lib/entityjs/dirc_spec.rb +83 -0
  91. data/spec/lib/entityjs/version_spec.rb +9 -0
  92. data/spec/spec_helper.rb +21 -3
  93. data/spec/support/factories.rb +19 -0
  94. data/spec/support/mygame.rb +11 -0
  95. data/src/core/comp.js +318 -0
  96. data/src/core/entity.js +549 -0
  97. data/src/core/load.js +242 -0
  98. data/src/core/query.js +354 -0
  99. data/src/core/re.js +74 -0
  100. data/src/core/system.js +121 -0
  101. data/src/cycle/draw.js +178 -0
  102. data/src/cycle/tick.js +25 -0
  103. data/src/{entityjs/cycle → cycle}/tween.js +60 -60
  104. data/src/{entityjs/cycle → cycle}/update.js +86 -85
  105. data/src/{entityjs/cycle → cycle}/wait.js +22 -21
  106. data/src/{entityjs/cycle → cycle}/worker.js +8 -8
  107. data/src/display/align.js +45 -0
  108. data/src/display/circle.js +33 -0
  109. data/src/{entityjs/display → display}/group.js +62 -62
  110. data/src/display/image.js +35 -0
  111. data/src/display/imgtext.js +102 -0
  112. data/src/{entityjs/display → display}/rect.js +18 -18
  113. data/src/display/screen.js +57 -0
  114. data/src/display/sprite.js +54 -0
  115. data/src/display/text.js +44 -0
  116. data/src/{entityjs/input → input}/keyboard.js +152 -150
  117. data/src/input/mouse.js +111 -0
  118. data/src/input/pressed.js +41 -0
  119. data/src/{entityjs/input → input}/touch.js +24 -28
  120. data/src/math/bisect.js +84 -0
  121. data/src/math/body.js +70 -0
  122. data/src/{entityjs/math → math}/drag.js +44 -38
  123. data/src/math/force.js +143 -0
  124. data/src/math/hit.js +32 -0
  125. data/src/math/hitmap.js +167 -0
  126. data/src/math/limit.js +37 -0
  127. data/src/math/point.js +40 -0
  128. data/src/math/tile.js +109 -0
  129. data/src/media/channel.js +93 -0
  130. data/src/{entityjs/media → media}/playlist.js +4 -4
  131. data/src/media/sound.js +114 -0
  132. data/src/{entityjs/net → net}/socket.js +51 -51
  133. data/src/pattern/automap.js +133 -0
  134. data/src/{entityjs/pattern → pattern}/flicker.js +206 -213
  135. data/src/pattern/timestep.js +31 -0
  136. data/src/{entityjs/save → save}/database.js +6 -6
  137. data/src/{entityjs/save → save}/storage.js +47 -56
  138. data/src/{entityjs/util → util}/log.js +17 -25
  139. data/src/{entityjs/util → util}/polyfill.js +24 -24
  140. data/src/util/random.js +20 -0
  141. data/src/util/scene.js +102 -0
  142. data/src/util/sheet.js +35 -0
  143. data/src/{entityjs/util → util}/support.js +109 -132
  144. data/{examples/keys → templates/arrow_keys/assets/images}/arrow.png +0 -0
  145. data/templates/arrow_keys/config.yml +22 -0
  146. data/templates/arrow_keys/readme.txt +9 -0
  147. data/templates/arrow_keys/scripts/display/arrow.js +69 -0
  148. data/templates/arrow_keys/scripts/init.js +10 -0
  149. data/templates/arrow_keys/scripts/input/controls.js +35 -0
  150. data/templates/arrow_keys/scripts/scenes/home.js +20 -0
  151. data/templates/arrow_keys/scripts/scenes/load.js +57 -0
  152. data/templates/arrow_keys/tests/display/arrow_test.js +29 -0
  153. data/templates/arrow_keys/tests/init_test.js +4 -0
  154. data/templates/arrow_keys/tests/input/controls_test.js +32 -0
  155. data/templates/arrow_keys/tests/scenes/home_test.js +0 -0
  156. data/templates/arrow_keys/tests/scenes/load_test.js +16 -0
  157. data/templates/blank/config.yml +22 -0
  158. data/templates/blank/readme.txt +79 -0
  159. data/templates/platform/assets/images/bit.png +0 -0
  160. data/templates/platform/assets/images/hero.png +0 -0
  161. data/templates/platform/assets/images/items.png +0 -0
  162. data/templates/platform/assets/images/tiles.png +0 -0
  163. data/templates/platform/assets/levels/level1.tmx +44 -0
  164. data/templates/platform/assets/sounds/coin.mp3 +0 -0
  165. data/templates/platform/assets/sounds/coin.ogg +0 -0
  166. data/templates/platform/config.yml +22 -0
  167. data/templates/platform/readme.txt +87 -0
  168. data/templates/platform/scripts/display/bit.js +12 -0
  169. data/templates/platform/scripts/display/hero.js +77 -0
  170. data/templates/platform/scripts/display/tile.js +2 -0
  171. data/templates/platform/scripts/display/tsprite.js +17 -0
  172. data/templates/platform/scripts/init.js +7 -0
  173. data/templates/platform/scripts/items/coin.js +27 -0
  174. data/templates/platform/scripts/items/item.js +41 -0
  175. data/templates/platform/scripts/items/spring.js +25 -0
  176. data/templates/platform/scripts/scenes/home.js +10 -0
  177. data/templates/platform/scripts/scenes/load.js +27 -0
  178. data/templates/platform/scripts/scenes/play.js +31 -0
  179. data/templates/platform/scripts/util/counter.js +34 -0
  180. data/templates/platform/scripts/util/level.js +84 -0
  181. data/templates/platform/tests/display/bit_test.js +7 -0
  182. data/templates/platform/tests/display/hero_test.js +73 -0
  183. data/templates/platform/tests/display/tile_test.js +7 -0
  184. data/templates/platform/tests/display/tsprite_test.js +8 -0
  185. data/templates/platform/tests/factories.js +30 -0
  186. data/templates/platform/tests/items/coin_test.js +28 -0
  187. data/templates/platform/tests/items/item_test.js +36 -0
  188. data/templates/platform/tests/items/spring_test.js +21 -0
  189. data/templates/platform/tests/scenes/home_test.js +9 -0
  190. data/templates/platform/tests/scenes/load_test.js +11 -0
  191. data/templates/platform/tests/scenes/play_test.js +15 -0
  192. data/templates/platform/tests/util/counter_test.js +9 -0
  193. data/templates/platform/tests/util/level_test.js +29 -0
  194. metadata +249 -97
  195. data/build/build_debug.bat +0 -1
  196. data/build/build_min.bat +0 -1
  197. data/build/config.php +0 -64
  198. data/build/debug.php +0 -48
  199. data/build/files.php +0 -74
  200. data/build/jsmin.php +0 -376
  201. data/build/min.php +0 -50
  202. data/changelog.txt +0 -53
  203. data/examples/keys/keys.html +0 -59
  204. data/examples/keys/keys.js +0 -148
  205. data/examples/mouse/mouse.html +0 -58
  206. data/examples/mouse/mouse.js +0 -60
  207. data/examples/scenes/home.png +0 -0
  208. data/examples/scenes/scenes.html +0 -55
  209. data/examples/scenes/scenes.js +0 -134
  210. data/examples/scenes/win.png +0 -0
  211. data/examples/sounds/sound1.mp3 +0 -0
  212. data/examples/sounds/sound1.ogg +0 -0
  213. data/examples/sounds/sounds.html +0 -56
  214. data/examples/sounds/sounds.js +0 -44
  215. data/examples/style/background.png +0 -0
  216. data/examples/style/sheet.css +0 -762
  217. data/examples/tiles/tiles.html +0 -56
  218. data/examples/tiles/tiles.js +0 -85
  219. data/examples/tiles/tiles.png +0 -0
  220. data/lib/blank/config.js +0 -4
  221. data/lib/blank/config.yml +0 -21
  222. data/lib/blank/home.js +0 -11
  223. data/lib/blank/init.js +0 -7
  224. data/lib/blank/load.js +0 -21
  225. data/lib/blank/play.html +0 -29
  226. data/lib/entity.debug.js +0 -52
  227. data/lib/entity.min.js +0 -184
  228. data/lib/entityjs/comp.rb +0 -11
  229. data/lib/entityjs/game.rb +0 -93
  230. data/lib/entityjs/min.rb +0 -11
  231. data/lib/entityjs/refresh.rb +0 -14
  232. data/spec/lib/entityjs/game_spec.rb +0 -11
  233. data/src/entityjs/core/component.js +0 -306
  234. data/src/entityjs/core/entity.js +0 -516
  235. data/src/entityjs/core/load.js +0 -224
  236. data/src/entityjs/core/query.js +0 -410
  237. data/src/entityjs/core/re.js +0 -70
  238. data/src/entityjs/core/system.js +0 -125
  239. data/src/entityjs/cycle/draw.js +0 -185
  240. data/src/entityjs/cycle/ticker.js +0 -27
  241. data/src/entityjs/display/anchor.js +0 -53
  242. data/src/entityjs/display/bitfont.js +0 -93
  243. data/src/entityjs/display/bitmap.js +0 -37
  244. data/src/entityjs/display/circle.js +0 -30
  245. data/src/entityjs/display/font.js +0 -41
  246. data/src/entityjs/display/screen.js +0 -46
  247. data/src/entityjs/display/sprite.js +0 -37
  248. data/src/entityjs/input/mouse.js +0 -123
  249. data/src/entityjs/input/pressed.js +0 -81
  250. data/src/entityjs/math/bind.js +0 -76
  251. data/src/entityjs/math/bisect.js +0 -69
  252. data/src/entityjs/math/body.js +0 -39
  253. data/src/entityjs/math/hitmap.js +0 -165
  254. data/src/entityjs/math/hittest.js +0 -26
  255. data/src/entityjs/math/physics.js +0 -142
  256. data/src/entityjs/math/point.js +0 -57
  257. data/src/entityjs/math/tile.js +0 -91
  258. data/src/entityjs/media/channel.js +0 -93
  259. data/src/entityjs/media/sound.js +0 -110
  260. data/src/entityjs/pattern/arraymap.js +0 -89
  261. data/src/entityjs/pattern/timestep.js +0 -34
  262. data/src/entityjs/util/random.js +0 -38
  263. data/src/entityjs/util/scene.js +0 -101
  264. data/src/entityjs/util/sheet.js +0 -51
@@ -0,0 +1,20 @@
1
+ /*
2
+ The random component implements two helper methods for calculating random numbers.
3
+
4
+
5
+ re.random() // 0 - 1
6
+ re.random(10) // 0 - 9
7
+ re.random(10, 30) // 10 - 30
8
+
9
+ */
10
+ re.random = function(max, min){
11
+ var r = Math.random();
12
+ switch(arguments.length){
13
+ case 0:
14
+ return r;
15
+ case 1:
16
+ return r * max;
17
+ case 2:
18
+ return r * (max - min + 1) + min;
19
+ }
20
+ };
data/src/util/scene.js ADDED
@@ -0,0 +1,102 @@
1
+
2
+ /*
3
+ Goes to an other scene in the game. This calls the scene method with a possible object argument.
4
+
5
+ Scenes are a helpful way to organize stages of a game.
6
+
7
+ //create scene
8
+ re.scene('game')
9
+ .enter(function(data){
10
+
11
+ //remove all 2d elements
12
+ re('2d').dispose();
13
+
14
+ loadLevel(data.level);
15
+
16
+ });
17
+
18
+ //go to scene
19
+ re.scene('game').enter({tiles:[]} );
20
+
21
+ *warning- bad idea passing in functions as the first argument
22
+
23
+ //create manually
24
+ re.e('scene:game')
25
+ .enter(function(){
26
+
27
+ })
28
+
29
+ */
30
+ re.scene = function(title){
31
+ var s = re.c('scene');
32
+
33
+ if(!re.is(title)){
34
+ return s._scenes[re.scene.current];
35
+ }
36
+
37
+ if(!s._scenes[title]){
38
+ //add scene
39
+ re.e('scene:'+title);
40
+ }
41
+
42
+ return s._scenes[title];
43
+ };
44
+
45
+ re.c('scene')
46
+ .statics({
47
+
48
+ _scenes:{}
49
+
50
+ })
51
+ .init(function(c, title){
52
+
53
+ c._scenes[title] = this;
54
+ this.sceneName = title;
55
+
56
+ })
57
+ .dispose(function(c){
58
+
59
+ delete c._scenes[this.sceneName];
60
+
61
+ })
62
+ .defines({
63
+
64
+ enter:function(title){
65
+ if(!re.is(title, 'function')){
66
+
67
+ if(re.scene.current)
68
+ re.scene().exit(title);
69
+
70
+ //set current scene
71
+ re.scene.current = this.sceneName
72
+
73
+ if(this.scene_enter)
74
+ this.scene_enter.apply(this, arguments);
75
+ return this;
76
+ } else {
77
+ //set new enter method
78
+ this.scene_enter = title;
79
+ }
80
+
81
+ return this;
82
+ },
83
+
84
+ exit:function(m){
85
+ if(!re.is(m, 'function')){
86
+
87
+ re.scene.current = '';
88
+
89
+ if(re.is(this.scene_exit, 'function')){
90
+ this.scene_exit.apply(this, arguments);
91
+ }
92
+
93
+ if(this.scene_exit)
94
+ this.scene_exit.apply(this, arguments);
95
+ } else {
96
+ this.scene_exit = m;
97
+ }
98
+
99
+ return this;
100
+ }
101
+
102
+ });
data/src/util/sheet.js ADDED
@@ -0,0 +1,35 @@
1
+ /*
2
+ The sheet component converts a each frame of a sprite sheet into their own components.
3
+ */
4
+ re.sheet = function(map, components, sizeX, sizeY){
5
+
6
+ var frameWidth = sizeX || re.tile.sizeX;
7
+ var frameHeight = sizeY || re.tile.sizeY;
8
+
9
+ if(re.is(components,'array')){
10
+ components = components.join(' ');
11
+ }
12
+
13
+ //create new sprites for sheet
14
+
15
+ //save frame positions from map
16
+ var x;
17
+ var y;
18
+ var b = [];
19
+ for(var p in map){
20
+ x = map[p][0] || 0;
21
+ y = map[p][1] || 0;
22
+ b.push(p);
23
+ re.c(p)
24
+ .requires('sprite '+components)
25
+ .defines({
26
+ frameX:x,
27
+ frameY:y,
28
+ sizeX:frameWidth,
29
+ sizeY:frameHeight
30
+ });
31
+
32
+ }
33
+
34
+ return b;
35
+ };
@@ -1,132 +1,109 @@
1
- /*
2
- The support component contains information about supported
3
- functionality of the browser.
4
-
5
- v0.1 currently only checks for support of canvas and canvas text.
6
-
7
- FUTURE
8
- -check audio support
9
-
10
- //returns true if canvas AND text is supported
11
- if(re.support('canvas text')){
12
- //supports
13
- }
14
-
15
- //checks all arguments and returns first thing thats supported
16
- re.support('ogg', 'aac', 'mp3', 'wav');
17
-
18
- //find first supported storage storage
19
- re.support('database', 'localstorage');
20
-
21
- this is helpful to find a supported codec or a storage component
22
-
23
- or add to entity
24
-
25
- re.e('support').support('canvas');
26
-
27
- ---- possible support checks
28
- canvas
29
- text
30
- audio
31
- ogg
32
- mp3
33
- wav
34
- aac
35
- localstorage
36
- worker
37
- webgl
38
-
39
- */
40
- re.c('support')
41
- .global({
42
-
43
- support:function(s){
44
- var that = re.c('support');
45
-
46
- if(arguments.length > 1){
47
- //find first supported arg and return
48
-
49
- var d;
50
- for(var i=0; i<arguments.length; i++){
51
- d = arguments[i];
52
- if(that.support(d)){
53
- return d;
54
- }
55
- }
56
-
57
- return false;
58
- }
59
-
60
- //find if supported
61
- var k = s.split(' ');
62
-
63
- var stat = true;
64
-
65
- //check multiple supports
66
- for(var j in k){
67
- stat = stat && !!that[k[j]];
68
- }
69
-
70
- return stat;
71
- }
72
-
73
- })
74
- .extend({
75
- support:function(s){
76
- return re.c('support').call(this, s);
77
- }
78
-
79
- })
80
- .run(function(){
81
-
82
- //add supports to component
83
- var c = re.c('support');
84
-
85
- //quick checking function
86
- re.support = c.support;
87
-
88
- //check canvas support
89
- c.canvas = !!document.createElement('canvas').getContext;
90
-
91
- //check for text support
92
- c.text = !!(c.canvas && typeof document.createElement('canvas').getContext('2d').fillText == 'function');
93
-
94
- //check audio support
95
- var ele = document.createElement('audio');
96
-
97
- try {
98
-
99
- if(c.audio = !!ele.canPlayType){
100
-
101
- c.ogg = ele.canPlayType('audio/ogg; codecs="vorbis"');
102
- c.mp3 = ele.canPlayType('audio/mpeg;');
103
- c.wav = ele.canPlayType('audio/wav; codecs="1"');
104
- c.aac = ele.canPlayType('audio/x-m4a;') || ele.canPlayType('audio/aac;');
105
-
106
- //switch unsupported codecs to false
107
- for(var i in c){
108
- if(c[i] == 'no' || c[i] == ''){
109
- c[i] = false;
110
- }
111
- }
112
-
113
- }
114
-
115
- } catch(e){}
116
-
117
- //check local storage
118
- try {
119
- c.localstorage = !!localStorage.getItem;
120
- } catch(e){
121
- c.localstorage = false;
122
- }
123
-
124
- //check web worker
125
- c.worker = !!window.Worker;
126
-
127
- //check webgl
128
- c.webgl = !!window.WebGLRenderingContext;
129
-
130
- c.touch = 'ontouchstart' in window;
131
-
132
- });
1
+ /*
2
+ The support component contains information about supported
3
+ functionality of the browser.
4
+
5
+ //returns true if canvas AND text is supported
6
+ if(re.support('canvas text')){
7
+ //supports
8
+ }
9
+
10
+ //checks all arguments and returns first thing thats supported
11
+ re.support('ogg', 'aac', 'mp3', 'wav');
12
+
13
+ //find first supported storage storage
14
+ re.support('database', 'localstorage');
15
+
16
+ this is helpful to find a supported codec or a storage component
17
+
18
+ or add to entity
19
+
20
+ re.e('support').support('canvas');
21
+
22
+ ---- possible support checks
23
+ canvas
24
+ text
25
+ audio
26
+ ogg
27
+ mp3
28
+ wav
29
+ aac
30
+ localstorage
31
+ worker
32
+ webgl
33
+
34
+ */
35
+ re.support = function(s){
36
+ if(arguments.length > 1){
37
+ //find first supported arg and return
38
+
39
+ var d;
40
+ for(var i=0; i<arguments.length; i++){
41
+ d = arguments[i];
42
+ if(re.support(d)){
43
+ return d;
44
+ }
45
+ }
46
+
47
+ return false;
48
+ }
49
+
50
+ //find if supported
51
+ var k = s.split(' ');
52
+
53
+ var stat = true;
54
+
55
+ //check multiple supports
56
+ for(var j in k){
57
+ stat = stat && !!re.support[k[j]];
58
+ }
59
+
60
+ return stat;
61
+ }
62
+
63
+ //add supports to component
64
+ var c = re.support;
65
+
66
+ //check canvas support
67
+ c.canvas = !!document.createElement('canvas').getContext;
68
+
69
+ //check for text support
70
+ c.text = !!(c.canvas && typeof document.createElement('canvas').getContext('2d').fillText == 'function');
71
+
72
+ //check audio support
73
+ var ele = document.createElement('audio');
74
+
75
+ try {
76
+
77
+ if(c.audio = !!ele.canPlayType){
78
+
79
+ c.ogg = ele.canPlayType('audio/ogg; codecs="vorbis"');
80
+ c.mp3 = ele.canPlayType('audio/mpeg;');
81
+ c.wav = ele.canPlayType('audio/wav; codecs="1"');
82
+ c.aac = ele.canPlayType('audio/x-m4a;') || ele.canPlayType('audio/aac;');
83
+
84
+ //switch unsupported codecs to false
85
+ for(var i in c){
86
+ if(c[i] == 'no' || c[i] == ''){
87
+ c[i] = false;
88
+ }
89
+ }
90
+
91
+ }
92
+
93
+ } catch(e){}
94
+
95
+ //check local storage
96
+ try {
97
+ c.localstorage = !!localStorage.getItem;
98
+ } catch(e){
99
+ c.localstorage = false;
100
+ }
101
+
102
+ //check web worker
103
+ c.worker = !!window.Worker;
104
+
105
+ //check webgl
106
+ c.webgl = !!window.WebGLRenderingContext;
107
+
108
+ c.touch = 'ontouchstart' in window;
109
+
@@ -0,0 +1,22 @@
1
+ # Configure your game settings
2
+
3
+ width: 500
4
+ height: 400
5
+ canvas-id: game-canvas
6
+
7
+ #files to ignore in /scripts
8
+ scripts-ignore:
9
+
10
+ #specify files to be loaded first in /scripts
11
+ order:
12
+
13
+ #components to ignore in the entityjs source
14
+ #reduce file size by ignoring unused components
15
+ entity-ignore:
16
+ socket
17
+ wait
18
+ group
19
+
20
+ #ignore tests in /tests
21
+ tests-ignore:
22
+
@@ -0,0 +1,9 @@
1
+ --------------- Arrow Keys ------------
2
+
3
+ # About
4
+
5
+ This is a simple example demostrating the usefulness of EntityJS.
6
+ It shows how to use sprites and keyboard controls to move around arrows
7
+ and remove them from screen.
8
+
9
+ For more information on the engine visit www.entityjs.com
@@ -0,0 +1,69 @@
1
+ /*
2
+ The arrow component is a simple sprite with key controls.
3
+ It listens to system updates and will move around based on WASD keys.
4
+
5
+ The image comes from arrow.png, you can view the element here, re.c('arrow.png').image.
6
+
7
+ The sprite component automatically finds the ._image on the entity and draws it to screen.
8
+ It will chop the image into frames based on the sizeX and sizeY values.
9
+
10
+ The original image is 80x80 and has 4 frames. So its frame sizes will be 40x40.
11
+
12
+ Switch between frames by using .frame(id), and get the current frame with .frame()
13
+
14
+ The posX and posY come from the sprite component and defines the position of the image on screen.
15
+
16
+ */
17
+ re.c('arrow')
18
+ .requires('update sprite keyboard arrow.png')
19
+ .defines({
20
+
21
+ //speed of the arrow
22
+ speed:10,
23
+ //defines the sprite frame size
24
+ sizeX:40,
25
+ sizeY:40,
26
+
27
+ update:function(){
28
+ var s = this.speed;
29
+
30
+ //if w or up key is currently pressed..
31
+ if(re.pressed('w', 'up')){
32
+ //moves position y
33
+ this.posY -= s;
34
+
35
+ //change sprite frame
36
+ this.frame(0);
37
+
38
+ } else if(re.pressed('s', 'down')){
39
+
40
+ this.posY += s;
41
+ this.frame(2);
42
+
43
+ }
44
+
45
+ if(re.pressed('a', 'left')){
46
+
47
+ this.posX -= s;
48
+ this.frame(3);
49
+
50
+ } else if(re.pressed('d', 'right')){
51
+
52
+ this.posX += s;
53
+ this.frame(1);
54
+
55
+ }
56
+
57
+ }
58
+
59
+ })
60
+ .init(function(){
61
+
62
+ //move to the center of the screen
63
+ this.posX = re.sys.sizeX * 0.5;
64
+ this.posY = re.sys.sizeY * 0.5;
65
+
66
+ //add event listener
67
+ this.on('update', this.update);
68
+
69
+ });
@@ -0,0 +1,10 @@
1
+ //runs when the window is finished loading
2
+ re.ready(function(){
3
+ //Starts the system and listens for inputs
4
+ //re.canvas in automatically defined and can be changed in config.yml
5
+ re.sys.init(re.canvas).start();
6
+
7
+ //enter the next scene
8
+ re.scene('load').enter();
9
+
10
+ });
@@ -0,0 +1,35 @@
1
+ /*
2
+ The controls component listens for keyevents and creates new arrows
3
+ based on keys pressed.
4
+ */
5
+ re.c('controls')
6
+ .requires('keyboard')
7
+ .defines({
8
+
9
+ addArrow:function(count){
10
+ count = count || 1;
11
+ //creates a new arrow
12
+ re.e('arrow', count);
13
+ },
14
+
15
+ removeArrow:function(){
16
+ //finds an entity with the arrow component and removes it.
17
+ re('arrow').random().dispose();
18
+ }
19
+
20
+ })
21
+ .init(function(){
22
+ //called on instantiation
23
+
24
+ //listen for key events
25
+ //these come from the keyboard component
26
+ this.on({
27
+ 'keydown:space': function(){
28
+ this.addArrow();
29
+ },
30
+ 'keyup:r': function(){
31
+ this.removeArrow();
32
+ }
33
+ });
34
+
35
+ });
@@ -0,0 +1,20 @@
1
+ /*
2
+ The home scene is the entry point of the game.
3
+ It creates a new controls entity and a starting arrow to play with.
4
+ */
5
+ re.scene('home')
6
+ .enter(function(){
7
+
8
+ console.log('entering home scene. . .');
9
+
10
+ //add controls
11
+ re.controls = re.e('controls');
12
+
13
+ //add first arrow
14
+ re.controls.addArrow();
15
+ })
16
+ .exit(function(){
17
+
18
+ console.log('exiting home scene. . .');
19
+
20
+ })
@@ -0,0 +1,57 @@
1
+ /*
2
+ The load scene loads all images and sounds in the game.
3
+
4
+ The re.assets object contains two arrays:
5
+
6
+ re.assets.images
7
+ re.assets.sounds
8
+
9
+ re.assets is automatically created for you and will contains whatever images
10
+ you place in the /assets/images or /assets/sounds directory.
11
+
12
+ You can even create new directories and place json or xml inside.
13
+
14
+ /assets/levels/level1.json
15
+
16
+ The file contents will be turned into a component and can be used on entities.
17
+
18
+ If /assets/levels/level1.json contains this:
19
+
20
+ {"something":100}
21
+
22
+ It will do this in the background for you:
23
+
24
+ re.c('level1.json level')
25
+ .defines({
26
+ something:100
27
+ });
28
+
29
+ You can even look in the source code and see for yourself.
30
+
31
+ Of course this will all be included when you run 'entityjs build'
32
+
33
+ Currently only, json, xml and tmx are supported. Tmx is a special file type used by
34
+ the map maker tiled and it can be used to create levels. More info: http://www.mapeditor.org/
35
+
36
+ */
37
+ re.scene('load')
38
+ .enter(function(){
39
+
40
+ re.load(re.assets)
41
+ .complete(function(){
42
+ console.log('finished loading...');
43
+
44
+ //move to home
45
+ re.scene('home').enter();
46
+ })
47
+ .error(function(e){
48
+ console.log('Error loading asset: '+e);
49
+ })
50
+ .progress(function(i){
51
+ console.log('Finished loading: '+i);
52
+ });
53
+
54
+ })
55
+ .exit(function(){
56
+ //exit load scene
57
+ })
@@ -0,0 +1,29 @@
1
+ module('arrow');
2
+
3
+ var arrow = re.e('arrow');
4
+
5
+ //verify the arrow has the correct sizes
6
+ test('size', function(){
7
+
8
+ equal(arrow.sizeX, 40);
9
+ equal(arrow.sizeY, 40);
10
+
11
+ });
12
+
13
+ test('keys move arrow', function(){
14
+
15
+ //mock/stub methods in qunit/qunit.mock.js
16
+ //expects 4 calls to frame
17
+ expectCall(arrow, 'frame', 4);
18
+
19
+ //simulate keypress / mouse clicks with qunit/qunit.input.js
20
+ //dispatches a keydown on each key, calls the given method
21
+ //then dispatches keyup.
22
+ keypress(['w', 's', 'd', 'a'], function(){
23
+ arrow.update();
24
+ });
25
+
26
+ //by the end of the method e.frame() should have been called 4 times
27
+ //take a look at scripts/display/arrow.js @ update()
28
+
29
+ });
@@ -0,0 +1,4 @@
1
+ module('init');
2
+
3
+ //in tests re.ready is NOT called.
4
+ //make sure re.sys.init() is called or else input will not function!