nuri_game-tmx_reader 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/lib/nuri_game/tmx_reader.rb +32 -4
- data/lib/nuri_game/tmx_reader/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eea7fdfe561aa348894f90fbc92913934b6cab0597346c6f975e0ff041a09b19
|
4
|
+
data.tar.gz: 5d57b7eb3b88bb6648019ad3bd0f10173a47b5289187d666b9ccecbd9d44822f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d37a126a8629082b0fbbb4144152c34bb860eda2d69b501ca576609b62533eb2c012ce61ba4d254c738b239a8bf016bb2554e11822c4a24c2043146b2e9f968
|
7
|
+
data.tar.gz: 8d2f5f61ab2db1bef233553bc7c1da5608d110d4e16ee0eee6fce2099cf57d5a95d44ec710a0f93367bdebe28e0666db974c20aa71142da147210be82210ed47
|
data/lib/nuri_game/tmx_reader.rb
CHANGED
@@ -39,6 +39,7 @@ module NuriGame
|
|
39
39
|
map = REXML::Document.new(contents).root
|
40
40
|
@tilesets = []
|
41
41
|
@layers = {}
|
42
|
+
@invert_order = false
|
42
43
|
validate_map(map)
|
43
44
|
load_map_infos(map)
|
44
45
|
load_tilesets(map)
|
@@ -52,7 +53,7 @@ module NuriGame
|
|
52
53
|
def validate_map(map)
|
53
54
|
raise 'Invalid TMX data, root element is not a <map>' if map.name != 'map'
|
54
55
|
raise 'Invalid TMX orientation, expect orthogonal' if xml_value(map, 'orientation') != 'orthogonal'
|
55
|
-
|
56
|
+
@render_order = xml_value(map, 'renderorder') || 'right-down'
|
56
57
|
raise 'Invalid TMX map format, should not be infinite' if xml_value(map, 'infinite').to_i != 0
|
57
58
|
end
|
58
59
|
|
@@ -78,11 +79,20 @@ module NuriGame
|
|
78
79
|
if layer.name == 'group'
|
79
80
|
load_layer_group(layer, xml_value(layer, 'name'))
|
80
81
|
elsif layer.name == 'layer'
|
81
|
-
@layers[xml_value(layer, 'name')] = load_layer(layer)
|
82
|
+
@layers[get_layer_name(xml_value(layer, 'name'))] = load_layer(layer)
|
82
83
|
end
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
87
|
+
# Adjust the layer name to prevent duplicates
|
88
|
+
# @param name [String]
|
89
|
+
# @return [String]
|
90
|
+
def get_layer_name(name)
|
91
|
+
name = name.dup
|
92
|
+
name.prepend('/') while @layers[name]
|
93
|
+
return name
|
94
|
+
end
|
95
|
+
|
86
96
|
# Load the layer from a group
|
87
97
|
# @param group [REXML::Element]
|
88
98
|
# @param groupname [String]
|
@@ -92,7 +102,7 @@ module NuriGame
|
|
92
102
|
load_layer_group(layer, File.join(groupname, xml_value(layer, 'name')))
|
93
103
|
elsif layer.name == 'layer'
|
94
104
|
name = File.join(groupname, xml_value(layer, 'name'))
|
95
|
-
@layers[name] = load_layer(layer)
|
105
|
+
@layers[get_layer_name(name)] = load_layer(layer)
|
96
106
|
end
|
97
107
|
end
|
98
108
|
end
|
@@ -101,10 +111,28 @@ module NuriGame
|
|
101
111
|
# @param layer [REXML::Element]
|
102
112
|
def load_layer(layer)
|
103
113
|
data = get_layer_data(layer)
|
114
|
+
data = adjust_layer_data(layer, data)
|
104
115
|
# Perform stuff if there's offset & co (but shouldn't happen since we don't allow infinite maps)
|
105
116
|
return data
|
106
117
|
end
|
107
118
|
|
119
|
+
# Adjust the layer data
|
120
|
+
# @param layer [REXML::Element]
|
121
|
+
# @param data [Array]
|
122
|
+
# @return [Array]
|
123
|
+
def adjust_layer_data(layer, data)
|
124
|
+
width = xml_value(layer, 'width').to_i
|
125
|
+
height = xml_value(layer, 'height').to_i
|
126
|
+
if @width != width || @height != height
|
127
|
+
rows = Array.new(@height) do |index|
|
128
|
+
next(Array.new(@width, 0)) unless (row = data[index * width, @width])
|
129
|
+
row.concat(Array.new(@width - row.size, 0)) if row.size < @width
|
130
|
+
next(row)
|
131
|
+
end
|
132
|
+
return [].concat(*rows)
|
133
|
+
end
|
134
|
+
return data
|
135
|
+
end
|
108
136
|
# Get the layer data
|
109
137
|
# @source https://github.com/shawn42/tmx/blob/master/lib/tmx/parsers/tmx-rexml.rb
|
110
138
|
# @param layer [REXML::Element]
|
@@ -128,7 +156,7 @@ module NuriGame
|
|
128
156
|
return layer_data.split(',').collect(&:to_i)
|
129
157
|
end
|
130
158
|
end
|
131
|
-
REXML::XPath.match(layer,
|
159
|
+
REXML::XPath.match(layer, 'data/tile').map { |tile| tile.attributes['gid'].to_i }
|
132
160
|
end
|
133
161
|
|
134
162
|
# Decompress using Zlib
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nuri_game-tmx_reader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nuri Yuri
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-09-
|
11
|
+
date: 2018-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|