A library for parsing Tiled maps.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

add methods to find layers by class

+76
+37
src/Map.zig
··· 144 144 return null; 145 145 } 146 146 147 + /// Finds first layer by class 148 + pub fn findLayerByClass(self: Map, class: []const u8) ?Layer { 149 + var it = filterLayersByClass(self.layers.items, class); 150 + return it.next(); 151 + } 152 + 153 + /// Finds all layers by class, appending them to the provided list 154 + pub fn findLayersByClass(self: Map, allocator: Allocator, class: []const u8, out: *std.ArrayList(Layer)) !void { 155 + var it = filterLayersByClass(self.layers.items, class); 156 + while (it.next()) |layer| { 157 + try out.append(allocator, layer); 158 + } 159 + } 160 + 161 + fn filterLayersByClass(layers: []const Layer, class: []const u8) FilterLayersByClass { 162 + return .{ .layers = layers, .class = class }; 163 + } 164 + 165 + const FilterLayersByClass = struct { 166 + layers: []const Layer, 167 + class: []const u8, 168 + index: usize = 0, 169 + 170 + fn next(self: *FilterLayersByClass) ?Layer { 171 + while (self.index < self.layers.len) { 172 + const layer = self.layers[self.index]; 173 + self.index += 1; 174 + if (layer.class) |layer_class| { 175 + if (std.mem.eql(u8, layer_class, self.class)) { 176 + return layer; 177 + } 178 + } 179 + } 180 + return null; 181 + } 182 + }; 183 + 147 184 pub fn pixelWidth(self: Map) u32 { 148 185 return self.width * self.tile_width; 149 186 }
+39
test/maps.zig
··· 132 132 try expectEqual(null, map.findObject("non_existent")); 133 133 } 134 134 135 + test "findLayerByClass" { 136 + try changeTestDir(); 137 + 138 + const allocator = std.testing.allocator; 139 + const test_map = @embedFile("map.tmj"); 140 + 141 + var map = try Map.initFromSlice(allocator, test_map); 142 + defer map.deinit(allocator); 143 + 144 + const layer = map.findLayerByClass("bar").?; 145 + try expectEqualStrings("Tile Layer 1", layer.name); 146 + try expectEqualStrings("bar", layer.class.?); 147 + 148 + try expectEqual(null, map.findLayerByClass("non_existent")); 149 + } 150 + 151 + test "findLayersByClass" { 152 + try changeTestDir(); 153 + 154 + const allocator = std.testing.allocator; 155 + const test_map = @embedFile("map.tmj"); 156 + 157 + var map = try Map.initFromSlice(allocator, test_map); 158 + defer map.deinit(allocator); 159 + 160 + var results: std.ArrayList(tmz.Layer) = .empty; 161 + defer results.deinit(allocator); 162 + 163 + try map.findLayersByClass(allocator, "bar", &results); 164 + try expectEqual(1, results.items.len); 165 + try expectEqualStrings("Tile Layer 1", results.items[0].name); 166 + 167 + var no_results: std.ArrayList(tmz.Layer) = .empty; 168 + defer no_results.deinit(allocator); 169 + 170 + try map.findLayersByClass(allocator, "non_existent", &no_results); 171 + try expectEqual(0, no_results.items.len); 172 + } 173 + 135 174 const tmz = @import("tmz"); 136 175 const Map = tmz.Map; 137 176