tmx 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +15 -10
- data/.rspec +2 -0
- data/Gemfile +8 -2
- data/Guardfile +8 -0
- data/LICENSE.txt +22 -0
- data/README.md +32 -0
- data/lib/tmx.rb +52 -13
- data/lib/tmx/layer.rb +4 -73
- data/lib/tmx/map.rb +11 -143
- data/lib/tmx/parsers/json.rb +24 -0
- data/lib/tmx/parsers/parsers.rb +30 -0
- data/lib/tmx/parsers/tmx.rb +145 -0
- data/lib/tmx/parsers/unknown.rb +24 -0
- data/lib/tmx/tile_set.rb +4 -34
- data/lib/tmx/version.rb +1 -1
- data/spec/features/json_format_spec.rb +76 -0
- data/spec/features/xml_format_spec.rb +84 -0
- data/spec/fixtures/map.json +39 -0
- data/spec/fixtures/map_csv.tmx +25 -0
- data/spec/fixtures/map_gzip.tmx +14 -0
- data/spec/fixtures/map_uncompressed.tmx +14 -0
- data/spec/fixtures/map_xml.tmx +205 -0
- data/spec/fixtures/map_zlib.tmx +17 -0
- data/spec/spec_helper.rb +16 -49
- data/tmx.gemspec +18 -22
- metadata +54 -70
- data/README.markdown +0 -92
- data/Rakefile +0 -11
- data/data/door.png +0 -0
- data/data/dude.png +0 -0
- data/data/test-tiles.png +0 -0
- data/data/test.tmx +0 -62
- data/examples/example-chingu.rb +0 -114
- data/lib/tmx/coder.rb +0 -39
- data/lib/tmx/coder/base64.rb +0 -13
- data/lib/tmx/coder/gzip.rb +0 -21
- data/lib/tmx/map/tile_cache.rb +0 -83
- data/lib/tmx/map/xml_loader.rb +0 -41
- data/lib/tmx/nokogiri_additions.rb +0 -56
- data/lib/tmx/object_group.rb +0 -30
- data/spec/coder_spec.rb +0 -29
- data/spec/map_spec.rb +0 -50
- data/spec/nokogiri_spec.rb +0 -5
- data/spec/object_group_spec.rb +0 -41
data/lib/tmx/map/xml_loader.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module Tmx
|
2
|
-
module Map::XMLLoader
|
3
|
-
protected
|
4
|
-
|
5
|
-
def parse_tile_set_def xml
|
6
|
-
properties = xml.tmx_parse_attributes
|
7
|
-
image_path = File.absolute_path xml.xpath('image/@source').first.value, File.dirname(xml.document.url)
|
8
|
-
[ image_path, properties ]
|
9
|
-
end
|
10
|
-
|
11
|
-
def parse_layer_def xml
|
12
|
-
properties = xml.tmx_parse_properties.merge! xml.tmx_parse_attributes
|
13
|
-
Layer.new self, xml.tmx_data, properties
|
14
|
-
end
|
15
|
-
|
16
|
-
def parse_object_group_def xml
|
17
|
-
properties = xml.tmx_parse_properties.merge! xml.tmx_parse_attributes
|
18
|
-
group = ObjectGroup.new self, properties
|
19
|
-
|
20
|
-
xml.xpath('object').each do |child|
|
21
|
-
obj = parse_object_def(child, group)
|
22
|
-
group.add obj if obj
|
23
|
-
end
|
24
|
-
|
25
|
-
group
|
26
|
-
end # parse_object_group_def
|
27
|
-
|
28
|
-
def parse_object_def xml, group
|
29
|
-
properties = xml.tmx_parse_properties.merge! xml.tmx_parse_attributes
|
30
|
-
# name = properties[:name]
|
31
|
-
name = properties[:name]
|
32
|
-
|
33
|
-
[:x, :y, :width, :height].each do |key|
|
34
|
-
properties[key] = properties[key] * @scale_units
|
35
|
-
end if @scale_units
|
36
|
-
|
37
|
-
on_object name, group, properties
|
38
|
-
end
|
39
|
-
|
40
|
-
end # Map::XMLLoader
|
41
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# TODO investigate writing Nokogiri::TMX class hierarchy (yeah right)
|
2
|
-
|
3
|
-
class Nokogiri::XML::Node
|
4
|
-
def to_sym; self.to_s.to_sym end
|
5
|
-
|
6
|
-
def to_i; self.to_s.to_i end
|
7
|
-
def to_f; self.to_s.to_f end
|
8
|
-
def to_c; self.to_s.to_c end
|
9
|
-
def to_r; self.to_s.to_r end
|
10
|
-
|
11
|
-
def tmx_parse
|
12
|
-
str = to_s
|
13
|
-
case str
|
14
|
-
when '' then nil
|
15
|
-
when %r(^ (?: false | no | off ) $)ix then false
|
16
|
-
when %r(^ (?: true | yes | on ) $)ix then true
|
17
|
-
when %r(^ [+-]? \d+ / [+-]? \d+ $)ix then str.to_r
|
18
|
-
when %r(^ [+-]? (?: \d+ \. \d+ [+-] ) \d+ i $)ix then str.to_c
|
19
|
-
when %r(^ [+-]? \d+ \. \d+ $)ix then str.to_f
|
20
|
-
when %r(^ [+-]? \d+ $)ix then str.to_i
|
21
|
-
when %r(^ \# [0-9a-f]{6} $)ix
|
22
|
-
0xff000000 | str[1..6].to_i(16)
|
23
|
-
when %r(^ \# [0-9a-f]{8} $)ix
|
24
|
-
str[1..8].to_i(16)
|
25
|
-
else str
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
class Nokogiri::XML::Element
|
31
|
-
def tmx_parse_attributes
|
32
|
-
attributes.reduce({}) do |h, pair|
|
33
|
-
name = pair[0].to_sym
|
34
|
-
value = pair[1].tmx_parse
|
35
|
-
h.merge name => value
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def tmx_parse_properties
|
40
|
-
properties_element = xpath('properties').first or return {}
|
41
|
-
properties_element.xpath('property').reduce({}) do |h, property|
|
42
|
-
name = property.attribute('name').to_sym
|
43
|
-
value = property.attribute('value').tmx_parse
|
44
|
-
h.merge! name => value
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def tmx_data
|
49
|
-
data = ''
|
50
|
-
xpath('data').each do |data_element|
|
51
|
-
attrs = data_element.tmx_parse_attributes
|
52
|
-
data << Tmx::Coder.decode(data_element.text, attrs[:compression], attrs[:encoding])
|
53
|
-
end
|
54
|
-
data
|
55
|
-
end
|
56
|
-
end
|
data/lib/tmx/object_group.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module Tmx
|
2
|
-
class ObjectGroup
|
3
|
-
include Enumerable
|
4
|
-
|
5
|
-
attr_reader :properties
|
6
|
-
attr_reader :name
|
7
|
-
|
8
|
-
def initialize map, properties = {}
|
9
|
-
@map = WeakRef.new map
|
10
|
-
@properties = properties
|
11
|
-
@objects = Hash[]
|
12
|
-
|
13
|
-
@name = properties.delete :name
|
14
|
-
end
|
15
|
-
|
16
|
-
def map; @map.__getobj__ end
|
17
|
-
|
18
|
-
def add obj
|
19
|
-
@objects[obj.object_id] = obj
|
20
|
-
end
|
21
|
-
|
22
|
-
def remove obj
|
23
|
-
@objects.delete obj.object_id
|
24
|
-
end
|
25
|
-
|
26
|
-
def each &block
|
27
|
-
@objects.each_value &block
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
data/spec/coder_spec.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
-
describe 'Coder' do
|
3
|
-
it 'can find the default coders' do
|
4
|
-
Tmx::Coder.find_coder(:base64).should_not == nil
|
5
|
-
Tmx::Coder.find_coder(:gzip).should_not == nil
|
6
|
-
end
|
7
|
-
|
8
|
-
CODER_TEST_STRING = <<-EOS
|
9
|
-
Lorem ipsum dolor sit amet, consecteteur adapiscing elit.
|
10
|
-
EOS
|
11
|
-
|
12
|
-
def coder_round_trip *encodings
|
13
|
-
encoded = Tmx::Coder.encode CODER_TEST_STRING, *encodings
|
14
|
-
decoded = Tmx::Coder.decode encoded, *encodings
|
15
|
-
decoded.should == CODER_TEST_STRING
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'can round trip base64' do
|
19
|
-
coder_round_trip :base64
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'can round trip gzip' do
|
23
|
-
coder_round_trip :gzip
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'can round trip multiple encodings' do
|
27
|
-
coder_round_trip :gzip, :base64
|
28
|
-
end
|
29
|
-
end
|
data/spec/map_spec.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
-
describe 'Map' do
|
3
|
-
it 'can load the test map' do
|
4
|
-
$map = Tmx::Map.new File.join($data_dir, 'test.tmx'),
|
5
|
-
:scale_units => false
|
6
|
-
$map.should.is_a? Tmx::Map
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'has the correct dimensions' do
|
10
|
-
$map.columns.should == 16
|
11
|
-
$map.rows.should == 16
|
12
|
-
|
13
|
-
$map.width.should == 16 * $map.tile_width
|
14
|
-
$map.height.should == 16 * $map.tile_height
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'has the correct tile dimensions' do
|
18
|
-
$map.tile_width.should == 16
|
19
|
-
$map.tile_height.should == 16
|
20
|
-
end
|
21
|
-
|
22
|
-
# it 'loads all tile set definitions into one flat set' do
|
23
|
-
# $map.tile_set.should.is_a? Tmx::TileSet
|
24
|
-
# $map.tile_set[0].should == nil
|
25
|
-
# $map.tile_set[1].should.is_a? Gosu::Image
|
26
|
-
# end
|
27
|
-
|
28
|
-
it 'loads all layers' do
|
29
|
-
$map.layers.count.should == 3
|
30
|
-
$map.layers.each do |name, layer|
|
31
|
-
layer.should.is_a? Tmx::Layer
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'loads all object groups' do
|
36
|
-
$map.object_groups.count.should == 2
|
37
|
-
$map.object_groups.each do |name, group|
|
38
|
-
Tmx::ObjectGroup.should === group
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# it 'can draw itself' do
|
43
|
-
# $window.run_test\
|
44
|
-
# :time => 1.0,
|
45
|
-
# :before => proc { @x, @y = 0, 0 },
|
46
|
-
# :update => proc { @y -= 1 },
|
47
|
-
# :draw => proc { $map.draw @x, @y },
|
48
|
-
# end
|
49
|
-
|
50
|
-
end
|
data/spec/nokogiri_spec.rb
DELETED
data/spec/object_group_spec.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
|
2
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
3
|
-
describe 'object groups' do
|
4
|
-
|
5
|
-
# {:image=>"door.png", :target=>"door2", :name=>"door1", :type=>"Door", :x=>128, :y=>208, :width=>16, :height=>32}
|
6
|
-
# {:image=>"door.png", :target=>"door1", :name=>"door2", :type=>"Door", :x=>64, :y=>32, :width=>16, :height=>32}
|
7
|
-
|
8
|
-
it 'loads all object group properties' do
|
9
|
-
map = Tmx::Map.new File.join($data_dir, 'test.tmx'), :scale_units => false
|
10
|
-
object_group = map.object_groups["doors"]
|
11
|
-
object_group.should_not be_nil
|
12
|
-
|
13
|
-
captured = []
|
14
|
-
object_group.each do |obj|
|
15
|
-
captured << obj
|
16
|
-
end
|
17
|
-
|
18
|
-
obj = captured.first
|
19
|
-
|
20
|
-
obj[:target].should == "door2"
|
21
|
-
obj[:image].should == "door.png"
|
22
|
-
obj[:type].should == "Door"
|
23
|
-
obj[:x].should == 128
|
24
|
-
obj[:y].should == 208
|
25
|
-
obj[:width].should == 16
|
26
|
-
obj[:height].should == 32
|
27
|
-
obj[:name].should == "door1"
|
28
|
-
|
29
|
-
obj = captured.last
|
30
|
-
obj[:target].should == "door1"
|
31
|
-
obj[:image].should == "door.png"
|
32
|
-
obj[:type].should == "Door"
|
33
|
-
obj[:x].should == 64
|
34
|
-
obj[:y].should == 32
|
35
|
-
obj[:width].should == 16
|
36
|
-
obj[:height].should == 32
|
37
|
-
obj[:name].should == "door2"
|
38
|
-
end
|
39
|
-
|
40
|
-
|
41
|
-
end
|