tiny_rpg/
start.rs

1use sdl2::pixels::Color;
2use sdl2::render::Canvas;
3use sdl2::video::Window;
4
5use crate::helper::{Builder, BuilderError};
6use crate::math;
7
8/// Things done before main_loop
9pub 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
38/// The configurations before building
39impl 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}