1use sdl2::pixels::Color;
2use sdl2::render::Canvas;
3use sdl2::video::Window;
4
5use crate::helper::{Builder, BuilderError};
6use crate::math;
7
8pub fn main_start() -> Result<Init, ()> {
10 let sdl_context = sdl2::init().unwrap();
11 let video_subsystem = sdl_context.video().unwrap();
12 let environment = Environment::new().set_title("An RPG").build().unwrap();
13
14 let window = video_subsystem
15 .window(
16 environment.get_window_title(),
17 environment.get_window_width(),
18 environment.get_window_height(),
19 )
20 .position_centered()
21 .build()
22 .unwrap();
23
24 let mut canvas = window.into_canvas().present_vsync().build().unwrap();
25 canvas.set_draw_color(Color::RGB(0, 0, 0));
26 canvas.clear();
27 canvas.present();
28
29 Ok(Init::new(sdl_context, canvas, environment))
30}
31
32pub struct EnvironmentBuilder {
33 window_title: &'static str,
34 window_size: math::Dimension,
35 tile_size: u32,
36}
37
38impl EnvironmentBuilder {
40 pub fn set_window_height(mut self, width: u32) -> Self {
41 self.window_size.set_width(width);
42 self
43 }
44 pub fn set_window_width(mut self, height: u32) -> Self {
45 self.window_size.set_height(height);
46 self
47 }
48 pub fn set_window_dimensions(mut self, dimensions: math::Dimension) -> Self {
49 self.window_size = dimensions;
50 self
51 }
52 pub fn set_window_title(mut self, title: &'static str) -> Self {
53 self.window_title = title;
54 self
55 }
56 pub fn set_title(mut self, title: &'static str) -> Self {
57 self.window_title = title;
58 self
59 }
60 pub fn set_tile_size(mut self, pixels: u32) -> Self {
61 self.tile_size = pixels;
62 self
63 }
64}
65
66impl Builder for EnvironmentBuilder {
67 type product = Environment;
68
69 fn new() -> EnvironmentBuilder {
70 let tile_size = 32;
71 EnvironmentBuilder {
72 window_size: math::Dimension::new(tile_size * 30, tile_size * 20),
73 window_title: "Application",
74 tile_size,
75 }
76 }
77 fn build(self) -> Result<Environment, BuilderError> {
78 Ok(Environment {
79 window_size: self.window_size,
80 window_title: self.window_title,
81 tile_size: self.tile_size,
82 })
83 }
84}
85
86pub struct Environment {
87 window_size: math::Dimension,
88 window_title: &'static str,
89 tile_size: u32,
90}
91
92impl Environment {
93 pub fn new() -> EnvironmentBuilder {
94 EnvironmentBuilder::new()
95 }
96 pub fn get_window_size(&self) -> math::Dimension {
97 self.window_size
98 }
99 pub fn get_window_width(&self) -> u32 {
100 self.window_size.get_width()
101 }
102 pub fn get_window_height(&self) -> u32 {
103 self.window_size.get_height()
104 }
105 pub fn get_window_title(&self) -> &'static str {
106 self.window_title
107 }
108 pub fn get_tile_size(&self) -> u32 {
109 self.tile_size
110 }
111}
112
113pub struct Init {
114 sdl_context: sdl2::Sdl,
115 canvas: Canvas<Window>,
116 environment: Environment,
117}
118
119impl Init {
120 pub fn new(sdl_context: sdl2::Sdl, canvas: Canvas<Window>, environment: Environment) -> Self {
121 Init {
122 sdl_context,
123 canvas,
124 environment,
125 }
126 }
127 pub fn release(self) -> (sdl2::Sdl, Canvas<Window>, Environment) {
128 (self.sdl_context, self.canvas, self.environment)
129 }
130}