summaryrefslogtreecommitdiff
path: root/graphics/src/render.rs
blob: 6a566ce128ddbc7f527023886d9a956f78b34735 (plain)
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
use dungeon::Dungeon;
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) {
		// 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);
	}
}