entityjs 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/Gemfile +4 -0
- data/README.md +49 -0
- data/Rakefile +1 -0
- data/bin/entityjs +14 -0
- data/build/build_debug.bat +1 -0
- data/build/build_min.bat +1 -0
- data/build/config.php +64 -0
- data/build/debug.php +48 -0
- data/build/files.php +74 -0
- data/build/jsmin.php +376 -0
- data/build/min.php +50 -0
- data/changelog.txt +53 -0
- data/entityjs.gemspec +25 -0
- data/examples/keys/arrow.png +0 -0
- data/examples/keys/keys.html +59 -0
- data/examples/keys/keys.js +148 -0
- data/examples/mouse/mouse.html +58 -0
- data/examples/mouse/mouse.js +60 -0
- data/examples/scenes/home.png +0 -0
- data/examples/scenes/scenes.html +55 -0
- data/examples/scenes/scenes.js +134 -0
- data/examples/scenes/win.png +0 -0
- data/examples/sounds/sound1.mp3 +0 -0
- data/examples/sounds/sound1.ogg +0 -0
- data/examples/sounds/sounds.html +56 -0
- data/examples/sounds/sounds.js +44 -0
- data/examples/style/background.png +0 -0
- data/examples/style/sheet.css +762 -0
- data/examples/tiles/tiles.html +56 -0
- data/examples/tiles/tiles.js +85 -0
- data/examples/tiles/tiles.png +0 -0
- data/lib/blank/config.js +4 -0
- data/lib/blank/config.yml +21 -0
- data/lib/blank/home.js +11 -0
- data/lib/blank/init.js +7 -0
- data/lib/blank/load.js +21 -0
- data/lib/blank/play.html +29 -0
- data/lib/entity.debug.js +52 -0
- data/lib/entity.min.js +184 -0
- data/lib/entityjs/command.rb +37 -0
- data/lib/entityjs/comp.rb +11 -0
- data/lib/entityjs/game.rb +93 -0
- data/lib/entityjs/min.rb +11 -0
- data/lib/entityjs/refresh.rb +14 -0
- data/lib/entityjs/version.rb +3 -0
- data/lib/entityjs.rb +6 -0
- data/license.txt +1 -0
- data/spec/lib/entityjs/game_spec.rb +11 -0
- data/spec/spec_helper.rb +3 -0
- data/src/entityjs/core/component.js +306 -0
- data/src/entityjs/core/entity.js +516 -0
- data/src/entityjs/core/load.js +224 -0
- data/src/entityjs/core/query.js +410 -0
- data/src/entityjs/core/re.js +70 -0
- data/src/entityjs/core/system.js +125 -0
- data/src/entityjs/cycle/draw.js +185 -0
- data/src/entityjs/cycle/ticker.js +27 -0
- data/src/entityjs/cycle/tween.js +61 -0
- data/src/entityjs/cycle/update.js +86 -0
- data/src/entityjs/cycle/wait.js +22 -0
- data/src/entityjs/cycle/worker.js +9 -0
- data/src/entityjs/display/anchor.js +53 -0
- data/src/entityjs/display/bitfont.js +93 -0
- data/src/entityjs/display/bitmap.js +37 -0
- data/src/entityjs/display/circle.js +30 -0
- data/src/entityjs/display/font.js +41 -0
- data/src/entityjs/display/group.js +63 -0
- data/src/entityjs/display/rect.js +19 -0
- data/src/entityjs/display/screen.js +46 -0
- data/src/entityjs/display/sprite.js +37 -0
- data/src/entityjs/input/keyboard.js +150 -0
- data/src/entityjs/input/mouse.js +123 -0
- data/src/entityjs/input/pressed.js +81 -0
- data/src/entityjs/input/touch.js +28 -0
- data/src/entityjs/math/bind.js +76 -0
- data/src/entityjs/math/bisect.js +69 -0
- data/src/entityjs/math/body.js +39 -0
- data/src/entityjs/math/drag.js +39 -0
- data/src/entityjs/math/hitmap.js +165 -0
- data/src/entityjs/math/hittest.js +26 -0
- data/src/entityjs/math/physics.js +142 -0
- data/src/entityjs/math/point.js +57 -0
- data/src/entityjs/math/tile.js +91 -0
- data/src/entityjs/media/channel.js +93 -0
- data/src/entityjs/media/playlist.js +5 -0
- data/src/entityjs/media/sound.js +110 -0
- data/src/entityjs/net/socket.js +52 -0
- data/src/entityjs/pattern/arraymap.js +89 -0
- data/src/entityjs/pattern/flicker.js +214 -0
- data/src/entityjs/pattern/timestep.js +34 -0
- data/src/entityjs/save/database.js +7 -0
- data/src/entityjs/save/storage.js +57 -0
- data/src/entityjs/util/log.js +25 -0
- data/src/entityjs/util/polyfill.js +25 -0
- data/src/entityjs/util/random.js +38 -0
- data/src/entityjs/util/scene.js +101 -0
- data/src/entityjs/util/sheet.js +51 -0
- data/src/entityjs/util/support.js +132 -0
- metadata +156 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
/*
|
2
|
+
The socket component is an interface for the new HTML5 websockets.
|
3
|
+
|
4
|
+
Its safe to use this abstraction incase specs change in the future.
|
5
|
+
|
6
|
+
*/
|
7
|
+
re.c('socket')
|
8
|
+
.extend({
|
9
|
+
|
10
|
+
connect:function(address){
|
11
|
+
|
12
|
+
this.socket = new WebSocket(address);
|
13
|
+
|
14
|
+
},
|
15
|
+
|
16
|
+
close:function(){
|
17
|
+
if(!this.socket) return this;
|
18
|
+
|
19
|
+
this.socket.close();
|
20
|
+
|
21
|
+
return this;
|
22
|
+
},
|
23
|
+
|
24
|
+
open:function(callback){
|
25
|
+
if(!this.socket) return this;
|
26
|
+
|
27
|
+
this.socket.onopen = callback;
|
28
|
+
|
29
|
+
},
|
30
|
+
|
31
|
+
error:function(callback){
|
32
|
+
if(!this.socket) return this;
|
33
|
+
|
34
|
+
this.socket.onerror = callback;
|
35
|
+
|
36
|
+
},
|
37
|
+
|
38
|
+
message:function(callback){
|
39
|
+
if(!this.socket) return this;
|
40
|
+
|
41
|
+
this.socket.onmessage = callback;
|
42
|
+
|
43
|
+
},
|
44
|
+
|
45
|
+
send:function(){
|
46
|
+
if(!this.socket) return this;
|
47
|
+
|
48
|
+
this.socket.send.apply(this.socket, arguments);
|
49
|
+
|
50
|
+
}
|
51
|
+
|
52
|
+
});
|
@@ -0,0 +1,89 @@
|
|
1
|
+
/*
|
2
|
+
The arraymap component creates an auto expandable two-dimensional array.
|
3
|
+
*/
|
4
|
+
re.c('arraymap')
|
5
|
+
.inherit({
|
6
|
+
lengthX:0,
|
7
|
+
lengthY:0
|
8
|
+
})
|
9
|
+
.extend({
|
10
|
+
/*map:null,
|
11
|
+
size:null,*/
|
12
|
+
value:0,
|
13
|
+
|
14
|
+
set:function(x, y, value){
|
15
|
+
|
16
|
+
//increate y length
|
17
|
+
while(y >= this.map.length){
|
18
|
+
var m = new Array(this.map[0]);
|
19
|
+
|
20
|
+
for(var l in m){
|
21
|
+
m[l] = this.value;
|
22
|
+
}
|
23
|
+
|
24
|
+
this.map.push(m);
|
25
|
+
|
26
|
+
}
|
27
|
+
|
28
|
+
//increase x length
|
29
|
+
while(x >= this.map[this.map.length-1].length){
|
30
|
+
|
31
|
+
for(var k=0; k<this.map.length; k++){
|
32
|
+
this.map[k].push(this.value);
|
33
|
+
}
|
34
|
+
|
35
|
+
}
|
36
|
+
|
37
|
+
this.lengthX = this.map[y].length;
|
38
|
+
this.lengthY = this.map.length;
|
39
|
+
|
40
|
+
this.map[y][x] = value;
|
41
|
+
|
42
|
+
return this;
|
43
|
+
},
|
44
|
+
|
45
|
+
within:function(x, y){
|
46
|
+
|
47
|
+
if(y < 0 || y >= this.lengthY || x < 0 || x >= this.lengthX){
|
48
|
+
return false;
|
49
|
+
}
|
50
|
+
return true;
|
51
|
+
},
|
52
|
+
|
53
|
+
get:function(x, y){
|
54
|
+
if(this.within(x,y)){
|
55
|
+
return this.map[y][x];
|
56
|
+
}
|
57
|
+
return null;
|
58
|
+
},
|
59
|
+
|
60
|
+
copy:function(a){
|
61
|
+
|
62
|
+
for(var y=0; y<a.length; y++){
|
63
|
+
for(var x=0; x<a[0].length; x++){
|
64
|
+
this.set(x, y, a[y][x]);
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
return this;
|
69
|
+
},
|
70
|
+
|
71
|
+
copyByRef:function(m){
|
72
|
+
|
73
|
+
this.map = m;
|
74
|
+
|
75
|
+
if(m.length > 0){
|
76
|
+
this.lengthX = m[0].length;
|
77
|
+
} else {
|
78
|
+
this.lengthX = 0;
|
79
|
+
}
|
80
|
+
|
81
|
+
this.lengthY = m.length;
|
82
|
+
|
83
|
+
return this;
|
84
|
+
}
|
85
|
+
|
86
|
+
})
|
87
|
+
.init(function(){
|
88
|
+
this.map = [];
|
89
|
+
});
|
@@ -0,0 +1,214 @@
|
|
1
|
+
/*
|
2
|
+
The flicker component calls the implemented method and sends the given information over a period of time.
|
3
|
+
|
4
|
+
This is most popular for sprite animation.
|
5
|
+
|
6
|
+
It can also be used for graduatly writing text or flashing a drawing object.
|
7
|
+
*/
|
8
|
+
re.c('flicker')
|
9
|
+
.require('update timestep')
|
10
|
+
.implement('flick')
|
11
|
+
.init(function(){
|
12
|
+
|
13
|
+
this.flicker_reels = {};
|
14
|
+
this.flicker_old = {};
|
15
|
+
this.flicker_reel = {};
|
16
|
+
|
17
|
+
this.flicker_flickering = '';
|
18
|
+
|
19
|
+
})
|
20
|
+
.extend({
|
21
|
+
|
22
|
+
flicker_stop:function(){
|
23
|
+
if(this.flickering()){
|
24
|
+
|
25
|
+
this.signal('animated', this.flicker_flickering);
|
26
|
+
|
27
|
+
this.flicker_flickering = '';
|
28
|
+
|
29
|
+
this.stepProgress = 0;
|
30
|
+
this.frameX = this.flicker_oldX;
|
31
|
+
this.frameY = this.flicker_oldY;
|
32
|
+
|
33
|
+
this.removeSignal('update', this.flicker_update);
|
34
|
+
}
|
35
|
+
return this;
|
36
|
+
},
|
37
|
+
|
38
|
+
flicker_update:function(t){
|
39
|
+
|
40
|
+
this.timestep(t, function(){
|
41
|
+
var c = this.flicker_reel;
|
42
|
+
|
43
|
+
//check if over
|
44
|
+
if(this.flicker_frame == this.flicker_reel.frames.length){
|
45
|
+
|
46
|
+
if(c.loops == -1 || --this.flicker_loops >= 1){
|
47
|
+
//loop again
|
48
|
+
|
49
|
+
this.flicker_frame = 0;
|
50
|
+
|
51
|
+
} else {
|
52
|
+
//done flickering
|
53
|
+
|
54
|
+
this.flicker_stop();
|
55
|
+
|
56
|
+
return;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
//flick
|
61
|
+
this.flick(c.frames[this.flicker_frame]);
|
62
|
+
|
63
|
+
this.flicker_frame++;
|
64
|
+
|
65
|
+
});
|
66
|
+
|
67
|
+
},
|
68
|
+
|
69
|
+
addFlicker:function(id, loops, duration, frames){
|
70
|
+
|
71
|
+
if(typeof id == 'object'){
|
72
|
+
|
73
|
+
for(var i in id){
|
74
|
+
if(!id.hasOwnProperty(i)) continue;
|
75
|
+
|
76
|
+
//copy formed array and insert
|
77
|
+
var c = id[i].slice();
|
78
|
+
//add key into array
|
79
|
+
c.unshift(i);
|
80
|
+
|
81
|
+
this.addFlicker.apply(this, c);
|
82
|
+
|
83
|
+
}
|
84
|
+
|
85
|
+
return this;
|
86
|
+
}
|
87
|
+
|
88
|
+
if(typeof frames == 'string') frames = frames.split(' ');
|
89
|
+
|
90
|
+
//add
|
91
|
+
this.flicker_reels[id] =
|
92
|
+
{
|
93
|
+
frames:frames,
|
94
|
+
duration:duration,
|
95
|
+
loops:loops
|
96
|
+
};
|
97
|
+
|
98
|
+
return this;
|
99
|
+
},
|
100
|
+
|
101
|
+
removeFlicker:function(id){
|
102
|
+
|
103
|
+
if(typeof id == 'object'){
|
104
|
+
|
105
|
+
for(var i in id){
|
106
|
+
if(!id.hasOwnProperty(i)) continue;
|
107
|
+
|
108
|
+
this.removeFlicker.call(this, id[i]);
|
109
|
+
}
|
110
|
+
|
111
|
+
return this;
|
112
|
+
}
|
113
|
+
|
114
|
+
//assuming this flicker isn't running
|
115
|
+
delete this.flicker_reels[id];
|
116
|
+
|
117
|
+
return this;
|
118
|
+
},
|
119
|
+
|
120
|
+
/*
|
121
|
+
The animate method either creates or plays an animation.
|
122
|
+
Time is in milliseconds.
|
123
|
+
|
124
|
+
//create sequence animation
|
125
|
+
re('#player').flicker('die', 1, 200, [0, 1, 3, 3, 4, 3, 2, 1]);
|
126
|
+
|
127
|
+
//play animation
|
128
|
+
//can customize the animation for this call.
|
129
|
+
re('#player').flicker('die', 0, 200);
|
130
|
+
|
131
|
+
//stop flickering
|
132
|
+
re('#player').flicker();
|
133
|
+
|
134
|
+
//add multiple animations
|
135
|
+
flicker({
|
136
|
+
idle:[loops, duration, frames],
|
137
|
+
..
|
138
|
+
|
139
|
+
|
140
|
+
});
|
141
|
+
|
142
|
+
FUTURE:
|
143
|
+
-allow backward animations
|
144
|
+
-allow entry of an array of frames. So each counter will go to the next frame in the array
|
145
|
+
*/
|
146
|
+
flicker:function(id, loops, duration, frames){
|
147
|
+
|
148
|
+
if(arguments.length == 0){
|
149
|
+
//stop flickering
|
150
|
+
return this.flicker_stop();
|
151
|
+
}
|
152
|
+
|
153
|
+
if(id == this.flicker_flickering) return;
|
154
|
+
|
155
|
+
if(!this.flicker_reels[id]){
|
156
|
+
return this;
|
157
|
+
}
|
158
|
+
|
159
|
+
//defaults
|
160
|
+
|
161
|
+
//startX = loops, endX = duration in seconds
|
162
|
+
//if startX equals 0, animation loops forever
|
163
|
+
|
164
|
+
var r = this.flicker_reels[id];
|
165
|
+
|
166
|
+
//create new reel based on custom attributes
|
167
|
+
var c = this.flicker_reel;
|
168
|
+
//copy from saved animation or newly given
|
169
|
+
c.loops = (isNaN(loops))? r.loops : loops;
|
170
|
+
c.duration = (isNaN(duration))? r.duration : duration;
|
171
|
+
c.frames = (typeof frames == 'object')? frames : r.frames;
|
172
|
+
|
173
|
+
//setup counter for loops
|
174
|
+
this.flicker_loops = c.loops;
|
175
|
+
|
176
|
+
this.stepProgress = 0;
|
177
|
+
this.stepSize = c.duration / c.frames.length;
|
178
|
+
|
179
|
+
//save old frames for upon completion
|
180
|
+
|
181
|
+
this.flicker_oldX = this.frameX;
|
182
|
+
this.flicker_oldY = this.frameY;
|
183
|
+
|
184
|
+
this.flicker_frame = 0;
|
185
|
+
|
186
|
+
//update frame then run
|
187
|
+
this.flick(c.frames[this.flicker_frame++]);
|
188
|
+
|
189
|
+
if(!this.flickering()){
|
190
|
+
this.addSignal('update', this.flicker_update);
|
191
|
+
}
|
192
|
+
|
193
|
+
this.flicker_flickering = id;
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
return this;
|
198
|
+
},
|
199
|
+
|
200
|
+
/*
|
201
|
+
Check if flicker is running / compare current.
|
202
|
+
|
203
|
+
this.flickering(); // false
|
204
|
+
this.flickering('idle'); // false
|
205
|
+
*/
|
206
|
+
flickering:function(id){
|
207
|
+
if(id){
|
208
|
+
return this.flicker_flickering == id;
|
209
|
+
}
|
210
|
+
|
211
|
+
return this.flicker_flickering != '';
|
212
|
+
}
|
213
|
+
|
214
|
+
});
|
@@ -0,0 +1,34 @@
|
|
1
|
+
/*
|
2
|
+
|
3
|
+
|
4
|
+
re.e('timestep')
|
5
|
+
.timestep(progress, function(){
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
});
|
10
|
+
*/
|
11
|
+
|
12
|
+
re.c('timestep')
|
13
|
+
.inherit({
|
14
|
+
|
15
|
+
stepProgress:0,
|
16
|
+
stepSize:0.3
|
17
|
+
|
18
|
+
})
|
19
|
+
.extend({
|
20
|
+
|
21
|
+
timestep:function(progress, callback, context){
|
22
|
+
|
23
|
+
this.stepProgress += progress;
|
24
|
+
|
25
|
+
while(this.stepProgress >= this.stepSize){
|
26
|
+
|
27
|
+
callback.call((context)?context:this);
|
28
|
+
|
29
|
+
this.stepProgress -= this.stepSize;
|
30
|
+
}
|
31
|
+
|
32
|
+
}
|
33
|
+
|
34
|
+
})
|
@@ -0,0 +1,57 @@
|
|
1
|
+
/*
|
2
|
+
The storage component contains methods for storing locally or session values.
|
3
|
+
This utilizes the new HTML5 localstorage and sessionstorage.
|
4
|
+
|
5
|
+
//create new local storage
|
6
|
+
re.e('storage:local');
|
7
|
+
|
8
|
+
//create new session storage
|
9
|
+
re.e('storage:session');
|
10
|
+
|
11
|
+
*/
|
12
|
+
re.c('storage')
|
13
|
+
.init(function(c, type){
|
14
|
+
this.storage = (type == 'session')? sessionStorage : localStorage;
|
15
|
+
})
|
16
|
+
.extend({
|
17
|
+
|
18
|
+
length:function(){
|
19
|
+
return this.storage.length;
|
20
|
+
},
|
21
|
+
|
22
|
+
key:function(index){
|
23
|
+
return this.storage.key(index);
|
24
|
+
},
|
25
|
+
|
26
|
+
getItem:function(key){
|
27
|
+
return this.storage.getItem(key);
|
28
|
+
},
|
29
|
+
|
30
|
+
getJson:function(key){
|
31
|
+
return JSON.parse(this.getItem(key));
|
32
|
+
},
|
33
|
+
|
34
|
+
setItem:function(key, data){
|
35
|
+
|
36
|
+
if(typeof data != 'number' || typeof data != 'string'){
|
37
|
+
data = JSON.stringify(data);
|
38
|
+
}
|
39
|
+
|
40
|
+
this.storage.setItem(key, data);
|
41
|
+
|
42
|
+
return this;
|
43
|
+
},
|
44
|
+
|
45
|
+
removeItem:function(key){
|
46
|
+
this.storage.removeItem(key);
|
47
|
+
|
48
|
+
return this;
|
49
|
+
},
|
50
|
+
|
51
|
+
clear:function(){
|
52
|
+
this.storage.clear();
|
53
|
+
|
54
|
+
return this;
|
55
|
+
}
|
56
|
+
|
57
|
+
})
|
@@ -0,0 +1,25 @@
|
|
1
|
+
/*
|
2
|
+
The log component extends a cross browser console.log command.
|
3
|
+
|
4
|
+
//example usage
|
5
|
+
re.e('log')
|
6
|
+
.log('example log');
|
7
|
+
|
8
|
+
//global usage
|
9
|
+
re.log('example log');
|
10
|
+
|
11
|
+
*/
|
12
|
+
re.log = function(){
|
13
|
+
try{
|
14
|
+
console.log.apply(console, arguments);
|
15
|
+
} catch(e){
|
16
|
+
try {
|
17
|
+
opera.postError.apply(opera, arguments);
|
18
|
+
} catch(e){
|
19
|
+
alert(Array.prototype.join.call(arguments, " "));
|
20
|
+
}
|
21
|
+
}
|
22
|
+
};
|
23
|
+
|
24
|
+
re.c('log')
|
25
|
+
.extend('log', re.log);
|
@@ -0,0 +1,25 @@
|
|
1
|
+
/*
|
2
|
+
The polyfill component polyfills unsupported HTML5 functions when possible.
|
3
|
+
*/
|
4
|
+
re.c('polyfill')
|
5
|
+
.extend({
|
6
|
+
|
7
|
+
requestAnimationFrame:function(callback, canvas){
|
8
|
+
return requestAnimFrame(callback, canvas);
|
9
|
+
}
|
10
|
+
|
11
|
+
})
|
12
|
+
.run(function(){
|
13
|
+
|
14
|
+
//setup requestanimationframe on support
|
15
|
+
window.requestAnimFrame =
|
16
|
+
window.requestAnimationFrame ||
|
17
|
+
window.webkitRequestAnimationFrame ||
|
18
|
+
window.mozRequestAnimationFrame ||
|
19
|
+
window.oRequestAnimationFrame ||
|
20
|
+
window.msRequestAnimationFrame ||
|
21
|
+
function(callback){
|
22
|
+
window.setTimeout(callback, 1000 / 60);
|
23
|
+
};
|
24
|
+
|
25
|
+
});
|
@@ -0,0 +1,38 @@
|
|
1
|
+
/*
|
2
|
+
The random component implements two helper methods for calculating random numbers.
|
3
|
+
|
4
|
+
r = re.e('random');
|
5
|
+
|
6
|
+
r.random() // 0 - 1
|
7
|
+
r.random(10) // 0 - 9
|
8
|
+
r.random(10, 30) // 10 - 30
|
9
|
+
|
10
|
+
randomInt rounds numbers to whole
|
11
|
+
*/
|
12
|
+
re.c('random')
|
13
|
+
.extend({
|
14
|
+
|
15
|
+
random:function(max, min){
|
16
|
+
switch(arguments.length){
|
17
|
+
case 0:
|
18
|
+
return Math.random();
|
19
|
+
case 1:
|
20
|
+
return Math.random() * max;
|
21
|
+
case 2:
|
22
|
+
return Math.random() * (max - min + 1) + min;
|
23
|
+
}
|
24
|
+
},
|
25
|
+
|
26
|
+
randomInt:function(max, min){
|
27
|
+
return Math.floor(this.random.apply(this, arguments));
|
28
|
+
}
|
29
|
+
|
30
|
+
})
|
31
|
+
.run(function(){
|
32
|
+
var b = re.e('random');
|
33
|
+
|
34
|
+
re.random = b.random;
|
35
|
+
re.randomInt = b.randomInt;
|
36
|
+
|
37
|
+
b.dispose();
|
38
|
+
});
|
@@ -0,0 +1,101 @@
|
|
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', {tiles:[]} );
|
20
|
+
|
21
|
+
//delete a scene
|
22
|
+
re.scene('-home');
|
23
|
+
|
24
|
+
//combine delete home goto title sceen
|
25
|
+
re.scene('-home title');
|
26
|
+
*/
|
27
|
+
re.scene = function(title){
|
28
|
+
var s = re.c('scene');
|
29
|
+
|
30
|
+
//delete scene
|
31
|
+
if(title.charAt(0) == '-'){
|
32
|
+
|
33
|
+
delete s._scenes[title.substr(1)];
|
34
|
+
|
35
|
+
return s;
|
36
|
+
|
37
|
+
} else if(s._scenes[title]){
|
38
|
+
//go to scene
|
39
|
+
|
40
|
+
var current = arguments.callee.current;
|
41
|
+
|
42
|
+
//call exit
|
43
|
+
var t = s._scenes[current];
|
44
|
+
if(t && typeof t.scene_exit == 'function'){
|
45
|
+
t.scene_exit.call(t, title);
|
46
|
+
}
|
47
|
+
|
48
|
+
arguments.callee.current = title;
|
49
|
+
s.curent = title;
|
50
|
+
|
51
|
+
t = s._scenes[title];
|
52
|
+
|
53
|
+
if(typeof t.scene_enter == 'function'){
|
54
|
+
t.scene_enter.apply(t, Array.prototype.slice.call(arguments, 1));
|
55
|
+
}
|
56
|
+
|
57
|
+
|
58
|
+
} else {
|
59
|
+
|
60
|
+
//add scene
|
61
|
+
re.e('scene:'+title);
|
62
|
+
}
|
63
|
+
|
64
|
+
return s._scenes[title];
|
65
|
+
};
|
66
|
+
|
67
|
+
re.c('scene')
|
68
|
+
.global({
|
69
|
+
|
70
|
+
_scenes:{}
|
71
|
+
|
72
|
+
})
|
73
|
+
.init(function(c, title){
|
74
|
+
|
75
|
+
c._scenes[title] = this;
|
76
|
+
this.sceneName = title;
|
77
|
+
|
78
|
+
})
|
79
|
+
.dispose(function(c){
|
80
|
+
|
81
|
+
delete c._scenes[this.sceneName];
|
82
|
+
|
83
|
+
})
|
84
|
+
.extend({
|
85
|
+
|
86
|
+
enter:function(m){
|
87
|
+
this.scene_enter = m;
|
88
|
+
|
89
|
+
return this;
|
90
|
+
},
|
91
|
+
|
92
|
+
exit:function(m){
|
93
|
+
this.scene_exit = m;
|
94
|
+
|
95
|
+
return this;
|
96
|
+
},
|
97
|
+
|
98
|
+
scene:function(){
|
99
|
+
return re.scene.apply(this, arguments);
|
100
|
+
}
|
101
|
+
});
|
@@ -0,0 +1,51 @@
|
|
1
|
+
/*
|
2
|
+
The sheet component converts a each frame of a sprite sheet into their own components.
|
3
|
+
*/
|
4
|
+
re.c('sheet')
|
5
|
+
.global({
|
6
|
+
|
7
|
+
sheet:function(map, padX, padY, sizeX, sizeY){
|
8
|
+
|
9
|
+
var frameWidth = sizeX || re.tile.sizeX;
|
10
|
+
var frameHeight = sizeY || re.tile.sizeY;
|
11
|
+
|
12
|
+
if(padX){
|
13
|
+
frameWidth += padX;
|
14
|
+
}
|
15
|
+
|
16
|
+
if(padY){
|
17
|
+
frameHeight += padY;
|
18
|
+
}
|
19
|
+
|
20
|
+
//create new sprites for sheet
|
21
|
+
|
22
|
+
//save frame positions from map
|
23
|
+
var x;
|
24
|
+
var y;
|
25
|
+
|
26
|
+
for(var p in map){
|
27
|
+
x = map[p][0] || 0;
|
28
|
+
y = map[p][1] || 0;
|
29
|
+
|
30
|
+
re.c(p)
|
31
|
+
.require('sprite')
|
32
|
+
.extend({
|
33
|
+
frame:{x:x, y:y},
|
34
|
+
size:{x:frameWidth, y:frameHeight},
|
35
|
+
bitmap:this.bitmap
|
36
|
+
});
|
37
|
+
|
38
|
+
}
|
39
|
+
|
40
|
+
return this;
|
41
|
+
}
|
42
|
+
|
43
|
+
})
|
44
|
+
.require('tile')
|
45
|
+
.extend({
|
46
|
+
|
47
|
+
sheet:re.sheet
|
48
|
+
|
49
|
+
});
|
50
|
+
|
51
|
+
re.sheet = re.c('sheet').sheet;
|