Refactor camera to batch render
This commit is contained in:
parent
14d6f6f7f9
commit
e3248519ac
@ -5,7 +5,6 @@
|
|||||||
extern crate lazy_static;
|
extern crate lazy_static;
|
||||||
|
|
||||||
mod ai;
|
mod ai;
|
||||||
pub mod camera;
|
|
||||||
mod colors;
|
mod colors;
|
||||||
mod components;
|
mod components;
|
||||||
mod damage_system;
|
mod damage_system;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
//! An object to hold the state of the current level's map
|
//! An object to hold the state of the current level's map
|
||||||
|
pub mod camera;
|
||||||
mod dungeon;
|
mod dungeon;
|
||||||
mod themes;
|
mod themes;
|
||||||
mod tiletype;
|
mod tiletype;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
//! Handle rendering of the viewport
|
//! Handle rendering of the viewport
|
||||||
use rltk::{Point, Rltk};
|
use ::rltk::prelude::*;
|
||||||
use specs::prelude::*;
|
use ::rltk::{Point, Rltk};
|
||||||
|
use ::specs::prelude::*;
|
||||||
|
|
||||||
use crate::components::{Hidden, Position, Renderable, Target, TileSize};
|
use crate::components::{Hidden, Position, Renderable, Target, TileSize};
|
||||||
use crate::map::tile_glyph;
|
use crate::map::tile_glyph;
|
||||||
@ -28,6 +29,7 @@ pub fn get_screen_bounds(ecs: &World, _ctx: &mut Rltk) -> (i32, i32, i32, i32) {
|
|||||||
|
|
||||||
/// Render the current viewport
|
/// Render the current viewport
|
||||||
pub fn render_camera(ecs: &World, ctx: &mut Rltk) {
|
pub fn render_camera(ecs: &World, ctx: &mut Rltk) {
|
||||||
|
let mut draw_batch = DrawBatch::new();
|
||||||
let map = ecs.fetch::<Map>();
|
let map = ecs.fetch::<Map>();
|
||||||
let (min_x, max_x, min_y, max_y) = get_screen_bounds(ecs, ctx);
|
let (min_x, max_x, min_y, max_y) = get_screen_bounds(ecs, ctx);
|
||||||
|
|
||||||
@ -35,23 +37,22 @@ pub fn render_camera(ecs: &World, ctx: &mut Rltk) {
|
|||||||
let map_width = map.width - 1;
|
let map_width = map.width - 1;
|
||||||
let map_height = map.height - 1;
|
let map_height = map.height - 1;
|
||||||
|
|
||||||
let mut y = 0;
|
for (y, ty) in (min_y..max_y).enumerate() {
|
||||||
#[allow(clippy::explicit_counter_loop)]
|
for (x, tx) in (min_x..max_x).enumerate() {
|
||||||
for ty in min_y..max_y {
|
|
||||||
let mut x = 0;
|
|
||||||
for tx in min_x..max_x {
|
|
||||||
if tx > 0 && tx < map_width && ty > 0 && ty < map_height {
|
if tx > 0 && tx < map_width && ty > 0 && ty < map_height {
|
||||||
let idx = map.xy_idx(tx, ty);
|
let idx = map.xy_idx(tx, ty);
|
||||||
if map.revealed_tiles[idx] {
|
if map.revealed_tiles[idx] {
|
||||||
let (glyph, fg, bg) = tile_glyph(idx, &*map);
|
let (glyph, fg, bg) = tile_glyph(idx, &*map);
|
||||||
ctx.set(x, y, fg, bg, glyph);
|
draw_batch.set(Point::new(x, y), ColorPair::new(fg, bg), glyph);
|
||||||
}
|
}
|
||||||
} else if SHOW_BOUNDARIES {
|
} else if SHOW_BOUNDARIES {
|
||||||
ctx.set(x, y, colors::GRAY, colors::BLACK, rltk::to_cp437('·'));
|
draw_batch.set(
|
||||||
|
Point::new(x, y),
|
||||||
|
ColorPair::new(colors::GRAY, colors::BLACK),
|
||||||
|
rltk::to_cp437('·'),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
x += 1;
|
|
||||||
}
|
}
|
||||||
y += 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render entities
|
// Render entities
|
||||||
@ -82,11 +83,9 @@ pub fn render_camera(ecs: &World, ctx: &mut Rltk) {
|
|||||||
&& entity_screen_y > 0
|
&& entity_screen_y > 0
|
||||||
&& entity_screen_y < map_height
|
&& entity_screen_y < map_height
|
||||||
{
|
{
|
||||||
ctx.set(
|
draw_batch.set(
|
||||||
entity_screen_x + 1,
|
Point::new(entity_screen_x + 1, entity_screen_y + 1),
|
||||||
entity_screen_y + 1,
|
ColorPair::new(render.fg, render.bg),
|
||||||
render.fg,
|
|
||||||
render.bg,
|
|
||||||
render.glyph,
|
render.glyph,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -103,11 +102,9 @@ pub fn render_camera(ecs: &World, ctx: &mut Rltk) {
|
|||||||
&& entity_screen_y > 0
|
&& entity_screen_y > 0
|
||||||
&& entity_screen_y < map_height
|
&& entity_screen_y < map_height
|
||||||
{
|
{
|
||||||
ctx.set(
|
draw_batch.set(
|
||||||
entity_screen_x,
|
Point::new(entity_screen_x, entity_screen_y),
|
||||||
entity_screen_y,
|
ColorPair::new(render.fg, render.bg),
|
||||||
render.fg,
|
|
||||||
render.bg,
|
|
||||||
render.glyph,
|
render.glyph,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -117,22 +114,22 @@ pub fn render_camera(ecs: &World, ctx: &mut Rltk) {
|
|||||||
if targets.get(*entity).is_some() {
|
if targets.get(*entity).is_some() {
|
||||||
let entity_screen_x = pos.x - min_x;
|
let entity_screen_x = pos.x - min_x;
|
||||||
let entity_screen_y = pos.y - min_y;
|
let entity_screen_y = pos.y - min_y;
|
||||||
ctx.set(
|
draw_batch.set(
|
||||||
entity_screen_x - 1,
|
Point::new(entity_screen_x - 1, entity_screen_y),
|
||||||
entity_screen_y,
|
ColorPair::new(colors::RED, colors::YELLOW),
|
||||||
colors::RED,
|
|
||||||
colors::YELLOW,
|
|
||||||
::rltk::to_cp437('['),
|
::rltk::to_cp437('['),
|
||||||
);
|
);
|
||||||
ctx.set(
|
draw_batch.set(
|
||||||
entity_screen_x + 1,
|
Point::new(entity_screen_x + 1, entity_screen_y),
|
||||||
entity_screen_y,
|
ColorPair::new(colors::RED, colors::YELLOW),
|
||||||
colors::RED,
|
|
||||||
colors::YELLOW,
|
|
||||||
::rltk::to_cp437(']'),
|
::rltk::to_cp437(']'),
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
draw_batch
|
||||||
|
.submit(0)
|
||||||
|
.expect("Failed to batch draw the camera");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render_debug_map(map: &Map, ctx: &mut Rltk) {
|
pub fn render_debug_map(map: &Map, ctx: &mut Rltk) {
|
||||||
@ -150,11 +147,8 @@ pub fn render_debug_map(map: &Map, ctx: &mut Rltk) {
|
|||||||
let map_width = map.width - 1;
|
let map_width = map.width - 1;
|
||||||
let map_height = map.height - 1;
|
let map_height = map.height - 1;
|
||||||
|
|
||||||
let mut y = 0;
|
for (y, ty) in (min_y..max_y).enumerate() {
|
||||||
#[allow(clippy::explicit_counter_loop)]
|
for (x, tx) in (min_x..max_x).enumerate() {
|
||||||
for ty in min_y..max_y {
|
|
||||||
let mut x = 0;
|
|
||||||
for tx in min_x..max_x {
|
|
||||||
if tx > 0 && tx < map_width && ty > 0 && ty < map_height {
|
if tx > 0 && tx < map_width && ty > 0 && ty < map_height {
|
||||||
let idx = map.xy_idx(tx, ty);
|
let idx = map.xy_idx(tx, ty);
|
||||||
if map.revealed_tiles[idx] {
|
if map.revealed_tiles[idx] {
|
||||||
@ -164,8 +158,6 @@ pub fn render_debug_map(map: &Map, ctx: &mut Rltk) {
|
|||||||
} else if SHOW_BOUNDARIES {
|
} else if SHOW_BOUNDARIES {
|
||||||
ctx.set(x, y, colors::GRAY, colors::BLACK, rltk::to_cp437('·'));
|
ctx.set(x, y, colors::GRAY, colors::BLACK, rltk::to_cp437('·'));
|
||||||
}
|
}
|
||||||
x += 1;
|
}
|
||||||
}
|
|
||||||
y += 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -582,5 +582,6 @@ impl GameState for State {
|
|||||||
}
|
}
|
||||||
|
|
||||||
damage_system::delete_the_dead(&mut self.ecs);
|
damage_system::delete_the_dead(&mut self.ecs);
|
||||||
|
::rltk::render_draw_buffer(ctx).expect("Failed to render the Rltk buffer");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user