entityjs 0.3.2 → 0.4.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 (66) hide show
  1. data/.gitignore +1 -1
  2. data/lib/entityjs/config.rb +4 -4
  3. data/lib/entityjs/dirc.rb +2 -2
  4. data/lib/entityjs/page.rb +7 -1
  5. data/lib/entityjs/version.rb +1 -1
  6. data/public/qunit/qunit.entity.js +27 -12
  7. data/spec/javascripts/src/core/comp_spec.js +11 -0
  8. data/spec/javascripts/src/core/entity_spec.js +88 -5
  9. data/spec/javascripts/src/core/query_spec.js +196 -15
  10. data/spec/javascripts/src/cycle/drawlist_spec.js +36 -0
  11. data/spec/javascripts/src/cycle/tween_spec.js +1 -1
  12. data/spec/javascripts/src/cycle/wait_spec.js +31 -0
  13. data/spec/javascripts/src/{cycle → display}/draw_spec.js +25 -9
  14. data/spec/javascripts/src/display/sprite_spec.js +18 -0
  15. data/spec/javascripts/src/display/text_spec.js +8 -0
  16. data/spec/javascripts/src/input/mouse_spec.js +24 -36
  17. data/spec/javascripts/src/math/bisect_spec.js +4 -4
  18. data/spec/javascripts/src/math/distance_spec.js +11 -0
  19. data/spec/javascripts/src/math/iso_spec.js +131 -0
  20. data/spec/javascripts/src/math/point_spec.js +3 -3
  21. data/spec/javascripts/src/{util → math}/random_spec.js +0 -0
  22. data/spec/javascripts/src/math/range_spec.js +9 -0
  23. data/spec/javascripts/src/math/tile_spec.js +22 -7
  24. data/spec/javascripts/src/pattern/automap_spec.js +2 -2
  25. data/spec/javascripts/src/pattern/flicker_spec.js +34 -22
  26. data/spec/javascripts/src/pattern/pathfind_spec.js +55 -0
  27. data/src/core/comp.js +16 -16
  28. data/src/core/entity.js +52 -51
  29. data/src/core/load.js +5 -5
  30. data/src/core/query.js +214 -74
  31. data/src/core/system.js +16 -6
  32. data/src/cycle/drawlist.js +79 -0
  33. data/src/cycle/tween.js +7 -20
  34. data/src/cycle/wait.js +10 -19
  35. data/src/{cycle → display}/draw.js +24 -34
  36. data/src/display/image.js +1 -1
  37. data/src/display/screen.js +3 -3
  38. data/src/display/sprite.js +3 -3
  39. data/src/display/text.js +3 -1
  40. data/src/input/mouse.js +35 -12
  41. data/src/math/bisect.js +11 -10
  42. data/src/math/distance.js +7 -0
  43. data/src/math/iso.js +147 -0
  44. data/src/math/point.js +1 -5
  45. data/src/math/random.js +21 -0
  46. data/src/math/range.js +14 -0
  47. data/src/math/tile.js +40 -27
  48. data/src/pattern/automap.js +12 -11
  49. data/src/pattern/flicker.js +87 -135
  50. data/src/pattern/pathfind.js +168 -0
  51. data/src/pattern/timestep.js +4 -1
  52. data/src/util/polyfill.js +1 -1
  53. data/templates/isometric/assets/images/isotiles.png +0 -0
  54. data/templates/isometric/config.yml +22 -0
  55. data/templates/isometric/readme.txt +79 -0
  56. data/templates/isometric/scripts/displays/cursor.js +34 -0
  57. data/templates/isometric/scripts/displays/isoimage.js +32 -0
  58. data/templates/isometric/scripts/init.js +7 -0
  59. data/templates/isometric/scripts/levels/level.js +55 -0
  60. data/templates/isometric/scripts/levels/level1.js +11 -0
  61. data/templates/isometric/scripts/scenes/home.js +10 -0
  62. data/templates/isometric/scripts/scenes/load.js +11 -0
  63. data/templates/isometric/tests/scenes/load_test.js +15 -0
  64. metadata +42 -21
  65. data/src/net/socket.js +0 -52
  66. data/src/util/random.js +0 -24
