Wall rendering
This commit is contained in:
parent
57968fb59c
commit
f25c8f7308
62
src/game.rs
62
src/game.rs
|
@ -51,34 +51,68 @@ impl DungeonLevel {
|
||||||
|
|
||||||
/// Draws a level on the display window.
|
/// Draws a level on the display window.
|
||||||
pub fn draw(&self, win: &Window) {
|
pub fn draw(&self, win: &Window) {
|
||||||
for (y, row) in self.tiles.iter().enumerate() {
|
for y in 0..LEVEL_SIZE.1 {
|
||||||
win.mv(y as _, 0);
|
win.mv(y as _, 0);
|
||||||
for tile in row {
|
for x in 0..LEVEL_SIZE.0 {
|
||||||
win.addch(match tile {
|
win.addch(self.render_tile(x, y));
|
||||||
DungeonTile::Floor => '.',
|
|
||||||
DungeonTile::Wall => ' ',
|
|
||||||
DungeonTile::Hallway => '#',
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Leave the cursor at the lower-left.
|
// Leave the cursor at the lower-left.
|
||||||
win.mv(0, 0);
|
win.mv(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Renders the tile at the given coordinates.
|
||||||
|
pub fn render_tile(&self, x: usize, y: usize) -> char {
|
||||||
|
match self.tiles[y][x] {
|
||||||
|
DungeonTile::Floor => '.',
|
||||||
|
DungeonTile::Wall => {
|
||||||
|
// Don't render walls with no adjacent floor space, to
|
||||||
|
// keep the screen clear. Aside from that, walls are
|
||||||
|
// '-' by default, unless the only adjacent floor is
|
||||||
|
// to the east or west, in which case they are '|'.
|
||||||
|
|
||||||
|
let neighborhood = (-1..=1)
|
||||||
|
.flat_map(|row| (-1..=1).map(move |col| (col, row)))
|
||||||
|
.filter(|&(dx, dy)| !(dx == 0 && dy == 0))
|
||||||
|
.filter_map(|(dx, dy)| {
|
||||||
|
let (x, y) = (
|
||||||
|
usize::try_from(x as isize + dx).ok()?,
|
||||||
|
usize::try_from(y as isize + dy).ok()?,
|
||||||
|
);
|
||||||
|
Some((x, y, self.tiles.get(y)?.get(x)?))
|
||||||
|
})
|
||||||
|
.collect::<Vec<(usize, usize, &DungeonTile)>>();
|
||||||
|
|
||||||
|
if neighborhood
|
||||||
|
.iter()
|
||||||
|
.all(|(_x, _y, tile)| *tile != &DungeonTile::Floor)
|
||||||
|
{
|
||||||
|
' '
|
||||||
|
} else {
|
||||||
|
if neighborhood
|
||||||
|
.iter()
|
||||||
|
.any(|(tile_x, _y, tile)| *tile_x == x && *tile == &DungeonTile::Floor)
|
||||||
|
{
|
||||||
|
'-'
|
||||||
|
} else {
|
||||||
|
'|'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DungeonTile::Hallway => '#',
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Display for DungeonLevel {
|
impl Display for DungeonLevel {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
for row in self.tiles.iter() {
|
for y in 0..LEVEL_SIZE.1 {
|
||||||
for tile in row {
|
for x in 0..LEVEL_SIZE.0 {
|
||||||
write!(
|
write!(
|
||||||
f,
|
f,
|
||||||
"{}",
|
"{}",
|
||||||
match tile {
|
self.render_tile(x, y)
|
||||||
DungeonTile::Floor => '.',
|
|
||||||
DungeonTile::Wall => ' ',
|
|
||||||
DungeonTile::Hallway => '#',
|
|
||||||
}
|
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue