gosu_tiled 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,278 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <map version="1.0" orientation="orthogonal" width="10" height="10" tilewidth="128" tileheight="128">
3
+ <tileset firstgid="1" name="ground" tilewidth="128" tileheight="128">
4
+ <image source="ground.png" width="1024" height="1024"/>
5
+ <tile id="1">
6
+ <properties>
7
+ <property name="name" value="second"/>
8
+ </properties>
9
+ </tile>
10
+ </tileset>
11
+ <tileset firstgid="65" name="water" tilewidth="128" tileheight="128">
12
+ <image source="water.png" width="128" height="128"/>
13
+ <tile id="0">
14
+ <properties>
15
+ <property name="death" value="sinking"/>
16
+ <property name="name" value="water"/>
17
+ </properties>
18
+ </tile>
19
+ </tileset>
20
+ <tileset firstgid="66" name="Trees" tilewidth="128" tileheight="128">
21
+ <image source="trees.png" width="704" height="704"/>
22
+ </tileset>
23
+ <layer name="Water" width="10" height="10">
24
+ <data>
25
+ <tile gid="65"/>
26
+ <tile gid="65"/>
27
+ <tile gid="65"/>
28
+ <tile gid="65"/>
29
+ <tile gid="65"/>
30
+ <tile gid="65"/>
31
+ <tile gid="65"/>
32
+ <tile gid="65"/>
33
+ <tile gid="65"/>
34
+ <tile gid="65"/>
35
+ <tile gid="65"/>
36
+ <tile gid="65"/>
37
+ <tile gid="65"/>
38
+ <tile gid="0"/>
39
+ <tile gid="0"/>
40
+ <tile gid="65"/>
41
+ <tile gid="65"/>
42
+ <tile gid="65"/>
43
+ <tile gid="65"/>
44
+ <tile gid="65"/>
45
+ <tile gid="65"/>
46
+ <tile gid="65"/>
47
+ <tile gid="65"/>
48
+ <tile gid="0"/>
49
+ <tile gid="0"/>
50
+ <tile gid="65"/>
51
+ <tile gid="65"/>
52
+ <tile gid="65"/>
53
+ <tile gid="65"/>
54
+ <tile gid="65"/>
55
+ <tile gid="65"/>
56
+ <tile gid="65"/>
57
+ <tile gid="65"/>
58
+ <tile gid="0"/>
59
+ <tile gid="0"/>
60
+ <tile gid="0"/>
61
+ <tile gid="65"/>
62
+ <tile gid="65"/>
63
+ <tile gid="65"/>
64
+ <tile gid="65"/>
65
+ <tile gid="65"/>
66
+ <tile gid="65"/>
67
+ <tile gid="65"/>
68
+ <tile gid="0"/>
69
+ <tile gid="0"/>
70
+ <tile gid="0"/>
71
+ <tile gid="0"/>
72
+ <tile gid="65"/>
73
+ <tile gid="65"/>
74
+ <tile gid="65"/>
75
+ <tile gid="65"/>
76
+ <tile gid="65"/>
77
+ <tile gid="65"/>
78
+ <tile gid="0"/>
79
+ <tile gid="0"/>
80
+ <tile gid="0"/>
81
+ <tile gid="0"/>
82
+ <tile gid="65"/>
83
+ <tile gid="65"/>
84
+ <tile gid="65"/>
85
+ <tile gid="65"/>
86
+ <tile gid="65"/>
87
+ <tile gid="65"/>
88
+ <tile gid="65"/>
89
+ <tile gid="65"/>
90
+ <tile gid="65"/>
91
+ <tile gid="65"/>
92
+ <tile gid="65"/>
93
+ <tile gid="65"/>
94
+ <tile gid="65"/>
95
+ <tile gid="65"/>
96
+ <tile gid="65"/>
97
+ <tile gid="65"/>
98
+ <tile gid="65"/>
99
+ <tile gid="65"/>
100
+ <tile gid="65"/>
101
+ <tile gid="65"/>
102
+ <tile gid="65"/>
103
+ <tile gid="65"/>
104
+ <tile gid="65"/>
105
+ <tile gid="65"/>
106
+ <tile gid="65"/>
107
+ <tile gid="65"/>
108
+ <tile gid="65"/>
109
+ <tile gid="65"/>
110
+ <tile gid="65"/>
111
+ <tile gid="65"/>
112
+ <tile gid="65"/>
113
+ <tile gid="65"/>
114
+ <tile gid="65"/>
115
+ <tile gid="65"/>
116
+ <tile gid="65"/>
117
+ <tile gid="65"/>
118
+ <tile gid="65"/>
119
+ <tile gid="65"/>
120
+ <tile gid="65"/>
121
+ <tile gid="65"/>
122
+ <tile gid="65"/>
123
+ <tile gid="65"/>
124
+ <tile gid="65"/>
125
+ </data>
126
+ </layer>
127
+ <layer name="Ground" width="10" height="10">
128
+ <data>
129
+ <tile gid="0"/>
130
+ <tile gid="0"/>
131
+ <tile gid="7"/>
132
+ <tile gid="5"/>
133
+ <tile gid="57"/>
134
+ <tile gid="43"/>
135
+ <tile gid="0"/>
136
+ <tile gid="0"/>
137
+ <tile gid="0"/>
138
+ <tile gid="0"/>
139
+ <tile gid="0"/>
140
+ <tile gid="0"/>
141
+ <tile gid="28"/>
142
+ <tile gid="1"/>
143
+ <tile gid="1"/>
144
+ <tile gid="42"/>
145
+ <tile gid="0"/>
146
+ <tile gid="0"/>
147
+ <tile gid="0"/>
148
+ <tile gid="0"/>
149
+ <tile gid="0"/>
150
+ <tile gid="0"/>
151
+ <tile gid="44"/>
152
+ <tile gid="1"/>
153
+ <tile gid="1"/>
154
+ <tile gid="42"/>
155
+ <tile gid="0"/>
156
+ <tile gid="0"/>
157
+ <tile gid="0"/>
158
+ <tile gid="0"/>
159
+ <tile gid="0"/>
160
+ <tile gid="0"/>
161
+ <tile gid="28"/>
162
+ <tile gid="1"/>
163
+ <tile gid="1"/>
164
+ <tile gid="27"/>
165
+ <tile gid="43"/>
166
+ <tile gid="0"/>
167
+ <tile gid="0"/>
168
+ <tile gid="0"/>
169
+ <tile gid="0"/>
170
+ <tile gid="0"/>
171
+ <tile gid="28"/>
172
+ <tile gid="1"/>
173
+ <tile gid="1"/>
174
+ <tile gid="1"/>
175
+ <tile gid="27"/>
176
+ <tile gid="43"/>
177
+ <tile gid="0"/>
178
+ <tile gid="0"/>
179
+ <tile gid="0"/>
180
+ <tile gid="0"/>
181
+ <tile gid="28"/>
182
+ <tile gid="1"/>
183
+ <tile gid="1"/>
184
+ <tile gid="1"/>
185
+ <tile gid="59"/>
186
+ <tile gid="16"/>
187
+ <tile gid="0"/>
188
+ <tile gid="0"/>
189
+ <tile gid="0"/>
190
+ <tile gid="0"/>
191
+ <tile gid="48"/>
192
+ <tile gid="62"/>
193
+ <tile gid="61"/>
194
+ <tile gid="61"/>
195
+ <tile gid="16"/>
196
+ <tile gid="0"/>
197
+ <tile gid="0"/>
198
+ <tile gid="0"/>
199
+ <tile gid="0"/>
200
+ <tile gid="0"/>
201
+ <tile gid="0"/>
202
+ <tile gid="0"/>
203
+ <tile gid="0"/>
204
+ <tile gid="0"/>
205
+ <tile gid="0"/>
206
+ <tile gid="0"/>
207
+ <tile gid="0"/>
208
+ <tile gid="0"/>
209
+ <tile gid="0"/>
210
+ <tile gid="0"/>
211
+ <tile gid="0"/>
212
+ <tile gid="0"/>
213
+ <tile gid="0"/>
214
+ <tile gid="0"/>
215
+ <tile gid="0"/>
216
+ <tile gid="0"/>
217
+ <tile gid="0"/>
218
+ <tile gid="0"/>
219
+ <tile gid="0"/>
220
+ <tile gid="0"/>
221
+ <tile gid="0"/>
222
+ <tile gid="0"/>
223
+ <tile gid="0"/>
224
+ <tile gid="0"/>
225
+ <tile gid="0"/>
226
+ <tile gid="0"/>
227
+ <tile gid="0"/>
228
+ <tile gid="0"/>
229
+ </data>
230
+ </layer>
231
+ <objectgroup name="obj" width="10" height="10" visible="0"/>
232
+ <objectgroup name="Trees" width="10" height="10">
233
+ <object gid="66" x="580" y="506"/>
234
+ <object gid="66" x="615" y="302"/>
235
+ <object gid="74" x="408" y="238"/>
236
+ <object gid="77" x="314" y="420"/>
237
+ <object gid="79" x="474" y="654"/>
238
+ <object gid="80" x="672" y="610"/>
239
+ <object gid="81" x="403" y="726"/>
240
+ <object gid="81" x="323" y="787"/>
241
+ <object gid="86" x="654" y="827"/>
242
+ <object gid="87" x="282" y="552"/>
243
+ <object gid="87" x="665" y="597"/>
244
+ <object gid="90" x="698" y="633"/>
245
+ <object gid="90" x="718" y="636"/>
246
+ <object gid="80" x="456" y="426"/>
247
+ <object gid="82" x="464" y="434"/>
248
+ <object gid="82" x="505" y="412"/>
249
+ <object gid="82" x="512" y="454"/>
250
+ <object gid="76" x="313" y="202"/>
251
+ <object gid="76" x="574" y="251"/>
252
+ <object gid="76" x="588" y="702"/>
253
+ <object gid="76" x="723" y="694"/>
254
+ <object gid="87" x="462" y="724"/>
255
+ <object gid="87" x="483" y="763"/>
256
+ <object gid="87" x="487" y="735"/>
257
+ <object gid="87" x="534" y="758"/>
258
+ <object gid="87" x="505" y="772"/>
259
+ <object gid="87" x="544" y="802"/>
260
+ <object gid="87" x="519" y="801"/>
261
+ <object gid="87" x="478" y="809"/>
262
+ <object gid="87" x="420" y="796"/>
263
+ <object gid="87" x="406" y="825"/>
264
+ <object gid="87" x="446" y="844"/>
265
+ <object gid="87" x="483" y="844"/>
266
+ <object gid="87" x="545" y="853"/>
267
+ <object gid="87" x="509" y="845"/>
268
+ <object gid="87" x="578" y="848"/>
269
+ <object gid="87" x="582" y="829"/>
270
+ <object gid="87" x="293" y="258"/>
271
+ <object gid="87" x="289" y="305"/>
272
+ <object gid="87" x="302" y="285"/>
273
+ <object gid="87" x="298" y="337"/>
274
+ <object gid="78" x="373" y="615"/>
275
+ <object gid="78" x="301" y="639"/>
276
+ <object gid="78" x="336" y="671"/>
277
+ </objectgroup>
278
+ </map>
Binary file
Binary file
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Gosu::Tiled::Layer do
4
+
5
+ let(:files_dir) { File.join(File.dirname(File.dirname(__FILE__)), 'files') }
6
+ let(:target_class) { Gosu::Tiled::Layer }
7
+ let(:map_json) { JSON.load(File.open(File.join(files_dir, 'tiled_map.json'))) }
8
+ let(:game_window) { TestGameWindow.instance }
9
+ let(:options) { { width: 128 * 10, height: 128 * 10, tile_width: 128, tile_height: 128 } }
10
+
11
+ subject(:tilesets) { Gosu::Tiled::Tilesets.new(game_window, map_json['tilesets'], files_dir) }
12
+ subject(:tile_layer) { target_class.new(game_window, map_json['layers'][1], options) }
13
+ subject(:object_layer) { target_class.new(game_window, map_json['layers'][3], options) }
14
+
15
+ describe '#initialize' do
16
+ it 'initializes' do
17
+ expect { tile_layer }.to_not raise_error
18
+ end
19
+ end
20
+
21
+ describe '#visible?' do
22
+ it "knows when it's visible" do
23
+ expect(tile_layer).to be_visible
24
+ end
25
+ end
26
+
27
+ describe '#type' do
28
+ it 'knows correct type' do
29
+ expect(tile_layer.type).to eq 'tilelayer'
30
+ end
31
+ end
32
+
33
+ describe '#draw' do
34
+ it 'draws tile layer' do
35
+ error = game_window.while_showing do
36
+ tile_layer.draw(0, 0, tilesets)
37
+ end
38
+ expect(error).to be_nil
39
+ end
40
+
41
+ it 'draws object layer' do
42
+ error = game_window.while_showing do
43
+ object_layer.draw(0, 0, tilesets)
44
+ end
45
+ expect(error).to be_nil
46
+ end
47
+ end
48
+
49
+ describe '#screen_width_in_tiles' do
50
+ it 'knows how many tiles to draw' do
51
+ expect(tile_layer.screen_width_in_tiles).to be (game_window.width / 128.0).ceil
52
+ end
53
+ end
54
+
55
+ describe '#screen_height_in_tiles' do
56
+ it 'knows how many tiles to draw' do
57
+ expect(tile_layer.screen_height_in_tiles).to be (game_window.height / 128.0).ceil
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Gosu::Tiled::Layers do
4
+
5
+ let(:files_dir) { File.join(File.dirname(File.dirname(__FILE__)), 'files') }
6
+ let(:target_class) { Gosu::Tiled::Layers }
7
+ let(:map_json) { JSON.load(File.open(File.join(files_dir, 'tiled_map.json'))) }
8
+ let(:game_window) { TestGameWindow.instance }
9
+ let(:options) { { width: 128 * 10, height: 128 * 10, tile_width: 128, tile_height: 128 } }
10
+
11
+ subject(:layers) { target_class.new(game_window, map_json['layers'], options) }
12
+
13
+ describe '#initialize' do
14
+ it 'works' do
15
+ expect { layers }.to_not raise_error
16
+ end
17
+ end
18
+
19
+ describe '#tile' do
20
+ it 'loads correct number of tile layers' do
21
+ expect(layers.tile.size).to be 2
22
+ end
23
+ end
24
+
25
+ describe '#object' do
26
+ it 'loads correct number of object layers' do
27
+ expect(layers.object.size).to be 1
28
+ end
29
+ end
30
+
31
+ describe '#size' do
32
+ it 'loads correct number of layers' do
33
+ expect(layers.size).to eq map_json['layers'].size
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Gosu::Tiled::Map do
4
+
5
+ let(:files_dir) { File.join(File.dirname(File.dirname(__FILE__)), 'files') }
6
+ let(:target_class) { Gosu::Tiled::Map }
7
+ let(:map_json) { JSON.load(File.open(File.join(files_dir, 'tiled_map.json'))) }
8
+ let(:game_window) { TestGameWindow.instance }
9
+
10
+ subject(:map) { target_class.new(game_window, map_json, files_dir) }
11
+
12
+ describe '#initialize' do
13
+ it 'initializes with window and hash' do
14
+ expect { map }.to_not raise_error
15
+ end
16
+ end
17
+
18
+ describe '#tilesets' do
19
+ it 'returns instance of Tilesets' do
20
+ expect(map.tilesets).to be_a Gosu::Tiled::Tilesets
21
+ end
22
+ end
23
+
24
+ describe '#layers' do
25
+ it 'returns instance of Layers' do
26
+ expect(map.layers).to be_a Gosu::Tiled::Layers
27
+ end
28
+ end
29
+
30
+ describe '#width' do
31
+ it "knows it's width" do
32
+ expect(map.width).to be 128 * 10
33
+ end
34
+ end
35
+
36
+ describe '#height' do
37
+ it "knows it's height" do
38
+ expect(map.height).to be 128 * 10
39
+ end
40
+ end
41
+
42
+ describe '#draw' do
43
+ it 'draws the map on game window' do
44
+ error = game_window.while_showing do
45
+ map.draw(0, 0)
46
+ end
47
+ expect(error).to be_nil
48
+ end
49
+
50
+ it 'draws shifted map on game window' do
51
+ error = game_window.while_showing do
52
+ map.draw(300, 400)
53
+ end
54
+ expect(error).to be_nil
55
+ end
56
+ end
57
+
58
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Gosu::Tiled::Tilesets do
4
+
5
+ let(:files_dir) { File.join(File.dirname(File.dirname(__FILE__)), 'files') }
6
+ let(:target_class) { Gosu::Tiled::Tilesets }
7
+ let(:map_json) { JSON.load(File.open(File.join(files_dir, 'tiled_map.json'))) }
8
+ let(:game_window) { TestGameWindow.instance }
9
+ let(:water_tile) { 65 }
10
+ let(:sand_tile) { 1 }
11
+
12
+ subject(:tilesets) { target_class.new(game_window, map_json['tilesets'], files_dir) }
13
+
14
+ describe '#initialize' do
15
+ it 'initializes with game window and hash' do
16
+ expect { tilesets }.to_not raise_error
17
+ end
18
+ end
19
+
20
+ describe '#size' do
21
+ it 'loads correct number of tilesets' do
22
+ expect(tilesets.size).to eq map_json['tilesets'].size
23
+ end
24
+ end
25
+
26
+ describe '#get' do
27
+ it 'gets the right water tile' do
28
+ expect(tilesets.get(water_tile)).to be_a Gosu::Image
29
+ end
30
+
31
+ it 'gets the right sand tile' do
32
+ expect(tilesets.get(sand_tile)).to be_a Gosu::Image
33
+ end
34
+
35
+ it 'can draw the tile that was retrieved' do
36
+ error = game_window.while_showing do
37
+ tilesets.get(sand_tile).draw(0, 0, 0)
38
+ end
39
+ expect(error).to be_nil
40
+ end
41
+
42
+ it 'returns empty tile' do
43
+ expect(tilesets.get(0)).to be_a Gosu::Tiled::EmptyTile
44
+ end
45
+ end
46
+
47
+ describe '#properties' do
48
+ it 'retrieves tile properties' do
49
+ expect(tilesets.properties(water_tile)['name']).to eq 'water'
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,6 @@
1
+ require 'gosu_tiled'
2
+ require_relative 'utils/test_game_window'
3
+
4
+ RSpec.configure do |c|
5
+ c.disable_monkey_patching!
6
+ end
@@ -0,0 +1,39 @@
1
+ require 'singleton'
2
+
3
+ class TestGameWindow < Gosu::Window
4
+ include Singleton
5
+
6
+ def initialize
7
+ super(1200, 800, false)
8
+ self.caption = "Esc = quit"
9
+ end
10
+
11
+ def update
12
+ unless ENV['NO_CLOSE']
13
+ close if @start && Gosu.milliseconds - @start > 500
14
+ end
15
+ end
16
+
17
+ def draw
18
+ @draw_block.call
19
+ rescue => e
20
+ unless @error
21
+ puts e
22
+ puts e.backtrace
23
+ end
24
+ @error = e
25
+ end
26
+
27
+ def button_down(id)
28
+ close if id == Gosu::KbEscape
29
+ end
30
+
31
+ def while_showing(&block)
32
+ @start = Gosu.milliseconds
33
+ @error = nil
34
+ @draw_block = block
35
+ show
36
+ @start = false
37
+ @error
38
+ end
39
+ end