entityjs 0.4.3 → 0.4.4
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.
- data/bin/entityjs +2 -0
- data/lib/entityjs/assets.rb +10 -7
- data/lib/entityjs/commands/build.rb +58 -10
- data/lib/entityjs/commands/comp.rb +7 -2
- data/lib/entityjs/commands/min.rb +5 -0
- data/lib/entityjs/commands/server.rb +4 -0
- data/lib/entityjs/commands/test.rb +7 -3
- data/lib/entityjs/config.rb +23 -1
- data/lib/entityjs/dirc.rb +3 -2
- data/lib/entityjs/page.rb +7 -1
- data/lib/entityjs/version.rb +1 -1
- data/public/qunit/qunit.entity.js +2 -1
- data/public/qunit/qunit.mock.js +8 -1
- data/spec/javascripts/src/core/comp_spec.js +36 -0
- data/spec/javascripts/src/core/entity_spec.js +13 -0
- data/spec/javascripts/src/core/load_spec.js +1 -1
- data/spec/javascripts/src/core/query_spec.js +1 -0
- data/spec/javascripts/src/media/sound_spec.js +0 -8
- data/spec/lib/entityjs/assets_spec.rb +6 -2
- data/spec/lib/entityjs/commands/build_spec.rb +7 -1
- data/spec/lib/entityjs/commands/templates_spec.rb +1 -0
- data/spec/support/mygame.rb +10 -2
- data/src/core/comp.js +21 -3
- data/src/core/entity.js +9 -5
- data/src/core/load.js +9 -4
- data/src/core/query.js +1 -1
- data/src/display/circle.js +2 -2
- data/src/display/draw.js +1 -1
- data/src/display/text.js +1 -1
- data/src/input/keyboard.js +2 -1
- data/src/math/bisect.js +4 -4
- data/src/math/clamp.js +8 -0
- data/src/math/hit.js +5 -12
- data/src/math/iso.js +3 -0
- data/src/math/tile.js +1 -2
- data/src/media/sound.js +39 -28
- data/src/util/assert.js +10 -0
- data/src/util/extend.js +9 -0
- data/src/util/support.js +3 -2
- metadata +21 -18
data/bin/entityjs
CHANGED
data/lib/entityjs/assets.rb
CHANGED
@@ -11,7 +11,7 @@ module Entityjs
|
|
11
11
|
['mp3', 'ogg', 'aac', 'wav']
|
12
12
|
end
|
13
13
|
|
14
|
-
def self.search(type=
|
14
|
+
def self.search(type=nil)
|
15
15
|
|
16
16
|
case type
|
17
17
|
when 'images'
|
@@ -25,8 +25,7 @@ module Entityjs
|
|
25
25
|
return self.find_files(sounds_folder+"/**/*.{#{valid_sounds}}")
|
26
26
|
|
27
27
|
else
|
28
|
-
|
29
|
-
return self.search_datas
|
28
|
+
return self.find_files(Config.assets_folder+'/**/*')
|
30
29
|
|
31
30
|
end
|
32
31
|
|
@@ -34,14 +33,18 @@ module Entityjs
|
|
34
33
|
|
35
34
|
def self.search_datas
|
36
35
|
#TODO: find all other folders and generate a key in re.assets
|
36
|
+
#DEPRECATED
|
37
37
|
return self.find_files("#{Config.assets_folder}/*/*").select{|i| i.match(/(images|sounds)\//i) == nil }
|
38
38
|
end
|
39
39
|
|
40
40
|
def self.find_files(search)
|
41
|
-
Dir
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
Dir.glob(Dirc.game_root+'/'+search).collect do |i|
|
42
|
+
if File.file?(i)
|
43
|
+
#remove long string
|
44
|
+
i = i.split(Config.assets_folder+"/").pop
|
45
|
+
end
|
46
|
+
end.compact
|
47
|
+
#remove nils from array too
|
45
48
|
end
|
46
49
|
|
47
50
|
end
|
@@ -21,7 +21,7 @@ module Entityjs
|
|
21
21
|
scripts_folder = Config.scripts_folder
|
22
22
|
styles_folder = Config.instance.build_styles_path
|
23
23
|
|
24
|
-
final_name = Config.instance.
|
24
|
+
final_name = Config.instance.build_scripts_name
|
25
25
|
html_name = 'play.html'
|
26
26
|
|
27
27
|
puts "Building to #{build_folder}"
|
@@ -63,7 +63,7 @@ module Entityjs
|
|
63
63
|
#save css
|
64
64
|
Dirc.create_dir(styles_folder)
|
65
65
|
|
66
|
-
File.open(styles_folder+"/"+Config.instance.build_styles_name
|
66
|
+
File.open(styles_folder+"/"+Config.instance.build_styles_name, 'w') do |f|
|
67
67
|
f.write(css)
|
68
68
|
end
|
69
69
|
|
@@ -181,7 +181,15 @@ module Entityjs
|
|
181
181
|
entity_src = self.compile_entity(Config.instance.build_entity_ignore+Config.instance.entity_ignore)
|
182
182
|
scripts = self.compile_scripts(Config.instance.build_scripts_ignore+Config.instance.scripts_ignore, Config.instance.scripts_order)
|
183
183
|
|
184
|
-
self.build_wrap(entity_src+scripts)
|
184
|
+
code = self.build_wrap(entity_src+scripts)
|
185
|
+
|
186
|
+
#build erase
|
187
|
+
Config.instance.build_erase.each do |i|
|
188
|
+
#replace all finds with comments in front
|
189
|
+
code = code.gsub(i, "//#{i}")
|
190
|
+
end
|
191
|
+
|
192
|
+
return code
|
185
193
|
end
|
186
194
|
|
187
195
|
def self.build_wrap(code)
|
@@ -209,18 +217,21 @@ module Entityjs
|
|
209
217
|
return code
|
210
218
|
end
|
211
219
|
|
212
|
-
def self.js_config(path = nil,
|
220
|
+
def self.js_config(path = nil, assets = nil, canvas = nil)
|
213
221
|
path ||= Config.assets_folder+'/'
|
214
|
-
|
215
|
-
|
222
|
+
|
223
|
+
if assets.nil?
|
224
|
+
assets = self.assets_to_js
|
225
|
+
end
|
226
|
+
if assets.is_a? Hash
|
227
|
+
assets = assets.to_json
|
228
|
+
end
|
229
|
+
|
216
230
|
canvas ||= Config.instance.canvas_id
|
217
231
|
|
218
232
|
return %Q(
|
219
233
|
re.load.path = \"#{path}\";
|
220
|
-
re.assets = {
|
221
|
-
images:#{images},
|
222
|
-
sounds:#{sounds}
|
223
|
-
};
|
234
|
+
re.assets = #{assets};
|
224
235
|
re.canvas = \"##{canvas}\";
|
225
236
|
)
|
226
237
|
end
|
@@ -242,6 +253,43 @@ module Entityjs
|
|
242
253
|
|
243
254
|
"[#{s}]"
|
244
255
|
end
|
256
|
+
|
257
|
+
#returns all folders from assets array in a js object
|
258
|
+
#
|
259
|
+
#Input like this:
|
260
|
+
# ["images/blah.png", "images/tree.png", "models/tree.xml"]
|
261
|
+
#
|
262
|
+
# Is returned like this:
|
263
|
+
# {
|
264
|
+
# images:["blah.png", "tree.png"],
|
265
|
+
# model:["tree.xml"]
|
266
|
+
# }
|
267
|
+
#
|
268
|
+
def self.assets_to_js(assets = nil, ignore=nil)
|
269
|
+
assets ||= Assets.search()
|
270
|
+
ignore ||= Config.instance.assets_ignore
|
271
|
+
|
272
|
+
tree = {}
|
273
|
+
|
274
|
+
assets.each do |i|
|
275
|
+
|
276
|
+
if ignore.any? && !i.match(/#{ignore.join('|')}/).nil?
|
277
|
+
#ignore assets
|
278
|
+
next
|
279
|
+
end
|
280
|
+
|
281
|
+
#folder
|
282
|
+
folder = i.split('/').first
|
283
|
+
|
284
|
+
if tree[folder].nil?
|
285
|
+
tree[folder] = []
|
286
|
+
end
|
287
|
+
|
288
|
+
tree[folder].push(i)
|
289
|
+
end
|
290
|
+
|
291
|
+
return tree.to_json
|
292
|
+
end
|
245
293
|
|
246
294
|
end
|
247
295
|
|
@@ -6,8 +6,12 @@ module Entityjs
|
|
6
6
|
if !Dirc.game?
|
7
7
|
return 2
|
8
8
|
end
|
9
|
+
|
10
|
+
if name.nil?
|
11
|
+
return 4
|
12
|
+
end
|
9
13
|
|
10
|
-
if name.
|
14
|
+
if name.is_a? Array
|
11
15
|
name = name.first
|
12
16
|
end
|
13
17
|
|
@@ -17,6 +21,7 @@ module Entityjs
|
|
17
21
|
end
|
18
22
|
|
19
23
|
filename = name
|
24
|
+
|
20
25
|
if name.index('.').nil?
|
21
26
|
filename += '.js'
|
22
27
|
end
|
@@ -60,7 +65,7 @@ module Entityjs
|
|
60
65
|
f.close
|
61
66
|
end
|
62
67
|
|
63
|
-
puts "Created comp: #{
|
68
|
+
puts "Created comp: #{filename}"
|
64
69
|
|
65
70
|
Dir.chdir(Dirc.game_root)
|
66
71
|
|
@@ -10,6 +10,11 @@ module Entityjs
|
|
10
10
|
|
11
11
|
Config.instance.reload
|
12
12
|
|
13
|
+
#make build dir if not found
|
14
|
+
if !File.directory?(Config.instance.build_path)
|
15
|
+
Dir.mkdir(Config.instance.build_path)
|
16
|
+
end
|
17
|
+
|
13
18
|
final_name = Config.instance.build_name+'.js'
|
14
19
|
path = Config.instance.build_path+'/'+final_name
|
15
20
|
|
@@ -8,8 +8,12 @@ module Entityjs
|
|
8
8
|
end
|
9
9
|
|
10
10
|
tests = []
|
11
|
+
|
12
|
+
if name.nil?
|
13
|
+
return 4
|
14
|
+
end
|
11
15
|
|
12
|
-
if name.
|
16
|
+
if name.is_a? Array
|
13
17
|
tests = name[1..-1]
|
14
18
|
|
15
19
|
name = name.first
|
@@ -44,7 +48,7 @@ module Entityjs
|
|
44
48
|
return 3
|
45
49
|
end
|
46
50
|
|
47
|
-
test_name = filename.split('_test.').
|
51
|
+
test_name = filename.split('_test.').first
|
48
52
|
|
49
53
|
File.open(filename, 'w') do |f|
|
50
54
|
|
@@ -57,7 +61,7 @@ module Entityjs
|
|
57
61
|
f.close
|
58
62
|
end
|
59
63
|
|
60
|
-
puts "Created test:
|
64
|
+
puts "Created test: #{filename}"
|
61
65
|
|
62
66
|
Dir.chdir(Dirc.game_root)
|
63
67
|
|
data/lib/entityjs/config.rb
CHANGED
@@ -96,6 +96,10 @@ module Entityjs
|
|
96
96
|
def scripts_order
|
97
97
|
return split_attr('scripts-order')
|
98
98
|
end
|
99
|
+
|
100
|
+
def assets_ignore
|
101
|
+
return split_attr('assets-ignore')
|
102
|
+
end
|
99
103
|
|
100
104
|
def tests_ignore
|
101
105
|
return split_attr('tests-ignore')
|
@@ -104,6 +108,18 @@ module Entityjs
|
|
104
108
|
def entity_ignore
|
105
109
|
return split_attr('entity-ignore')
|
106
110
|
end
|
111
|
+
|
112
|
+
#erases found lines on compiling
|
113
|
+
#NOT implemented
|
114
|
+
def build_erase
|
115
|
+
return split_attr('build-erase')
|
116
|
+
end
|
117
|
+
|
118
|
+
#overwrites config vars during compiling
|
119
|
+
#NOT implemented
|
120
|
+
def build_vars
|
121
|
+
|
122
|
+
end
|
107
123
|
|
108
124
|
def build_entity_ignore
|
109
125
|
return split_attr('build-entity-ignore')
|
@@ -113,8 +129,12 @@ module Entityjs
|
|
113
129
|
return get_attr('build-name', self.title_slug+'.min')
|
114
130
|
end
|
115
131
|
|
132
|
+
def build_scripts_name
|
133
|
+
return get_attr('build-scripts-name', self.build_name+'.js')
|
134
|
+
end
|
135
|
+
|
116
136
|
def build_styles_name
|
117
|
-
return get_attr('
|
137
|
+
return get_attr('build-styles-name', self.build_name+'.css')
|
118
138
|
end
|
119
139
|
|
120
140
|
def build_styles_ignore
|
@@ -202,6 +222,8 @@ module Entityjs
|
|
202
222
|
contents = contents.gsub("RE_#{val}", v.to_s)
|
203
223
|
end
|
204
224
|
|
225
|
+
#build erase
|
226
|
+
|
205
227
|
#set width, height and canvas id
|
206
228
|
#contents = contents.sub("RE_WIDTH", Config.instance.width.to_s)
|
207
229
|
#contents = contents.sub("RE_HEIGHT", Config.instance.height.to_s)
|
data/lib/entityjs/dirc.rb
CHANGED
@@ -5,6 +5,7 @@ module Entityjs
|
|
5
5
|
|
6
6
|
class Dirc
|
7
7
|
|
8
|
+
#is the current directory an EntityJS game?
|
8
9
|
def self.game?
|
9
10
|
|
10
11
|
#check if scripts dir exists
|
@@ -19,17 +20,17 @@ module Entityjs
|
|
19
20
|
return false
|
20
21
|
end
|
21
22
|
|
22
|
-
#checks if
|
23
|
+
#checks if file exists in the EntityJS game
|
23
24
|
def self.exists?(file)
|
24
25
|
return File.file? Dirc.game_root+'/'+file
|
25
26
|
end
|
26
27
|
|
28
|
+
#path to EntityJS game
|
27
29
|
def self.to_game_root
|
28
30
|
Dir.chdir(@game_root)
|
29
31
|
end
|
30
32
|
|
31
33
|
def self.game_root
|
32
|
-
|
33
34
|
@game_root
|
34
35
|
end
|
35
36
|
|
data/lib/entityjs/page.rb
CHANGED
@@ -130,7 +130,13 @@ module Entityjs
|
|
130
130
|
|
131
131
|
first_folder = folders
|
132
132
|
if last != first_folder
|
133
|
-
|
133
|
+
if first_folder.is_a? Array
|
134
|
+
line = first_folder.join('/')
|
135
|
+
else
|
136
|
+
line = first_folder
|
137
|
+
end
|
138
|
+
|
139
|
+
js += "\n\n\t<!-- #{line} -->\n"
|
134
140
|
last = first_folder
|
135
141
|
end
|
136
142
|
|
data/lib/entityjs/version.rb
CHANGED
@@ -238,6 +238,7 @@ function lazy(comps, obj){
|
|
238
238
|
teardown:function(){
|
239
239
|
if(obj && obj.teardown) obj.teardown(e);
|
240
240
|
e.dispose();
|
241
|
+
delete window[name];
|
241
242
|
}
|
242
243
|
}
|
243
244
|
}
|
@@ -318,4 +319,4 @@ function match(test, reg, i){
|
|
318
319
|
|
319
320
|
ok(test.match(reg) != null, "Expected to match "+reg)
|
320
321
|
|
321
|
-
}
|
322
|
+
}
|
data/public/qunit/qunit.mock.js
CHANGED
@@ -50,7 +50,9 @@ stub(re, 'pressed', 10);
|
|
50
50
|
|
51
51
|
return expectation.callCount += 1;
|
52
52
|
};
|
53
|
-
|
53
|
+
mocking.expectations.push(expectation);
|
54
|
+
|
55
|
+
return object[method];
|
54
56
|
};
|
55
57
|
stub = function(object, method, fn) {
|
56
58
|
var stb;
|
@@ -70,6 +72,11 @@ stub(re, 'pressed', 10);
|
|
70
72
|
original: object[method]
|
71
73
|
};
|
72
74
|
object[method] = fn;
|
75
|
+
|
76
|
+
if(!mocking || !mocking.stubs){
|
77
|
+
throw "Can only stub inside tests!";
|
78
|
+
}
|
79
|
+
|
73
80
|
return mocking.stubs.push(stb);
|
74
81
|
};
|
75
82
|
mock = function(test) {
|
@@ -20,6 +20,42 @@ describe('comp', function(){
|
|
20
20
|
eq(re[k.name].yep, 'yep')
|
21
21
|
})
|
22
22
|
|
23
|
+
it('should create comp in new style', function(){
|
24
|
+
|
25
|
+
re.c('jump12', {
|
26
|
+
requires:"sdf",
|
27
|
+
|
28
|
+
init:function(){
|
29
|
+
|
30
|
+
},
|
31
|
+
|
32
|
+
defines:{
|
33
|
+
ok:10
|
34
|
+
},
|
35
|
+
|
36
|
+
defaults:{
|
37
|
+
k:10
|
38
|
+
},
|
39
|
+
|
40
|
+
factory:function(){
|
41
|
+
|
42
|
+
}
|
43
|
+
|
44
|
+
});
|
45
|
+
|
46
|
+
eq(re.c('jump12')._re_requires, ['sdf']);
|
47
|
+
eq(re.c('jump12')._re_defines, {ok:10});
|
48
|
+
eq(re.c('jump12')._re_defaults, {k:10});
|
49
|
+
|
50
|
+
});
|
51
|
+
|
52
|
+
it('should use default factory', function(){
|
53
|
+
var a = 10;
|
54
|
+
|
55
|
+
eq(re[k.name]("blah", a).blah, a);
|
56
|
+
|
57
|
+
});
|
58
|
+
|
23
59
|
it('should create a factory', function(){
|
24
60
|
var val = 10;
|
25
61
|
|
@@ -30,6 +30,19 @@ describe('entity', function(){
|
|
30
30
|
eq(e.get('bla'), 10);
|
31
31
|
});
|
32
32
|
|
33
|
+
it('should trigger once', function(){
|
34
|
+
var count = 0;
|
35
|
+
e.once('blah', function(){
|
36
|
+
count++;
|
37
|
+
});
|
38
|
+
|
39
|
+
e.trigger('blah');
|
40
|
+
e.trigger('blah');
|
41
|
+
e.trigger('blah');
|
42
|
+
|
43
|
+
eq(count, 1);
|
44
|
+
});
|
45
|
+
|
33
46
|
it('comp', function(){
|
34
47
|
e.comp('qwdqwd wer')
|
35
48
|
|
@@ -4,7 +4,7 @@ describe('load', function(){
|
|
4
4
|
//add images
|
5
5
|
re.load.path = '__spec__/'
|
6
6
|
var img = '/__spec__/helpers/accept.png'
|
7
|
-
var sfx = 'helpers/alligator.mp3'
|
7
|
+
var sfx = 'http://localhost:8888/__spec__/helpers/alligator.mp3'
|
8
8
|
var sfx2 = 'helpers/alligator.ogg'
|
9
9
|
|
10
10
|
var called = false
|
@@ -10,7 +10,7 @@ describe 'Assets' do
|
|
10
10
|
@sounds_file = Entityjs::Config.sounds_folder+'/fold/secret1.mp3'
|
11
11
|
files.push @sounds_file
|
12
12
|
|
13
|
-
Dir.stub(:
|
13
|
+
Dir.stub(:glob).and_return(files)
|
14
14
|
IO.stub(:read).and_return('{"test":0, "array":[1,2,3]}')
|
15
15
|
end
|
16
16
|
|
@@ -32,6 +32,10 @@ describe 'Assets' do
|
|
32
32
|
|
33
33
|
end
|
34
34
|
|
35
|
-
it 'should return all
|
35
|
+
it 'should return all assets' do
|
36
|
+
r = Entityjs::Assets.search()
|
37
|
+
|
38
|
+
r.should include(@sounds_file.gsub('assets/',''))
|
39
|
+
end
|
36
40
|
|
37
41
|
end
|
@@ -46,12 +46,18 @@ describe 'build' do
|
|
46
46
|
canvas = 'game-canvas'
|
47
47
|
scripts = "re.ready(function(){});"
|
48
48
|
|
49
|
-
scripts += Entityjs::Build.js_config('', images, sounds, canvas)
|
49
|
+
scripts += Entityjs::Build.js_config('', {:images=>images, :sounds=>sounds}, canvas)
|
50
50
|
|
51
51
|
#min
|
52
52
|
min = Entityjs::Build.minify(scripts)
|
53
53
|
|
54
54
|
min.should match /Entityjs/i
|
55
55
|
end
|
56
|
+
|
57
|
+
it 'should build assets to js' do
|
58
|
+
data = ["images/blah.png", "models/tree.xml"]
|
59
|
+
|
60
|
+
Entityjs::Build.assets_to_js(data).should include("blah.png")
|
61
|
+
end
|
56
62
|
|
57
63
|
end
|
data/spec/support/mygame.rb
CHANGED
@@ -1,14 +1,22 @@
|
|
1
1
|
|
2
2
|
def setup_mygame
|
3
|
+
|
3
4
|
root = File.dirname(__FILE__)+'/../..'
|
4
5
|
|
5
6
|
if !File.directory? root+'/mygame'
|
6
7
|
Dir.mkdir(root+'/mygame')
|
7
8
|
end
|
8
|
-
|
9
|
+
|
10
|
+
if !File.directory? root+'/mygame/scripts'
|
11
|
+
Dir.mkdir(root+'/mygame/scripts')
|
12
|
+
end
|
13
|
+
|
9
14
|
Dir.chdir(root+'/mygame')
|
10
15
|
|
11
|
-
Entityjs::Dirc.game?
|
16
|
+
if !Entityjs::Dirc.game?
|
17
|
+
raise "Error game folder not found"
|
18
|
+
end
|
19
|
+
|
12
20
|
end
|
13
21
|
|
14
22
|
def teardown_mygame
|
data/src/core/comp.js
CHANGED
@@ -3,11 +3,18 @@
|
|
3
3
|
|
4
4
|
@return component reference
|
5
5
|
*/
|
6
|
-
re.comp = re.c = function(title){
|
6
|
+
re.comp = re.c = function(title, data){
|
7
7
|
|
8
8
|
if(!re._c[title]){
|
9
9
|
re._c[title] = new re.c.init(title);
|
10
10
|
}
|
11
|
+
|
12
|
+
//set data
|
13
|
+
if(data){
|
14
|
+
for(var i in data){
|
15
|
+
re._c[title][i](data[i]);
|
16
|
+
}
|
17
|
+
}
|
11
18
|
|
12
19
|
return re._c[title];
|
13
20
|
};
|
@@ -74,7 +81,7 @@ re.c.init.prototype = {
|
|
74
81
|
//turns global method into a singleton
|
75
82
|
singleton:function(){
|
76
83
|
this._re_method = function(){
|
77
|
-
return this.
|
84
|
+
return this._singleton || (this._singleton = re.e(this.name));
|
78
85
|
}
|
79
86
|
return this;
|
80
87
|
},
|
@@ -122,7 +129,6 @@ re.c.init.prototype = {
|
|
122
129
|
|
123
130
|
//new control entity
|
124
131
|
re.control(val1, val2);
|
125
|
-
re.c('control').factory
|
126
132
|
|
127
133
|
*/
|
128
134
|
factory:function(f){
|
@@ -133,11 +139,23 @@ re.c.init.prototype = {
|
|
133
139
|
return this;
|
134
140
|
},
|
135
141
|
|
142
|
+
/*
|
143
|
+
Controls the factory method flow.
|
144
|
+
|
145
|
+
Will create a new entity and try to use the defined factory or else
|
146
|
+
uses the default:
|
147
|
+
|
148
|
+
//default factory
|
149
|
+
re.circle({radius:10, color:"#ff0000"});
|
150
|
+
|
151
|
+
*/
|
136
152
|
_re_method:function(){
|
137
153
|
var e = re.e(this.name), f = this._re_factory;
|
138
154
|
|
139
155
|
if(f)
|
140
156
|
f.apply(e, arguments);
|
157
|
+
else
|
158
|
+
e.attr.apply(e,arguments); //this is the default factory method
|
141
159
|
|
142
160
|
return e;
|
143
161
|
},
|
data/src/core/entity.js
CHANGED
@@ -329,12 +329,12 @@
|
|
329
329
|
|
330
330
|
});
|
331
331
|
*/
|
332
|
-
p.on = function(type, method, context){
|
332
|
+
p.on = function(type, method, context, once){
|
333
333
|
|
334
334
|
if(re.is(type, 'object')){
|
335
335
|
|
336
336
|
for(var k in type){
|
337
|
-
this.on(k, type[k], method);
|
337
|
+
this.on(k, type[k], method, context);
|
338
338
|
}
|
339
339
|
|
340
340
|
} else {
|
@@ -344,12 +344,16 @@
|
|
344
344
|
}
|
345
345
|
if(!re.is(method)) throw 'Method is null'
|
346
346
|
//save context
|
347
|
-
this._re_listens[type].push({c:context || this, f:method});
|
347
|
+
this._re_listens[type].push({c:context || this, f:method, o:once});
|
348
348
|
|
349
349
|
}
|
350
350
|
|
351
351
|
return this;
|
352
352
|
};
|
353
|
+
|
354
|
+
p.once = function(type, method, context){
|
355
|
+
return this.on(type, method, context, 1);
|
356
|
+
};
|
353
357
|
|
354
358
|
/*
|
355
359
|
Added in V0.2.1
|
@@ -423,8 +427,8 @@
|
|
423
427
|
if(!b) break;
|
424
428
|
if(!b[i]) continue;
|
425
429
|
|
426
|
-
//return false remove
|
427
|
-
if(b[i].f.apply(b[i].c, Array.prototype.slice.call(arguments, 1)) === false){
|
430
|
+
//return false remove or if is once listen
|
431
|
+
if(b[i].f.apply(b[i].c, Array.prototype.slice.call(arguments, 1)) === false || (b[i] && b[i].o)){
|
428
432
|
b.splice(i, 1);
|
429
433
|
}
|
430
434
|
|
data/src/core/load.js
CHANGED
@@ -78,7 +78,7 @@
|
|
78
78
|
a = this.assets[i];
|
79
79
|
|
80
80
|
//copy full source path
|
81
|
-
var s = (a.
|
81
|
+
var s = (a.match(/^(\/|http:)/))?a:re.load.path+a;
|
82
82
|
|
83
83
|
//remove directories
|
84
84
|
a = re.load.file(a);
|
@@ -125,6 +125,9 @@
|
|
125
125
|
p.current = 0;
|
126
126
|
p.total = 0;
|
127
127
|
|
128
|
+
//src - full path to image
|
129
|
+
//a - image name
|
130
|
+
//n - image name without ext
|
128
131
|
p._loadImg = function(src, a, n){
|
129
132
|
var that = this;
|
130
133
|
var img = new Image();
|
@@ -146,6 +149,7 @@
|
|
146
149
|
|
147
150
|
that._loaded();
|
148
151
|
};
|
152
|
+
img.crossOrigin = '';
|
149
153
|
|
150
154
|
img.onerror = function(){
|
151
155
|
|
@@ -202,8 +206,7 @@
|
|
202
206
|
});
|
203
207
|
|
204
208
|
} else {
|
205
|
-
s = new Audio(
|
206
|
-
s.src = src;
|
209
|
+
s = new Audio();
|
207
210
|
s.preload = "auto";
|
208
211
|
s.load();
|
209
212
|
|
@@ -223,6 +226,8 @@
|
|
223
226
|
}
|
224
227
|
},false);
|
225
228
|
|
229
|
+
s.src = src;
|
230
|
+
|
226
231
|
this._def_sfx(s, a, n);
|
227
232
|
|
228
233
|
}
|
@@ -232,7 +237,7 @@
|
|
232
237
|
p._def_sfx = function(s, a, n){
|
233
238
|
|
234
239
|
re.c(a)
|
235
|
-
//create
|
240
|
+
//create static codec for easy use
|
236
241
|
.alias(n+re.load.soundExt)
|
237
242
|
.defines({
|
238
243
|
_sound:s
|
data/src/core/query.js
CHANGED
data/src/display/circle.js
CHANGED
@@ -13,7 +13,7 @@ re.c('circle')
|
|
13
13
|
c.fillStyle = this.color;
|
14
14
|
|
15
15
|
c.beginPath();
|
16
|
-
var r = this.radius;
|
16
|
+
var r = this.get('radius');
|
17
17
|
|
18
18
|
c.arc(-this.regX + r , -this.regY + r , r, 0, Math.PI*2, true);
|
19
19
|
|
@@ -31,4 +31,4 @@ re.c('circle')
|
|
31
31
|
return this.sizeX * 0.5;
|
32
32
|
}
|
33
33
|
|
34
|
-
});
|
34
|
+
});
|
data/src/display/draw.js
CHANGED
@@ -133,7 +133,7 @@ re.c('draw')
|
|
133
133
|
*/
|
134
134
|
visible:function(){
|
135
135
|
|
136
|
-
return this.drawable && re.screen.hit(this.posX
|
136
|
+
return this.drawable && re.screen.hit(this.posX, this.posY, this.sizeX, this.sizeY);
|
137
137
|
|
138
138
|
}
|
139
139
|
|
data/src/display/text.js
CHANGED
data/src/input/keyboard.js
CHANGED
@@ -15,6 +15,7 @@ re.c('keyboard')
|
|
15
15
|
.statics({
|
16
16
|
//list of listing entities
|
17
17
|
l:[],
|
18
|
+
focusStop:true,
|
18
19
|
|
19
20
|
keyCodes: {
|
20
21
|
/* start the a-z keys */
|
@@ -116,7 +117,7 @@ re.c('keyboard')
|
|
116
117
|
var tagName = (e.target || e.srcElement || {}).tagName;
|
117
118
|
|
118
119
|
//disable keyboard keys if focus lost
|
119
|
-
if(
|
120
|
+
if(that.focusStop && tagName && tagName.match(/INPUT|SELECT|TEXTAREA/)){
|
120
121
|
return;
|
121
122
|
}
|
122
123
|
|
data/src/math/bisect.js
CHANGED
@@ -28,13 +28,13 @@ re.c('bisect')
|
|
28
28
|
return this.toTileY(bi, width, sizeX) * sizeY;
|
29
29
|
},
|
30
30
|
|
31
|
-
toTileX:function(bi, width,
|
31
|
+
toTileX:function(bi, width, sizeX){
|
32
32
|
|
33
|
-
return bi % (width /
|
33
|
+
return bi % (width / sizeX) | 0;
|
34
34
|
},
|
35
35
|
|
36
|
-
toTileY:function(bi, width,
|
37
|
-
return (bi *
|
36
|
+
toTileY:function(bi, width, sizeX){
|
37
|
+
return (bi * sizeX) / (width - 0.1) | 0;
|
38
38
|
},
|
39
39
|
|
40
40
|
/*
|
data/src/math/clamp.js
ADDED
data/src/math/hit.js
CHANGED
@@ -14,27 +14,20 @@ re.c('hit')
|
|
14
14
|
k.hit(entity);
|
15
15
|
|
16
16
|
*/
|
17
|
-
hit:function(x, y, w, h
|
17
|
+
hit:function(x, y, w, h){
|
18
18
|
if(re.is(x, 'object')){
|
19
19
|
y = x.posY || x.y;
|
20
20
|
w = x.sizeX || x.w;
|
21
21
|
h = x.sizeY || x.h;
|
22
|
-
rx = x.regX || 0;
|
23
|
-
ry = x.regY || 0;
|
24
22
|
x = x.posX || x.x;
|
25
23
|
}
|
26
24
|
|
27
|
-
rx = rx || 0;
|
28
|
-
ry = ry || 0;
|
29
|
-
var regX = this.regX || 0;
|
30
|
-
var regY = this.regY || 0;
|
31
|
-
|
32
25
|
return !
|
33
26
|
(
|
34
|
-
x
|
35
|
-
x + w
|
36
|
-
y
|
37
|
-
y + h
|
27
|
+
x > this.posX + this.sizeX ||
|
28
|
+
x + w < this.posX ||
|
29
|
+
y > this.posY + this.sizeY ||
|
30
|
+
y + h < this.posY
|
38
31
|
);
|
39
32
|
}
|
40
33
|
|
data/src/math/iso.js
CHANGED
data/src/math/tile.js
CHANGED
data/src/media/sound.js
CHANGED
@@ -45,17 +45,18 @@ This will be fixed with the channel component.
|
|
45
45
|
re.c('sound')
|
46
46
|
.statics({
|
47
47
|
|
48
|
-
enabled:true
|
48
|
+
enabled:true,
|
49
|
+
volume:1
|
49
50
|
|
50
51
|
})
|
51
52
|
.defaults({
|
52
53
|
playing:false
|
53
54
|
})
|
54
55
|
.namespaces({
|
55
|
-
e:
|
56
|
+
e:0,
|
56
57
|
|
57
58
|
ended:function(){
|
58
|
-
|
59
|
+
this.playing = 0;
|
59
60
|
this.trigger('sound:finish');
|
60
61
|
|
61
62
|
}
|
@@ -63,50 +64,60 @@ re.c('sound')
|
|
63
64
|
})
|
64
65
|
.defines({
|
65
66
|
|
66
|
-
|
67
|
+
/*
|
68
|
+
Plays the sound from the beginning.
|
69
|
+
|
70
|
+
onFinish is called when the sound has finished playing through all loops.
|
71
|
+
*/
|
72
|
+
play:function(loops, volume, onFinish){
|
67
73
|
if(!this._sound || !re.sound.enabled) return this;
|
68
74
|
if(this.playing) this.stop();
|
69
75
|
|
70
76
|
var c = this._sound;
|
71
77
|
var that = this;
|
78
|
+
volume = volume || re.sound.volume;
|
72
79
|
|
73
|
-
if(window
|
74
|
-
|
75
|
-
c.play({
|
76
|
-
|
77
|
-
|
80
|
+
if(window.soundManager){
|
81
|
+
//play sound with soundManager
|
82
|
+
c.play({
|
83
|
+
onfinish:function(){
|
84
|
+
that.sound_ended();
|
85
|
+
if(onFinish) onFinish(that);
|
86
|
+
},
|
87
|
+
position:0,
|
88
|
+
volume:volume,
|
89
|
+
loops:loops||1
|
78
90
|
});
|
79
91
|
|
80
92
|
} else {
|
93
|
+
//play with browser
|
81
94
|
c.currentTime = 0;
|
95
|
+
c.volume = volume;
|
96
|
+
loops = loops||1;
|
82
97
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
98
|
+
var f = function(){
|
99
|
+
if(--loops>0){
|
100
|
+
c.play();
|
101
|
+
} else {
|
87
102
|
c.removeEventListener('ended', f);
|
88
|
-
that.
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
103
|
+
that.sound_ended();
|
104
|
+
if(onFinish) onFinish(that);
|
105
|
+
}
|
106
|
+
};
|
107
|
+
|
108
|
+
c.addEventListener('ended', f);
|
109
|
+
|
94
110
|
c.play();
|
95
111
|
}
|
112
|
+
this.playing = 1;
|
96
113
|
|
97
114
|
return this;
|
98
115
|
},
|
99
116
|
|
100
|
-
|
101
|
-
|
102
|
-
this.playing = true;
|
103
|
-
|
104
|
-
return this;
|
105
|
-
},
|
106
|
-
|
107
|
-
pause:function(){
|
117
|
+
//stops playing the sound
|
118
|
+
stop:function(){
|
108
119
|
this._sound.pause();
|
109
|
-
this.playing =
|
120
|
+
this.playing = 0;
|
110
121
|
|
111
122
|
return this;
|
112
123
|
}
|
data/src/util/assert.js
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
/*
|
2
|
+
Throws an exception when false. This is useful for development.
|
3
|
+
|
4
|
+
All asserts will be removed when compiled.
|
5
|
+
*/
|
6
|
+
re.assert = function(test, message){
|
7
|
+
message = message || '';
|
8
|
+
if(!test) throw "Assert Fail: "+message;
|
9
|
+
re.log("Assert Pass: "+message);
|
10
|
+
};
|
data/src/util/extend.js
ADDED
data/src/util/support.js
CHANGED
@@ -77,9 +77,10 @@ re.support = function(s){
|
|
77
77
|
if(c.audio = !!ele.canPlayType){
|
78
78
|
|
79
79
|
c.ogg = ele.canPlayType('audio/ogg; codecs="vorbis"');
|
80
|
-
c.mp3 = ele.canPlayType('audio/mpeg;');
|
81
80
|
c.wav = ele.canPlayType('audio/wav; codecs="1"');
|
82
|
-
c.
|
81
|
+
c.webma = ele.canPlayType('audio/webm; codecs="vorbis"');
|
82
|
+
c.mp3 = ele.canPlayType('audio/mpeg; codecs="mp3"');
|
83
|
+
c.m4a = ele.canPlayType('audio/mp4; codecs=mp4a.40.2');
|
83
84
|
|
84
85
|
//switch unsupported codecs to false
|
85
86
|
for(var i in c){
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: entityjs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-09-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &21132740 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *21132740
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: jasmine
|
27
|
-
requirement: &
|
27
|
+
requirement: &21113980 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *21113980
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: sinatra
|
38
|
-
requirement: &
|
38
|
+
requirement: &21112560 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.3.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *21112560
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: coffee-script
|
49
|
-
requirement: &
|
49
|
+
requirement: &21110820 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *21110820
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: uglifier
|
60
|
-
requirement: &
|
60
|
+
requirement: &21108600 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *21108600
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: json
|
71
|
-
requirement: &
|
71
|
+
requirement: &21106980 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *21106980
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: cobravsmongoose
|
82
|
-
requirement: &
|
82
|
+
requirement: &21105280 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *21105280
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: cssmin
|
93
|
-
requirement: &
|
93
|
+
requirement: &21102740 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :runtime
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *21102740
|
102
102
|
description: HTML5 Javascript game engine, quickly create robust, flexible and reusable
|
103
103
|
games.
|
104
104
|
email:
|
@@ -262,6 +262,7 @@ files:
|
|
262
262
|
- src/input/touch.js
|
263
263
|
- src/math/bisect.js
|
264
264
|
- src/math/body.js
|
265
|
+
- src/math/clamp.js
|
265
266
|
- src/math/distance.js
|
266
267
|
- src/math/drag.js
|
267
268
|
- src/math/force.js
|
@@ -282,7 +283,9 @@ files:
|
|
282
283
|
- src/pattern/timestep.js
|
283
284
|
- src/save/database.js
|
284
285
|
- src/save/storage.js
|
286
|
+
- src/util/assert.js
|
285
287
|
- src/util/clone.js
|
288
|
+
- src/util/extend.js
|
286
289
|
- src/util/log.js
|
287
290
|
- src/util/polyfill.js
|
288
291
|
- src/util/scene.js
|