Skip to content

Commit 38c71ea

Browse files
committed
fix: draw ordering
1 parent 58a1f08 commit 38c71ea

6 files changed

Lines changed: 87 additions & 20 deletions

File tree

Cargo.lock

Lines changed: 13 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

assets/map.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@
127127
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
128128
"height":100,
129129
"id":18,
130-
"name":"colliders",
130+
"name":"level_0\/colliders",
131131
"opacity":1,
132132
"type":"tilelayer",
133133
"visible":false,
@@ -238,7 +238,7 @@
238238
104, 103, 103, 105, 104, 106, 105, 104, 103, 103, 105, 105, 105, 103, 104, 104, 104, 104, 104, 105, 103, 105, 106, 106, 104, 106, 105, 103, 103, 103, 104, 105, 106, 104, 103, 104, 106, 106, 106, 106, 105, 106, 106, 105, 103, 105, 106, 106, 103, 105, 106, 106, 103, 106, 106, 106, 105, 106, 104, 103, 104, 106, 106, 106, 105, 104, 105, 105, 106, 106, 104, 105, 106, 103, 106, 106, 103, 106, 106, 104, 104, 103, 105, 104, 105, 104, 106, 104, 106, 105, 105, 105, 104, 105, 105, 103, 103, 106, 104, 106],
239239
"height":100,
240240
"id":1,
241-
"name":"floor",
241+
"name":"level_0\/ground",
242242
"opacity":1,
243243
"type":"tilelayer",
244244
"visible":true,
@@ -349,7 +349,7 @@
349349
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
350350
"height":100,
351351
"id":16,
352-
"name":"walls",
352+
"name":"level_0\/walls",
353353
"opacity":1,
354354
"type":"tilelayer",
355355
"visible":true,
@@ -460,7 +460,7 @@
460460
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
461461
"height":100,
462462
"id":19,
463-
"name":"walls 2",
463+
"name":"level_1\/walls",
464464
"opacity":1,
465465
"type":"tilelayer",
466466
"visible":true,
@@ -571,10 +571,10 @@
571571
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
572572
"height":100,
573573
"id":21,
574-
"name":"floor 3",
574+
"name":"level_2\/roof",
575575
"opacity":1,
576576
"type":"tilelayer",
577-
"visible":false,
577+
"visible":true,
578578
"width":100,
579579
"x":0,
580580
"y":0
@@ -682,7 +682,7 @@
682682
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
683683
"height":100,
684684
"id":20,
685-
"name":"walls 3",
685+
"name":"level_2\/walls",
686686
"opacity":1,
687687
"type":"tilelayer",
688688
"visible":true,

dyrah_client/src/game.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,16 @@ impl Game {
370370
let screen = gfx.screen_size();
371371
gfx.clear(Color::BLUE);
372372

373-
self.map.draw_tiles(gfx);
373+
let player_tile = if let Some(player) = self.player {
374+
self.world
375+
.get::<WorldPos>(player)
376+
.map(|pos| self.map.tiled.world_to_tile(pos.vec))
377+
.unwrap_or(IVec2::ZERO)
378+
} else {
379+
IVec2::ZERO
380+
};
381+
382+
self.map.draw_tiles(gfx, player_tile);
374383

375384
if let Some(player) = self.player {
376385
if let Some(target) = self.world.get::<TargetWorldPos>(player) {

dyrah_client/src/map.rs

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use std::collections::HashMap;
22

33
use dyrah_shared::map::TiledMap;
4-
use egor::{math::Vec2, render::Graphics};
4+
use egor::{
5+
math::{IVec2, Vec2},
6+
render::Graphics,
7+
};
58

69
pub struct Tileset {
710
dimensions: (u32, u32),
@@ -11,6 +14,7 @@ pub struct Tileset {
1114
pub struct Map {
1215
pub tiled: TiledMap,
1316
sets: HashMap<u32, Tileset>,
17+
pub current_level: usize,
1418
}
1519

1620
impl Map {
@@ -19,6 +23,7 @@ impl Map {
1923
Self {
2024
tiled,
2125
sets: HashMap::new(),
26+
current_level: 0,
2227
}
2328
}
2429

@@ -99,10 +104,39 @@ impl Map {
99104
}
100105
}
101106

102-
pub fn draw_tiles(&self, gfx: &mut Graphics) {
103-
for layer in &self.tiled.layers {
104-
if layer.visible && layer.data.is_some() {
105-
self.draw_tile_layer(gfx, &layer.name);
107+
fn get_roof_level(&self, player_tile: IVec2) -> Option<usize> {
108+
self.tiled
109+
.layers
110+
.iter()
111+
.filter_map(|l| {
112+
l.name
113+
.strip_prefix("level_")
114+
.and_then(|s| s.strip_suffix("/roof"))
115+
.and_then(|n| n.parse::<usize>().ok())
116+
})
117+
.find(|&level| {
118+
let layer = format!("level_{}/roof", level);
119+
(-1..=1_i32)
120+
.flat_map(|dx| (-1..=1_i32).map(move |dy| IVec2::new(dx, dy)))
121+
.any(|offset| self.tiled.has_tile(&layer, player_tile + offset))
122+
})
123+
}
124+
125+
pub fn draw_tiles(&self, gfx: &mut Graphics, player_tile: IVec2) {
126+
if self.get_roof_level(player_tile).is_some() {
127+
let ground = format!("level_{}/ground", self.current_level);
128+
let walls = format!("level_{}/walls", self.current_level);
129+
if self.tiled.get_layer(&ground).is_some() {
130+
self.draw_tile_layer(gfx, &ground);
131+
}
132+
if self.tiled.get_layer(&walls).is_some() {
133+
self.draw_tile_layer(gfx, &walls);
134+
}
135+
} else {
136+
for layer in &self.tiled.layers {
137+
if layer.visible && layer.data.is_some() {
138+
self.draw_tile_layer(gfx, &layer.name);
139+
}
106140
}
107141
}
108142
}

dyrah_server/src/map.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ impl CollisionGrid {
2626
for y in 0..self.height {
2727
for x in 0..self.width {
2828
let tile_pos = IVec2::new(x as i32, y as i32);
29-
if !map.tiled.is_walkable("colliders", tile_pos) {
29+
if !map.tiled.is_walkable("level_0/colliders", tile_pos) {
3030
self.grid[y * self.width + x] = true;
3131
}
3232
}

dyrah_shared/src/map.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,23 @@ impl TiledMap {
7070
.and_then(|l| l.objects.as_ref()?.iter().find(|o| o.name == name))
7171
}
7272

73+
pub fn has_tile(&self, layer_name: &str, tile_pos: IVec2) -> bool {
74+
let layer = match self.get_layer(layer_name) {
75+
Some(l) => l,
76+
None => return false,
77+
};
78+
let (x, y) = (tile_pos.x as usize, tile_pos.y as usize);
79+
let w = layer.width.unwrap() as usize;
80+
let h = layer.height.unwrap() as usize;
81+
if x >= w || y >= h {
82+
return false;
83+
}
84+
layer
85+
.data
86+
.as_ref()
87+
.map_or(false, |data| data[y * w + x] != 0)
88+
}
89+
7390
pub fn is_walkable(&self, layer_name: &str, tile_pos: IVec2) -> bool {
7491
let layer = match self.get_layer(layer_name) {
7592
Some(l) => l,

0 commit comments

Comments
 (0)