1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
use dungeon::{Dungeon, Entity};
use raylib::{
color::Color,
prelude::{RaylibDraw, RaylibDrawHandle},
};
#[cfg(debug_assertions)]
use raylib::RaylibHandle;
/// Debug information used each frame
#[cfg(debug_assertions)]
pub struct DebugInfo {
pub fps: u32,
}
#[cfg(debug_assertions)]
impl DebugInfo {
pub fn new(handle: &RaylibHandle) -> Self {
let fps = handle.get_fps();
Self { fps }
}
}
/// A `Renderer` is a renderer for a single
/// frame of the game. It is created per frame.
pub struct Renderer<'a> {
handle: RaylibDrawHandle<'a>,
#[cfg(debug_assertions)]
debug: DebugInfo,
}
impl<'a> Renderer<'a> {
/// Creates the renderer for the current frame
#[cfg(debug_assertions)]
pub(crate) fn new(handle: RaylibDrawHandle<'a>, debug: DebugInfo) -> Self {
Self { handle, debug }
}
/// Creates the renderer for the current frame
#[cfg(not(debug_assertions))]
pub(crate) fn new(handle: RaylibDrawHandle<'a>) -> Self {
Self { handle }
}
/// Returns the current render width
pub fn render_width(&mut self) -> i32 {
self.handle.get_render_width()
}
/// Returns the current render height
pub fn render_height(&mut self) -> i32 {
self.handle.get_render_height()
}
/// Clear the screen
pub fn clear(&mut self) {
self.handle.clear_background(Color::BLACK);
}
/// Draws an entire frame
pub fn draw_frame(&mut self, dungeon: &Dungeon) {
// Clear the background to black
self.clear();
// Draw the dungeon
self.draw_tiles(dungeon);
self.draw_player(dungeon);
// Draw fps (debug mode only)
#[cfg(debug_assertions)]
self.draw_fps(self.debug.fps);
}
/// Draw game over screen
pub fn draw_game_over(&mut self) {
// TODO:
}
/// Draw the player sprite
pub fn draw_player(&mut self, dungeon: &Dungeon) {
self.draw_entity(dungeon.player());
}
/// Draws an entity
pub fn draw_entity(&mut self, _entity: &Entity) {
// TODO:
}
/// Draw dungeon tiles
pub fn draw_tiles(&mut self, _dungeon: &Dungeon) {
// TODO:
}
/// Draw FPS counter
pub fn draw_fps(&mut self, fps: u32) {
let fps_str = format!("{fps}");
self.handle.draw_text(&fps_str, 10, 10, 30, Color::YELLOW);
}
}
|