@@ -7,6 +7,7 @@ use std::collections::HashMap;
7
7
mod error;
8
8
mod tiled;
9
9
10
+ use core:: f32:: consts:: PI ;
10
11
pub use error:: Error ;
11
12
pub use tiled:: { Property , PropertyVal } ;
12
13
@@ -47,6 +48,7 @@ pub struct Tile {
47
48
/// Whether the tile is vertically flipped
48
49
pub flip_y : bool ,
49
50
/// Whether the tile is anti-diagonally flipped
51
+ /// (equivalent to a 90 degree clockwise rotation followed by a horizontal flip)
50
52
pub flip_d : bool ,
51
53
}
52
54
@@ -95,8 +97,28 @@ pub struct Map {
95
97
pub raw_tiled_map : tiled:: Map ,
96
98
}
97
99
100
+ pub struct TileFlippedParams {
101
+ flip_x : bool ,
102
+ flip_y : bool ,
103
+ flip_d : bool ,
104
+ }
105
+
106
+ impl Default for TileFlippedParams {
107
+ fn default ( ) -> Self {
108
+ TileFlippedParams {
109
+ flip_x : false ,
110
+ flip_y : false ,
111
+ flip_d : false ,
112
+ }
113
+ }
114
+ }
115
+
98
116
impl Map {
99
117
pub fn spr ( & self , tileset : & str , sprite : u32 , dest : Rect ) {
118
+ self . spr_flip ( tileset, sprite, dest, TileFlippedParams :: default ( ) )
119
+ }
120
+
121
+ pub fn spr_flip ( & self , tileset : & str , sprite : u32 , dest : Rect , flip : TileFlippedParams ) {
100
122
if self . tilesets . contains_key ( tileset) == false {
101
123
panic ! (
102
124
"No such tileset: {}, tilesets available: {:?}" ,
@@ -107,6 +129,13 @@ impl Map {
107
129
let tileset = & self . tilesets [ tileset] ;
108
130
let spr_rect = tileset. sprite_rect ( sprite) ;
109
131
132
+ let rotation = if flip. flip_d {
133
+ // diagonal flip
134
+ -PI / 2.0
135
+ } else {
136
+ 0.0
137
+ } ;
138
+
110
139
draw_texture_ex (
111
140
& tileset. texture ,
112
141
dest. x ,
@@ -120,6 +149,9 @@ impl Map {
120
149
spr_rect. w + 2.0 ,
121
150
spr_rect. h + 2.0 ,
122
151
) ) ,
152
+ flip_x : flip. flip_x ,
153
+ flip_y : flip. flip_y ^ flip. flip_d ,
154
+ rotation : rotation,
123
155
..Default :: default ( )
124
156
} ,
125
157
) ;
@@ -186,7 +218,16 @@ impl Map {
186
218
187
219
for ( tileset, tileset_layer) in & separated_by_ts {
188
220
for ( tile, rect) in tileset_layer {
189
- self . spr ( tileset, tile. id , * rect) ;
221
+ self . spr_flip (
222
+ tileset,
223
+ tile. id ,
224
+ * rect,
225
+ TileFlippedParams {
226
+ flip_x : tile. flip_x ,
227
+ flip_y : tile. flip_y ,
228
+ flip_d : tile. flip_d ,
229
+ } ,
230
+ ) ;
190
231
}
191
232
}
192
233
}
0 commit comments