Skip to content

Commit c7e6ed2

Browse files
authored
Parse repeatx/repeaty from Image layers (#324)
1 parent 18be44f commit c7e6ed2

File tree

5 files changed

+109
-3
lines changed

5 files changed

+109
-3
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [Unreleased]
9+
### Added
10+
- New `ImageLayer` `repeat_x`/`y` fields are now parsed from map image layers.
11+
812
## [0.14.0]
913
### Added
1014
- Added a new crate feature `world` to enable support for parsing `World` files.

assets/tiled_repeat.tmx

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<map version="1.5" tiledversion="1.7.1" orientation="orthogonal" renderorder="right-down" width="10" height="10" tilewidth="32" tileheight="32" infinite="0" nextlayerid="4" nextobjectid="1">
3+
<tileset firstgid="1" source="tilesheet.tsx"/>
4+
<layer id="3" name="Background" width="10" height="10">
5+
<data encoding="csv">
6+
0,0,0,0,0,0,0,0,0,0,
7+
0,0,0,0,0,0,0,0,0,0,
8+
0,0,0,0,0,0,0,0,0,0,
9+
0,0,0,0,0,0,0,0,0,0,
10+
48,49,50,48,49,50,48,49,50,0,
11+
62,63,64,62,63,64,62,63,64,0,
12+
76,77,78,76,77,78,76,77,78,0,
13+
0,0,0,0,0,0,0,0,0,0,
14+
0,0,0,0,0,0,0,0,0,0,
15+
0,0,0,0,0,0,0,0,0,0
16+
</data>
17+
</layer>
18+
<layer id="2" name="Middle" width="10" height="10">
19+
<data encoding="csv">
20+
0,0,0,0,0,0,0,0,0,0,
21+
0,0,0,0,0,0,0,0,0,0,
22+
0,0,6,7,8,0,0,0,0,0,
23+
0,0,20,21,22,0,6,7,8,0,
24+
0,0,34,35,36,0,20,21,22,0,
25+
0,0,0,0,0,0,34,35,36,0,
26+
0,0,0,0,0,0,0,0,0,0,
27+
0,0,0,0,0,0,0,0,0,0,
28+
0,0,0,0,0,0,0,0,0,0,
29+
0,0,0,0,0,0,0,0,0,0
30+
</data>
31+
</layer>
32+
<layer id="1" name="Foreground" width="10" height="10">
33+
<data encoding="csv">
34+
0,0,0,0,0,0,0,0,0,0,
35+
0,0,0,0,0,0,0,0,0,0,
36+
0,0,0,0,0,0,0,0,0,0,
37+
0,0,0,0,0,0,0,0,0,0,
38+
0,0,0,0,0,0,0,0,0,0,
39+
0,0,0,0,0,0,0,0,0,0,
40+
0,0,0,0,0,0,0,0,3,0,
41+
0,0,0,0,0,0,0,0,0,0,
42+
0,0,0,0,0,0,0,0,0,0,
43+
0,0,0,0,0,0,0,0,0,0
44+
</data>
45+
</layer>
46+
<imagelayer id="4" name="ImageLayer" repeatx="1" repeaty="1">
47+
<image source="tilesheet.png" width="320" height="320"/>
48+
</imagelayer>
49+
</map>

src/layers/image.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
use std::{collections::HashMap, path::Path};
22

3+
use xml::attribute::OwnedAttribute;
4+
35
use crate::{
46
parse_properties,
5-
util::{map_wrapper, parse_tag, XmlEventResult},
7+
util::{get_attrs, map_wrapper, parse_tag, XmlEventResult},
68
Error, Image, Properties, Result,
79
};
810

@@ -11,18 +13,32 @@ use crate::{
1113
pub struct ImageLayerData {
1214
/// The single image this layer contains, if it exists.
1315
pub image: Option<Image>,
16+
/// The layer's x repeat factor (true = repeat, false = no repeat).
17+
pub repeat_x: bool,
18+
/// The layer's y repeat factor (true = repeat, false = no repeat).
19+
pub repeat_y: bool,
1420
}
1521

1622
impl ImageLayerData {
1723
pub(crate) fn new(
1824
parser: &mut impl Iterator<Item = XmlEventResult>,
25+
attrs: Vec<OwnedAttribute>,
1926
map_path: &Path,
2027
) -> Result<(Self, Properties)> {
2128
let mut image: Option<Image> = None;
2229
let mut properties = HashMap::new();
2330

2431
let path_relative_to = map_path.parent().ok_or(Error::PathIsNotFile)?;
2532

33+
// Parse repeat attributes from the imagelayer tag
34+
let (repeat_x, repeat_y) = get_attrs!(
35+
for v in attrs {
36+
Some("repeatx") => repeat_x ?= v.parse::<i32>().map(|val| val == 1),
37+
Some("repeaty") => repeat_y ?= v.parse::<i32>().map(|val| val == 1),
38+
}
39+
(repeat_x, repeat_y)
40+
);
41+
2642
parse_tag!(parser, "imagelayer", {
2743
"image" => |attrs| {
2844
image = Some(Image::new(parser, attrs, path_relative_to)?);
@@ -33,7 +49,14 @@ impl ImageLayerData {
3349
Ok(())
3450
},
3551
});
36-
Ok((ImageLayerData { image }, properties))
52+
Ok((
53+
ImageLayerData {
54+
image,
55+
repeat_x: repeat_x.unwrap_or(false),
56+
repeat_y: repeat_y.unwrap_or(false),
57+
},
58+
properties,
59+
))
3760
}
3861
}
3962

src/layers/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ impl LayerData {
125125
(LayerDataType::Objects(ty), properties)
126126
}
127127
LayerTag::Image => {
128-
let (ty, properties) = ImageLayerData::new(parser, map_path)?;
128+
let (ty, properties) = ImageLayerData::new(parser, attrs, map_path)?;
129129
(LayerDataType::Image(ty), properties)
130130
}
131131
LayerTag::Group => {

tests/lib.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,36 @@ fn test_parallax_layers() {
396396
}
397397
}
398398

399+
#[test]
400+
fn test_repeat() {
401+
let r = Loader::new()
402+
.load_tmx_map("assets/tiled_repeat.tmx")
403+
.unwrap();
404+
for (i, layer) in r.layers().enumerate() {
405+
match i {
406+
0 => {
407+
assert_eq!(layer.name, "Background");
408+
// Tile layers don't have repeat properties
409+
}
410+
1 => {
411+
assert_eq!(layer.name, "Middle");
412+
// Tile layers don't have repeat properties
413+
}
414+
2 => {
415+
assert_eq!(layer.name, "Foreground");
416+
// Tile layers don't have repeat properties
417+
}
418+
3 => {
419+
assert_eq!(layer.name, "ImageLayer");
420+
let image_layer = layer.as_image_layer().unwrap();
421+
assert_eq!(image_layer.repeat_x, true);
422+
assert_eq!(image_layer.repeat_y, true);
423+
}
424+
_ => panic!("unexpected layer"),
425+
}
426+
}
427+
}
428+
399429
#[test]
400430
fn test_object_property() {
401431
let r = Loader::new()

0 commit comments

Comments
 (0)