@@ -0,0 +1,79 @@
1
+ /*
2
+ The drawlist is an array of draw entities. Which can all be drawn at once using the .draw() method.
3
+
4
+ The draw component contains one drawlist for basic drawing. For cases when multiple drawlists is needed,
5
+ such as for large depth sorts, its more efficient to depth sort on the wanted draw objects rather than all
6
+ existing draw entities.
7
+
8
+ For example:
9
+
10
+ In a case of an isometric game, certain tiles should appear behind or in
11
+
12
+ */
13
+ re.drawlist = function(name){
14
+ var d = re.c('drawlist'), name = name || '';
15
+
16
+ //name default to '' and returns default drawlist
17
+
18
+ if(!d._lists[name]){
19
+ //add new list
20
+ re.e('drawlist:'+name);
21
+ }
22
+
23
+ return d._lists[name];
24
+ };
25
+
26
+ re.c('drawlist')
27
+ .statics({
28
+ _lists:{}
29
+ })
30
+ .defines({
31
+
32
+ add:function(e){
33
+ if(e.drawlist){
34
+ e.drawlist.remove(e);
35
+ }
36
+
37
+ e.drawlist = this;
38
+ this.list.last(e);
39
+ return this;
40
+ },
41
+
42
+ remove:function(e){
43
+ if(e.drawlist){
44
+ this.list.erase(e);
45
+ e.drawlist = null;
46
+ }
47
+ return this;
48
+ },
49
+
50
+ drawlist:function(c){
51
+ var lis = this.list;
52
+
53
+ for(var i=0, b; i<lis.length; i++){
54
+ b = lis[i];
55
+ b.visible() && b.render(c);
56
+ }
57
+
58
+ },
59
+
60
+ sort:function(){
61
+
62
+ this.list.sort(function(a, b){
63
+ if(a.depth && b.depth){
64
+ return a.depth() - b.depth();
65
+ }
66
+ return 0;
67
+ });
68
+
69
+ }
70
+
71
+ })
72
+ .init(function(c, name){
73
+ c._lists[name] = this;
74
+ this.listName = name;
75
+ this.list = re();
76
+ })
77
+ .dispose(function(c){
78
+ delete c._lists[this.listName];
79
+ });
data/src/cycle/tween.js CHANGED
@@ -47,15 +47,9 @@ re.c('tween')
47
47
 
48
48
  this.tweening = false;
49
49
 
50
- this.trigger('tween:finish');
51
-
52
- //remove from queue
53
- var next = this.tween_queue.shift();
54
-
55
- if(next){
56
- this.tween.apply(this, next);
57
- }
50
+ this.off('update', this.tween_update);
58
51
 
52
+ this.trigger('tween:finish');
59
53
  }
60
54
 
61
55
  }
