From 1144293d54af7fe0c2a1124edc1f680598b6e6cb Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Mon, 17 Dec 2018 17:11:01 +0100 Subject: Implement rendering (drawing) of tiles --- src/graphics.rs | 103 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 57 insertions(+), 46 deletions(-) (limited to 'src') diff --git a/src/graphics.rs b/src/graphics.rs index 947992a..422c884 100644 --- a/src/graphics.rs +++ b/src/graphics.rs @@ -1,4 +1,7 @@ use std::collections::HashMap; + +use sfml::system::Vector2f; + use sfml::window::{ ContextSettings, Event, @@ -8,16 +11,21 @@ use sfml::window::{ use sfml::graphics::{ RenderWindow, RenderTarget, + Drawable, Texture, Image, Color, Rect, }; +use sfml::graphics::{ + RectangleShape, + Transformable, +}; #[derive(RustEmbed)] -#[folder = "res"] -pub struct Assets; +#[folder = "res/maps"] +pub struct MapAssets; pub fn start() -> RenderWindow { @@ -64,61 +72,64 @@ pub fn render(window: &mut RenderWindow, state: &crate::game::State) { for x in 0 .. state.map.width { // for each layer for layer in &state.map.layers { - let tmx_tile = layer.tiles[y as usize][x as usize]; - let tmx_tileset = match state.map.get_tileset_by_gid(tmx_tile) { - Some(tileset) => tileset, - None => continue - }; + let tmx_tile = layer.tiles[y as usize][x as usize]; + let tmx_tileset = state.map.get_tileset_by_gid(tmx_tile).unwrap(); // load tileset if not loaded yet // TODO: load in a separate thread? if !tilesets.contains_key(&tmx_tileset.first_gid) { // TODO: replace with iter or error message assert_eq!(tmx_tileset.images.len(), 1); - - (|| { - // load tileset image - let tmx_image = &tmx_tileset.images[0]; - - let asset = match Assets::get(&tmx_image.source) { - Some(asset) => asset, - None => return, - }; - - let image = match Image::from_memory(asset.as_ref()) { - Some(image) => image, - None => return, - }; - - // load tiles (textures) - let tileset_width = tmx_image.width as u32 / tmx_tileset.tile_width; - let tileset_height = tmx_image.height as u32 / tmx_tileset.tile_height; - - for ty in 0 .. tileset_height { - for tx in 0 .. tileset_width { - let texture = match Texture::from_image_with_rect( - &image, &Rect::new( - (tx * tmx_tileset.tile_width) as i32, - (ty * tmx_tileset.tile_height) as i32, - tmx_tileset.tile_width as i32, - tmx_tileset.tile_height as i32 - ) - ) { - Some(texture) => texture, - None => continue, - }; - // save tile texture - textures.insert(tmx_tile, texture); - } + + // load tileset image + let tmx_image = &tmx_tileset.images[0]; + let asset = MapAssets::get(&tmx_image.source).unwrap(); + let image = Image::from_memory(asset.as_ref()).unwrap(); + + // load tiles (textures) + let tileset_width = tmx_image.width as u32 / tmx_tileset.tile_width; + let tileset_height = tmx_image.height as u32 / tmx_tileset.tile_height; + + for ty in 0 .. tileset_height { + for tx in 0 .. tileset_width { + let texture = Texture::from_image_with_rect( + &image, &Rect::new( + (tx * tmx_tileset.tile_width) as i32, + (ty * tmx_tileset.tile_height) as i32, + tmx_tileset.tile_width as i32, + tmx_tileset.tile_height as i32 + ) + ).unwrap(); + + // save tile texture + textures.insert( + tmx_tileset.first_gid + ty * tileset_width + tx, + texture + ); } + } - // save tileset image - tilesets.insert(tmx_tileset.first_gid, image); - })(); + // save tileset image + tilesets.insert(tmx_tileset.first_gid, image); } - // + // draw! + // TODO: check map render order + let texture = textures.get(&tmx_tile).unwrap(); + let mut tile_rect = RectangleShape::with_texture(texture); + + tile_rect.set_size(Vector2f { + x: tmx_tileset.tile_width as f32, + y: tmx_tileset.tile_height as f32 + }); + + tile_rect.set_position(Vector2f { + x: (x * tmx_tileset.tile_width) as f32, + y: (y * tmx_tileset.tile_height) as f32 + }); + + window.draw(&tile_rect); } } } -- cgit v1.2.1