From e185622b0948267b6ca88aa712b4f20643af0241 Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Thu, 10 Jan 2019 12:41:41 +0100 Subject: Add structure to support Scenes (MenuScene, MapScene, ...) --- src/graphics.rs | 177 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 94 insertions(+), 83 deletions(-) diff --git a/src/graphics.rs b/src/graphics.rs index 7e8a0e1..8c5fd73 100644 --- a/src/graphics.rs +++ b/src/graphics.rs @@ -36,22 +36,16 @@ use sfml::graphics::{ #[folder = "res/maps"] pub struct MapAssets; -#[derive(Debug)] + pub struct Graphics { - // sfml elements + // rendering elements window: RenderWindow, - view: View, + scenes: Vec>, + current_scene: Box, // status running: bool, - panning: bool, - // pan - pan_start: Vector2f, - // loaded resources - tilesets: HashMap, - textures: HashMap, } - impl Graphics { pub fn new() -> Graphics { let default_window_size = (1280, 720); @@ -73,38 +67,35 @@ impl Graphics { window.set_framerate_limit(default_framerate); window.set_vertical_sync_enabled(true); - let mut graphics = Graphics { - // sfml elements + let map_scene = Box::new(MapScene::new(&window)); + + return Graphics { window: window, - view: View::new( - Vector2f::new( - default_window_size.0 as f32 / 2.0, - default_window_size.1 as f32 / 2.0 - ), - Vector2f::new( - default_window_size.0 as f32, - default_window_size.1 as f32, - ), - ), - // status + scenes: Vec::new(), + current_scene: map_scene, running: true, - panning: false, - // zoom and pan - pan_start: Vector2f::new(0.0, 0.0), - // resources - tilesets: HashMap::new(), - textures: HashMap::new(), }; - - graphics.window.set_view(&graphics.view); - - return graphics; } pub fn is_running(self: &mut Self) -> bool { return self.running; } + pub fn update(self: &mut Self) { + while let Some(event) = self.window.poll_event() { + match event { + Event::Closed => { + self.window.close(); + self.running = false; + } + _ => {} + } + + self.current_scene.event(&mut self.window, event) + } + + } + pub fn render(self: &mut Self, state: &crate::game::State) { // background @@ -114,10 +105,41 @@ impl Graphics { }; self.window.clear(&bgcolor); + self.current_scene.render(&mut self.window, state); + self.window.display(); + } + +} - // render map +trait Scene { + fn render(self: &mut Self, window: &mut RenderWindow, state: &crate::game::State); + fn event(self: &mut Self, window: &mut RenderWindow, event: Event); +} + +struct MapScene { + view: View, + // pan + panning: bool, + pan_start: Vector2f, + // loaded resources + tilesets: HashMap, + textures: HashMap, +} + +impl MapScene { + fn new(window: &RenderWindow) -> MapScene { + return MapScene { + view: window.default_view().to_owned(), + panning: false, + pan_start: Vector2f::new(0.0, 0.0), + tilesets: HashMap::new(), + textures: HashMap::new() + }; + } +} - // for each tile +impl Scene for MapScene { + fn render(self: &mut Self, window: &mut RenderWindow, state: &crate::game::State) { for y in 0 .. state.map.height { for x in 0 .. state.map.width { // for each layer @@ -204,62 +226,51 @@ impl Graphics { }); - self.window.draw(&tile_rect); + window.draw(&tile_rect); } } } - - // draw panels - - - self.window.display(); } - pub fn update(self: &mut Self) { - while let Some(ev) = self.window.poll_event() { - match ev { - Event::Closed => { - self.window.close(); - self.running = false; - }, - Event::MouseWheelScrolled { wheel: _, delta, x: _, y: _ } => { - // delta is probalby a value between -1 and 1 - let zoom = 1.0 + delta * 0.1; - self.view.zoom(zoom); - self.window.set_view(&self.view); - }, - Event::MouseButtonPressed { button, x, y} => { - match button { - Button::Right => {}, - Button::Left => { - // set pan start position - self.panning = true; - self.pan_start = self.window.map_pixel_to_coords_current_view(&Vector2i::new(x, y)); - } - _ => {}, - } - }, - Event::MouseButtonReleased { button, x: _, y: _ } => { - match button { - Button::Right => {} - Button::Left => { - self.panning = false; - }, - _ => {}, - } - }, - Event::MouseMoved { x, y } => { - if self.panning { - // get delta of vectors - let delta = self.pan_start - self.window.map_pixel_to_coords_current_view(&Vector2i::new(x, y)); - - // move view by moving the center by delta - self.view.move_(delta); - self.window.set_view(&self.view); + fn event(self: &mut Self, window: &mut RenderWindow, event: Event) { + match event { + Event::MouseWheelScrolled { wheel: _, delta, x: _, y: _ } => { + // delta is probalby a value between -1 and 1 + let zoom = 1.0 + delta * 0.1; + self.view.zoom(zoom); + window.set_view(&self.view); + }, + Event::MouseButtonPressed { button, x, y} => { + match button { + Button::Right => {}, + Button::Left => { + // set pan start position + self.panning = true; + self.pan_start = window.map_pixel_to_coords_current_view(&Vector2i::new(x, y)); } + _ => {}, + } + }, + Event::MouseButtonReleased { button, x: _, y: _ } => { + match button { + Button::Right => {} + Button::Left => { + self.panning = false; + }, + _ => {}, + } + }, + Event::MouseMoved { x, y } => { + if self.panning { + // get delta of vectors + let delta = self.pan_start - window.map_pixel_to_coords_current_view(&Vector2i::new(x, y)); + + // move view by moving the center by delta + self.view.move_(delta); + window.set_view(&self.view); } - _ => {}, } + _ => {}, } } } \ No newline at end of file -- cgit v1.2.1