@@ -73,17 +67,13 @@ re.c('tween')
73
67
  .defines({
74
68
 
75
69
  tween:function(time, props){
76
- if(this.tweening){
77
- this.tween_queue.push(arguments);
78
- return;
79
- }
80
70
 
81
71
  //accepts ms or seconds
82
- if(time >= 30){
72
+ if(time >= 100){
83
73
  time /= 1000;
84
74
  }
85
75
 
86
- var maxTime = (time || 1) / (re.sys.stepSize * 60);
76
+ var maxTime = (time || 1) / re.sys.second;
87
77
  this.tween_time = 0;
88
78
  //steps are substracted until it reaches zero
89
79
 
@@ -104,18 +94,15 @@ re.c('tween')
104
94
  //tween maximum time
105
95
  this.tween_t = maxTime;
106
96
 
97
+ if(!this.tweening){
98
+ this.on('update', this.tween_update);
99
+ }
107
100
 
108
101
  this.tweening = true;
109
102
 
110
103
  return this.trigger('tween:start', starts);
111
104
  }
112
105
 
113
- })
114
- .init(function(){
115
-
116
- this.on('update', this.tween_update);
117
- this.tween_queue = [];
118
-
119
106
  });
120
107
 
121
108
  re.tween = function(obj, time, props){
data/src/cycle/wait.js CHANGED
@@ -1,23 +1,14 @@
1
- /*
2
- The wait component delays function calls.
3
- */
4
1
  re.c('wait')
5
- .requires('update')
6
2
  .defines({
7
-
8
- wait:function(time, callback){
9
- var c = 0;
10
-
11
- this.bind('update', function(t){
12
- c += t;
13
-
14
- if(c >= time){
15
- this.callback.apply(this, Array.prototype.slice.call(arguments, 2));
16
- return false;
17
- }
18
- });
19
-
3
+
4
+ wait:function(method, time){
5
+ time = time || 1000;
6
+
7
+ //convert seconds to milliseconds
8
+ if(time < 100) time *= 1000;
9
+
10
+ setTimeout(method, time);
20
11
  return this;
21
- }
22
-
12
+ }
13
+
23
14
  });
@@ -1,28 +1,10 @@
1
1
  re.c('draw')
2
- .statics({
3
- l:[],
4
-
5
- draw:function(c){
6
- var lis = this.l;
7
-
8
- for(var i=0, b; i<lis.length; i++){
9
- b = lis[i];
10
- b.drawable && b.visible() && b.draw_render(c);
11
- }
12
-
13
- }
14
-
15
- })
16
2
  .interfaces('draw')
17
- .init(function(c){
18
-
19
- c.l.push(this);
20
-
3
+ .init(function(){
4
+ re.drawlist().add(this);
21
5
  })
22
6
  .dispose(function(c){
23
-
24
- c.l.splice(c.l.indexOf(this), 1);
25
-
7
+ this.drawlist.remove(this);
26
8
  })
27
9
  .defaults({
28
10
  screenable:true,
@@ -45,6 +27,11 @@ re.c('draw')
45
27
  })
46
28
  .defines({
47
29
 
30
+ depth:function(){
31
+ return this.posY;
32
+ },
33
+
34
+ /* NOT WORKING
48
35
  cache:function(){
49
36
  if(!this.image) return this;
50
37
 
@@ -65,9 +52,9 @@ re.c('draw')
65
52
  clearCache:function(){
66
53
  this.canvasCache = null;
67
54
  },
68
-
55
+ */
69
56
  drawFirst:function(){
70
- var l = re.c('draw').l;
57
+ var l = this.drawlist.list;
71
58
 
72
59
  l.splice(l.indexOf(this), 1);
73
60
 
@@ -76,7 +63,7 @@ re.c('draw')
76
63
  },
77
64
 
78
65
  drawLast:function(){
79
- var l = re.c('draw').l;
66
+ var l = this.drawlist.list;
80
67
 
81
68
  l.splice(l.indexOf(this), 1);
82
69
 
@@ -85,7 +72,7 @@ re.c('draw')
85
72
  },
86
73
 
87
74
  drawAfter:function(en){
88
- var l = re.c('draw').l;
75
+ var l = this.drawlist.list;
89
76
  var him = l.indexOf(en);
90
77
  var me = l.indexOf(this);
91
78
 
@@ -101,7 +88,7 @@ re.c('draw')
101
88
 
102
89
  drawBefore:function(en){
103
90
 
104
- var l = re.c('draw').l;
91
+ var l = this.drawlist.list;
105
92
  var him = l.indexOf(en);
106
93
  var me = l.indexOf(this);
107
94
 
@@ -131,25 +118,28 @@ re.c('draw')
131
118
  return this.posY - re.screen.posY;
132
119
  },
133
120
 
121
+ /*
122
+ Renders the entity to the canvas. Goes through the transformations, scaling, alpha etc...
123
+ */
124
+ render:function(c){
125
+
126
+ this.draw_before(c);
127
+ this.draw(c);
128
+ this.draw_after(c);
129
+ },
130
+
134
131
  /*
135
132
  Returns true or false wether the object is visible on screen.
136
133
  */
137
134
  visible:function(){
138
135
 
139
- return re.screen.hit(this.posX - this.regX, this.posY - this.regY, this.sizeX, this.sizeY);
136
+ return this.drawable && re.screen.hit(this.posX - this.regX, this.posY - this.regY, this.sizeX, this.sizeY);
140
137
 
141
138
  }
142
139
 
143
140
  })
144
141
  .namespaces({
145
142
 
146
- render:function(c){
147
-
148
- this.draw_before(c);
149
- this.draw(c);
150
- this.draw_after(c);
151
- },
152
-
153
143
  before:function(c){
154
144
 
155
145
  c.save();
data/src/display/image.js CHANGED
@@ -2,7 +2,7 @@
2
2
  The image component draws an image on screen.
3
3
 
4
4
 
5
- FUTURE - add bitdata component for image manipulation.
5
+ FUTURE - add imagedata component for image manipulation.
6
6
  */
7
7
  re.c('image')
8
8
  .requires('draw')
@@ -12,9 +12,9 @@ re.c('screen')
12
12
  if(!arguments.length){
13
13
  return this;
14
14
  }
15
- if(arguments.length == 1){
16
- y = x.posY;
17
- x = x.posX;
15
+ if(re.is(x,'object')){
16
+ y = x.posY;
17
+ x = x.posX;
18
18
  }
19
19
 
20
20
  this.posX = x - this.regX;
@@ -5,13 +5,13 @@ The sprite object definess a drawable image for an entity.
5
5
  var sprite = re.e('sprite player.png');
6
6
 
7
7
  //move to frame 3
8
- sprite.fra(3)
8
+ sprite.frame(3)
9
9
 
10
10
  //get current frame
11
- sprite.fra()
11
+ sprite.frame()
12
12
 
13
13
  //manually move to frame
14
- sprite.attr({fraX:0, fraY:1});
14
+ sprite.attr({frameX:0, frameY:1});
15
15
 
16
16
  //add animation
17
17
  sprite.comp('flicker')
data/src/display/text.js CHANGED
@@ -28,7 +28,9 @@ re.c('text')
28
28
 
29
29
  text:function(t){
30
30
  if(re.is(t)){
31
- t += '';
31
+ //convert to string
32
+ t = Array.prototype.join.call(arguments, ' ');
33
+
32
34
  this.text_lines = t.split('\n');
33
35
  this._text = t;
34
36
  //set text width
data/src/input/mouse.js CHANGED
@@ -6,9 +6,12 @@ re.e('mouse')
6
6
  .on('mousedown:middle', function(m){
7
7
  //m.x - x position
8
8
  //m.y - y position
9
- //m.scrX - screen x position
10
- //m.scrY - screen y position
9
+ //m.screenX - screen x position
10
+ //m.screenY - screen y position
11
11
  })
12
+
13
+ FUTURE: rename triggers to the standard format
14
+ mousemove -> mouse:move
12
15
  */
13
16
  re.c('mouse')
14
17
  .statics({
@@ -50,11 +53,22 @@ re.c('mouse')
50
53
 
51
54
  event:function(e, extra){
52
55
 
56
+ var canvas = re.sys.canvas;
53
57
  //calculate mouse coordinate
54
- var x = e.offsetX;
55
- var y = e.offsetY;
58
+ var x = canvas.width / canvas.offsetWidth;
59
+ var y = canvas.height / canvas.offsetHeight;
60
+
61
+ //calculate offset
62
+ if(e.offsetX != null){ //chrome, opera
63
+ x *= e.offsetX;
64
+ y *= e.offsetY;
65
+ } else { //firefox
66
+ x *= e.layerX - canvas.offsetLeft;
67
+ y *= e.layerY - canvas.offsetTop;
68
+ }
69
+
56
70
 
57
- var that = re.c('mouse');
71
+ var listeners = re.c('mouse').l;
58
72
 
59
73
  /*
60
74
  if(re.preventDefault && re.preventDefault.d[key]){
@@ -63,16 +77,21 @@ re.c('mouse')
63
77
  */
64
78
 
65
79
  var c, t, obj;
66
- for(var i=0; i<that.l.length; i++){
67
- t = that.l[i];
68
- obj = {posX:x, posY:y};
69
- obj.screenX = re.screen.toScreenX(x);
70
- obj.screenY = re.screen.toScreenY(y);
80
+ for(var i=0; i<listeners.length; i++){
81
+ t = listeners[i];
82
+ if(t.screenable){
83
+ x = re.screen.toScreenX(x);
84
+ y = re.screen.toScreenY(y);
85
+ }
86
+
87
+ //offset mouse coordinates
88
+ var tx = x + t.offX;
89
+ var ty = y + t.offY;
71
90
 
72
- t.trigger(e.type, obj, e);
91
+ t.trigger(e.type, tx, ty, e);
73
92
 
74
93
  if(extra){
75
- t.trigger(e.type+':'+extra, obj, e);
94
+ t.trigger(e.type+':'+extra, tx, ty, e);
76
95
  }
77
96
  }
78
97
 
@@ -89,6 +108,10 @@ re.c('mouse')
89
108
  }
90
109
 
91
110
  })
111
+ .defaults({
112
+ offX:0,
113
+ offY:0
114
+ })
92
115
  .init(function(c){
93
116
  //add to listener array
94
117
  c.l.push(this);
data/src/math/bisect.js CHANGED
@@ -18,22 +18,22 @@ Note: width is called the bisect and the bi is the transformed x,y positions.
18
18
  re.bisect = re.c('bisect')
19
19
  .statics({
20
20
 
21
- biToX:function(bi, width, size){
21
+ toX:function(bi, width, size){
22
22
 
23
- return this.biToTileX(bi, width, size) * size;
23
+ return this.toTileX(bi, width, size) * size;
24
24
  },
25
25
 
26
- biToY:function(bi, width, size){
26
+ toY:function(bi, width, size){
27
27
 
28
- return this.biToTileY(bi, width, size) * size;
28
+ return this.toTileY(bi, width, size) * size;
29
29
  },
30
30
 
31
- biToTileX:function(bi, width, size){
31
+ toTileX:function(bi, width, size){
32
32
 
33
33
  return bi % (width / size) | 0;
34
34
  },
35
35
 
36
- biToTileY:function(bi, width, size){
36
+ toTileY:function(bi, width, size){
37
37
  return (bi * size) / (width - 0.1) | 0;
38
38
  },
39
39
 
@@ -51,21 +51,22 @@ re.bisect = re.c('bisect')
51
51
 
52
52
  biToX:function(bi){
53
53
 
54
- return re.bisect.biToX(bi, this.bisect, this.sizeX);
54
+ return re.bisect.toX(bi, this.bisect, this.sizeX);
55
55
  },
56
56
 
57
57
  biToY:function(bi){
58
58
 
59
- return re.bisect.biToY(bi, this.bisect, this.sizeY);
59
+ return re.bisect.toY(bi, this.bisect, this.sizeX);
60
60
  },
61
61
 
62
62
  biToTileX:function(bi){
63
63
 
64
- return re.bisect.biToTileX(bi, this.bisect, this.sizeX);
64
+ return re.bisect.toTileX(bi, this.bisect, this.sizeX);
65
65
  },
66
66
 
67
67
  biToTileY:function(bi){
68
- return re.bisect.biToTileY(bi, this.bisect, this.sizeY);
68
+ //sizeY doesn't matter when dealing with bisects
69
+ return re.bisect.toTileY(bi, this.bisect, this.sizeX);
69
70
  },
70
71
 
71
72
  tileToBi:function(xt, yt){