Skip to content

Commit 90e899f

Browse files
heghMetalBlueberry
andauthored
Load Tileset file independently of a Map (#91)
* Functions to load/save tileset * Add support for loading tilesets directly from TSX files, without maps. * Address #35 by removing Save feature. Concerns were around using pointer-to-bool to support omitting default-true bools during save. Removed the Save feature to get past that issue, hoping to get at least part of this PR submitted after 4 years. * Fix naming of LoadTilesetReader functions to match local convention. --------- Co-authored-by: Metalblueberry <metalblueberry@gmail.com>
1 parent 5db5f49 commit 90e899f

File tree

4 files changed

+189
-0
lines changed

4 files changed

+189
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<tileset version="1.2" tiledversion="1.2.3" name="ProjectUtumno_full" tilewidth="32" tileheight="32" tilecount="6080" columns="64">
3+
<image source="ProjectUtumno_full.png" width="2048" height="3040"/>
4+
<properties>
5+
<property name="testTilesetProperty" value="valueOfTilesetProperty"/>
6+
</properties>
7+
<tile id="116" type="door">
8+
<properties>
9+
<property name="testTileProperty" type="int" value="7"/>
10+
</properties>
11+
</tile>
12+
</tileset>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<tileset version="1.2" tiledversion="1.2.3" name="ProjectUtumno_full" tilewidth="32" tileheight="32" tilecount="6080" columns="64">
3+
<image source="ProjectUtumno_full.png" width="2048" height="3040"/>
4+
<tile id="464">
5+
<objectgroup draworder="index">
6+
<object id="1" x="-0.25" y="17.75" width="32.375" height="6.125"/>
7+
</objectgroup>
8+
<animation>
9+
<frame tileid="75" duration="500"/>
10+
<frame tileid="76" duration="500"/>
11+
</animation>
12+
</tile>
13+
</tileset>

tiled.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,20 @@ func LoadFile(fileName string, options ...LoaderOption) (*Map, error) {
4343
return l.LoadFile(fileName)
4444
}
4545

46+
// LoadTilesetReader loads a tileset from an io.Reader.
47+
// baseDir is used to locate relative paths to additional tileset data; default
48+
// is currend directory if empty.
49+
func LoadTilesetReader(baseDir string, r io.Reader, options ...LoaderOption) (*Tileset, error) {
50+
l := newLoader(options...)
51+
return l.LoadTilesetReader(baseDir, r)
52+
}
53+
54+
// LoadTilesetFile loads a tiled map in TSX format from a file.
55+
func LoadTilesetFile(fileName string, options ...LoaderOption) (*Tileset, error) {
56+
l := newLoader(options...)
57+
return l.LoadTilesetFile(fileName)
58+
}
59+
4660
// loader provides configuration on how TMX maps and resources are loaded.
4761
type loader struct {
4862
// A FileSystem that is used for loading TMX files and any external
@@ -106,3 +120,30 @@ func (l *loader) LoadFile(fileName string) (*Map, error) {
106120
dir := filepath.Dir(fileName)
107121
return l.LoadReader(dir, f)
108122
}
123+
124+
// LoadTilesetFile loads a tileset in TSX format from a file.
125+
func (l *loader) LoadTilesetFile(fileName string) (*Tileset, error) {
126+
f, err := l.open(fileName)
127+
if err != nil {
128+
return nil, err
129+
}
130+
defer f.Close()
131+
132+
dir := filepath.Dir(fileName)
133+
return l.LoadTilesetReader(dir, f)
134+
}
135+
136+
// LoadTilesetReader loads a .tsx file into a Tileset structure
137+
func (l *loader) LoadTilesetReader(baseDir string, r io.Reader) (*Tileset, error) {
138+
d := xml.NewDecoder(r)
139+
140+
t := &Tileset{
141+
baseDir: baseDir,
142+
}
143+
if err := d.Decode(t); err != nil {
144+
return nil, err
145+
}
146+
147+
t.SourceLoaded = true
148+
return t, nil
149+
}

tmx_tileset_test.go

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ package tiled
2424

2525
import (
2626
"image"
27+
"os"
28+
"path/filepath"
2729
"testing"
2830

2931
"github.com/stretchr/testify/assert"
@@ -165,3 +167,124 @@ func TestGetTileRect(t *testing.T) {
165167
})
166168
}
167169
}
170+
171+
var testLoadTilesetFile = &Tileset{
172+
baseDir: ".",
173+
Columns: 64,
174+
FirstGID: 0,
175+
Image: &Image{
176+
Format: "",
177+
Data: nil,
178+
Height: 3040,
179+
Width: 2048,
180+
Source: "ProjectUtumno_full.png",
181+
Trans: nil,
182+
},
183+
Margin: 0,
184+
Name: "ProjectUtumno_full",
185+
Properties: Properties{
186+
{
187+
Name: "testTilesetProperty",
188+
Value: "valueOfTilesetProperty",
189+
},
190+
},
191+
Source: "",
192+
SourceLoaded: true,
193+
Spacing: 0,
194+
TerrainTypes: nil,
195+
TileCount: 6080,
196+
TileHeight: 32,
197+
TileOffset: nil,
198+
TileWidth: 32,
199+
TiledVersion: "1.2.3",
200+
Tiles: []*TilesetTile{
201+
{
202+
ID: 116,
203+
Type: "door",
204+
Animation: nil,
205+
Image: nil,
206+
ObjectGroups: nil,
207+
Probability: 0,
208+
Properties: Properties{
209+
{
210+
Name: "testTileProperty",
211+
Type: "int",
212+
Value: "7",
213+
},
214+
},
215+
Terrain: "",
216+
},
217+
},
218+
Version: "1.2",
219+
}
220+
221+
var testLoadTilesetTileFile = &TilesetTile{
222+
ID: 464,
223+
Animation: []*AnimationFrame{
224+
{
225+
Duration: 500,
226+
TileID: 75,
227+
},
228+
{
229+
Duration: 500,
230+
TileID: 76,
231+
},
232+
},
233+
Image: nil,
234+
ObjectGroups: []*ObjectGroup{
235+
{
236+
ID: 0,
237+
Color: nil,
238+
DrawOrder: "index",
239+
Name: "",
240+
Objects: []*Object{
241+
{
242+
GID: 0,
243+
Ellipses: nil,
244+
Height: 6.125,
245+
ID: 1,
246+
Name: "",
247+
PolyLines: nil,
248+
Polygons: nil,
249+
Properties: nil,
250+
Rotation: 0,
251+
Text: nil,
252+
Type: "",
253+
Visible: true,
254+
Width: 32.375,
255+
X: -0.25,
256+
Y: 17.75,
257+
},
258+
},
259+
OffsetX: 0,
260+
OffsetY: 0,
261+
Opacity: 1,
262+
Properties: nil,
263+
Visible: true,
264+
},
265+
},
266+
}
267+
268+
func TestLoadTileset(t *testing.T) {
269+
tsxFile, err := os.Open(filepath.Join(GetAssetsDirectory(), "tilesets/testLoadTileset.tsx"))
270+
assert.Nil(t, err)
271+
defer tsxFile.Close()
272+
273+
tsx, err := LoadTilesetReader(".", tsxFile)
274+
assert.Nil(t, err)
275+
276+
assert.Equal(t, testLoadTilesetFile, tsx)
277+
}
278+
279+
func TestLoadTile(t *testing.T) {
280+
tsxFile, err := os.Open(filepath.Join(GetAssetsDirectory(), "tilesets/testLoadTilesetTile.tsx"))
281+
assert.Nil(t, err)
282+
defer tsxFile.Close()
283+
284+
tsx, err := LoadTilesetReader(".", tsxFile)
285+
assert.Nil(t, err)
286+
assert.Len(t, tsx.Tiles, 1)
287+
288+
tile := tsx.Tiles[0]
289+
assert.Equal(t, testLoadTilesetTileFile, tile)
290+
}

0 commit comments

Comments
 (0)