entityjs 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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){