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,190 @@
1
+ EUnit = {
2
+ stack:[],
3
+
4
+ runStack:function(){
5
+ for(var i in EUnit.stack){
6
+ var k = EUnit.stack[i];
7
+
8
+ ok(k.called, k.message);
9
+ }
10
+ },
11
+
12
+ push:function(obj){
13
+ this.stack.push(obj);
14
+
15
+ return QUnit.config.queue.unshift(EUnit.runStack);
16
+ }
17
+ };
18
+ /*
19
+ Expects a trigger call from the given obj.
20
+
21
+ var e = re.e('flicker');
22
+
23
+ expectTrigger(e, 'flicker:end', function(){
24
+ //if triggered this will be called
25
+ });
26
+
27
+ */
28
+ function expectTrigger(obj, trigger, func){
29
+ var trig = {
30
+ called:0,
31
+ message:"Expected "+trigger+" to be triggered"
32
+ };
33
+
34
+ trig.meth = function(){
35
+ trig.called++;
36
+ if(func) func.apply(obj, arguments);
37
+ };
38
+
39
+ obj.on(trigger, trig.meth);
40
+
41
+ EUnit.push(trig);
42
+ }
43
+
44
+ /*
45
+ Expects the given entity to have the given flicker present
46
+
47
+ var e = re.e();
48
+
49
+ expectFlicker(e, 'run'); //false
50
+
51
+ e.comps('flicker').addFlicker('run', 123, 21, [2]);
52
+
53
+ expectFlicker(e, 'run') //true
54
+
55
+ */
56
+ function expectFlicker(ent, flick){
57
+ ok(ent.flicker_reels[flick] != null, "Expected entity to have flicker "+flick);
58
+ }
59
+
60
+ /*
61
+ Expects an entity or component to have a current listener attached.
62
+
63
+ var e = re.e();
64
+
65
+ expectListener(e, 'update'); //false
66
+
67
+ e.on('update', function(){
68
+
69
+ });
70
+
71
+ expectListener(e, 'update') //true
72
+
73
+ */
74
+ function expectListener(ent, trigger, func){
75
+ if(arguments.length == 2){
76
+ ok(ent.has('^'+trigger), "Expected entity to have listener "+trigger);
77
+ } else {
78
+ var fin = false;
79
+ for(var i in ent._re_signals[trigger]){
80
+ fin = (ent._re_signals[trigger][i] == func)
81
+ if(fin) break;
82
+ }
83
+
84
+ ok(fin, "Expected entity to have listener "+trigger+" with function");
85
+
86
+ }
87
+ }
88
+
89
+ /*
90
+ Generates a factory for creating complex entities.
91
+
92
+ //create coin factory
93
+ factory('coin', function(){
94
+ //set values on the newly created coin
95
+ this.value = 10;
96
+
97
+ //has all normal methods
98
+ this.def('blah', 10);
99
+ this.on('update', function(){
100
+ });
101
+ });
102
+
103
+ //create coin
104
+ var e = factory('coin');
105
+ e.value // 10
106
+ e.has('coin') //true
107
+
108
+ //can also use f
109
+ var coin2 = f('coin');
110
+ coin2.value //10
111
+
112
+ */
113
+ var _factories = {};
114
+ function factory(comps, func){
115
+ var e = re.e(comps);
116
+
117
+ //don't enter in arrays, strings only
118
+ if(func) _factories[comps] = func;
119
+
120
+ if(_factories[comps]) _factories[comps].call(e);
121
+
122
+ return e;
123
+ }
124
+ var f = factory;
125
+
126
+ /*
127
+ Generates a factory entity for easy use in the module()
128
+
129
+ //light weight
130
+ //a new coin in e will be created for every test()
131
+ module('coin', lazy('coin'));
132
+
133
+ //do something after coin creation
134
+ module('coin', lazy('coin', function(e){
135
+ //called on coin creation.
136
+ }));
137
+
138
+ //setup teardown methods together
139
+ module('coin', lazy('coin', {
140
+ setup:function(e){
141
+ //called on coin creation.
142
+ },
143
+ teardown:function(e){
144
+ //called after each test
145
+ }
146
+ }));
147
+
148
+ test('coin should have valid of 10', function(){
149
+ equal(e.value, 10);
150
+ })
151
+
152
+ etc..
153
+
154
+ */
155
+ var e;
156
+ function lazy(comps, obj){
157
+ return {
158
+ setup:function(){
159
+ e = f(comps);
160
+ if(typeof obj == 'function') obj(e);
161
+ if(obj && obj.setup) obj.setup(e);
162
+ },
163
+ teardown:function(){
164
+ if(obj && obj.teardown) obj.teardown(e);
165
+ e.dispose();
166
+ }
167
+ }
168
+ }
169
+
170
+ /*
171
+ Some super lazy evaluations
172
+ */
173
+ var eq = equal;
174
+ var not = function(arg, message){ok(!arg, message);}
175
+ function is(obj, type){
176
+ if(arguments.length == 1){
177
+ ok(obj != null, "Expected to be present");
178
+ } else{
179
+ ok(obj != null && Object.prototype.toString.call(obj).slice(8, -1).toLowerCase() == type.toLowerCase())
180
+ }
181
+ }
182
+
183
+ function match(test, reg, i){
184
+ if(typeof reg == 'string'){
185
+ reg = new RegExp(reg, i)
186
+ }
187
+
188
+ ok(test.match(reg) != null, "Expected to match "+reg)
189
+
190
+ }
@@ -0,0 +1,200 @@
1
+ /*
2
+ EntityJS methods to simulate user inputs.
3
+ */
4
+
5
+ function _findKeyCode(code){
6
+ var codes = re.c('keyboard').keyCodes;
7
+
8
+ for(var i in codes){
9
+ if(codes[i] == code){
10
+ return i;
11
+ }
12
+ }
13
+ return null;
14
+ }
15
+
16
+ //sim keyboard presses
17
+
18
+ /*
19
+ Calls keydown. This will keep it down until keyup is called.
20
+ keydown('w');
21
+ */
22
+ function keydown(key, e){
23
+ e = e || {};
24
+
25
+ e.type = 'keydown';
26
+ e.keyCode = _findKeyCode(key);
27
+
28
+ re.c('keyboard').event(e);
29
+ };
30
+
31
+ /*
32
+ Calls keyup, even if keydown was not pressed beforehand.
33
+ keyup('w');
34
+ */
35
+ function keyup(key, e){
36
+ e = e || {};
37
+
38
+ e.type = 'keyup';
39
+ e.keyCode = _findKeyCode(key);
40
+
41
+ re.c('keyboard').event(e);
42
+ };
43
+
44
+ /*
45
+ Calls keydown before the callback and then keyup after.
46
+
47
+ keypress('w', function(){
48
+
49
+ //w is down
50
+
51
+ //w is up
52
+ });
53
+
54
+ //w is not down
55
+
56
+ //Can also enter in an array of keys
57
+ keypress(['w','a','s','d'], function(key, event){
58
+
59
+ })
60
+
61
+ //Can also send custom attributes to the event object.
62
+ var e = re.e('keyboard')
63
+ .on('keydown', function(key, event){
64
+ re.log(event.myCustom); //cake
65
+ });
66
+ keypress('w', null, {myCustom:'cake'});
67
+
68
+ //key in mind the callback method is also optional
69
+
70
+ */
71
+ function keypress(key, callback, e){
72
+ if(typeof key == 'object'){
73
+ for(var i in key){
74
+ keypress(key[i], callback, e);
75
+ }
76
+ return;
77
+ }
78
+ keydown(key, e);
79
+ if(callback) callback(key, e);
80
+ keyup(key, e);
81
+ };
82
+
83
+ function _mouseEvent(e, type, x, y, key){
84
+ e = e || {};
85
+
86
+ e.type = type;
87
+ e.clientX = x + document.body.scrollLeft + document.documentElement.scrollLeft;
88
+ e.clientX = y + document.body.scrollTop + document.documentElement.scrollTop;
89
+
90
+ if(key){
91
+ re.c('mouse').press(e);
92
+ } else {
93
+ re.c('mouse').event(e);
94
+ }
95
+ }
96
+
97
+ //sim mouse clicks
98
+
99
+ /*
100
+ Will hold the mouse down until mouse up is called.
101
+
102
+ //click at 10,20 with the middle key
103
+ //add custom to the event object.
104
+ mousedown(10, 20, 'middle', {custom:234});
105
+
106
+ */
107
+ function mousedown(x, y, key, e){
108
+
109
+ _mouseEvent(e, 'mousedown', x, y, key || 'left');
110
+ };
111
+
112
+ /*
113
+ Will call mouse up on the given x, y.
114
+ Mousedown does not need to be called for this to work.
115
+
116
+ mouseup(20, 40, 'right');
117
+ */
118
+ function mouseup(x, y, key, e){
119
+ _mouseEvent(e, 'mouseup', x, y, key || 'left');
120
+ };
121
+
122
+ /*
123
+ Calls mousemove on the given coordinate.
124
+
125
+ mousemove(20, 30);
126
+
127
+ */
128
+ function mousemove(x, y, e){
129
+ _mouseEvent(e, 'mousemove', x, y);
130
+ };
131
+
132
+ /*
133
+ Calls contextmenu on the given coordiante.
134
+
135
+ contextmenu(30, 50)
136
+ */
137
+ function contextmenu(x, y, e){
138
+ _mouseEvent(e, 'contextmenu', x, y);
139
+
140
+ };
141
+
142
+ /*
143
+ Clicks on the given coordinate and optionally call a method inbetween.
144
+
145
+ click(20, 30);
146
+
147
+ //with callback
148
+ click(40, 50, function(x, y, key, event){
149
+ //mousedown..
150
+
151
+
152
+ //mouseup..
153
+ });
154
+
155
+ //mouse not down
156
+
157
+ //call with custom key and event
158
+ click(20, 50, null, 'middle', {blah:23});
159
+
160
+ //multiple clicks
161
+
162
+ click([[0,1], [30, 20], [34, 73]], function(x, y, key, event){
163
+
164
+ re.log('clicks', x, y, key, event);
165
+
166
+ }, 'right', {extra:10});
167
+
168
+ */
169
+ function click(x, y, callback, key, e){
170
+
171
+ if(typeof x == 'object'){
172
+
173
+ for(var i in x){
174
+ click(x[i][0], x[i][1], y, callback, key);
175
+ }
176
+
177
+ return;
178
+ }
179
+
180
+ mousedown(x, y, key, e);
181
+ _mouseEvent(e, 'click', x, y);
182
+ if(callback) callback(x, y, key, e);
183
+ mouseup(x, y, key, e);
184
+ };
185
+
186
+ /*
187
+ Same as the click method, except it calls click twice and then dispatches the callback.
188
+
189
+
190
+ dblclick(20, 40, function(x, y, key, e){
191
+ //blah
192
+ }, 'left', {bl:sdf});
193
+
194
+ */
195
+ function dblclick(x, y, callback, key, e){
196
+ click(x, y, null, key, e);
197
+ click(x, y, null, key, e);
198
+ _mouseEvent(e, 'dblclick', x, y);
199
+ if(callback) callback(x, y, key, e);
200
+ };