From e16e5008814f0d1cfd7c557a7c8f6c5ddf548d16 Mon Sep 17 00:00:00 2001 From: Davis Silverman <sinistersnare@gmail.com> Date: Fri, 1 May 2015 20:21:18 -0400 Subject: [PATCH] Piston Renderer example. --- .gitignore | 1 + .travis.yml | 5 +++ Cargo.toml | 21 +++++++++++- examples/piston.rs | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 examples/piston.rs diff --git a/.gitignore b/.gitignore index 704eab2..cc6f63b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ tags target Cargo.lock *.swp +*.dll diff --git a/.travis.yml b/.travis.yml index 065a643..4bc2697 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,11 @@ env: global: - secure: zpxgR0Nn7YhCRXPjfR/gcdxAObeJLBoRMW0qeKiyuc4V6Y1guZ9EfnvJ5uL4pRXnP0LZrXm/WwYicXm7J0vTwQwq/4Bf0NXykysZfVrHFTY5Wook/QXJd8OajCwuJa8d/wr6Dx/wGe/80gi8hZibraMS5QkWKgtzz9HCFLM99uw= language: rust +before_install: + - sudo add-apt-repository ppa:team-xbmc/ppa -y + - sudo apt-get update -qq +install: + - sudo apt-get install libsdl2-dev script: - cargo build - cargo test diff --git a/Cargo.toml b/Cargo.toml index 8b200ae..4d4900f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,26 @@ path = "src/lib.rs" name = "example" path = "examples/main.rs" +[[example]] +name = "piston" +path = "examples/piston.rs" + [dependencies] flate2 = "*" rustc-serialize = "*" -xml-rs = "*" + +[dependencies.xml-rs] +git = "https://github.com/netvl/xml-rs.git" + + +[dev-dependencies.pistoncore-sdl2_window] +git = "https://github.com/pistondevelopers/sdl2_window" + +[dev-dependencies.piston] +git = "https://github.com/pistondevelopers/piston" + +[dev-dependencies.piston2d-graphics] +git = "https://github.com/pistondevelopers/graphics" + +[dev-dependencies.piston2d-opengl_graphics] +git = "https://github.com/pistondevelopers/opengl_graphics" diff --git a/examples/piston.rs b/examples/piston.rs new file mode 100644 index 0000000..e689317 --- /dev/null +++ b/examples/piston.rs @@ -0,0 +1,82 @@ +extern crate piston; +extern crate graphics; +extern crate sdl2_window; +extern crate opengl_graphics; +extern crate tiled; + +use std::cell::RefCell; +use std::rc::Rc; +use std::path::Path; +use std::fs::File; + +use sdl2_window::Sdl2Window; +use opengl_graphics::{ + OpenGL, + Texture, +}; +use graphics::{Image, Graphics, default_draw_state}; +use graphics::math::Matrix2d; +use piston::event::*; + +fn main() { + let (width, height) = (500, 500); + let opengl = OpenGL::_3_2; + let window = Sdl2Window::new( + opengl, + piston::window::WindowSettings::new( + "Tiled + Piston Example".to_string(), + piston::window::Size {width: width, height: height} + ).exit_on_esc(true) + ); + let window = Rc::new(RefCell::new(window)); + let ref mut gl = opengl_graphics::GlGraphics::new(opengl); + let mut blank_image = Image::new(); + + let tmx_file = File::open(&Path::new("assets/tiled_base64_zlib.tmx")).ok().expect("could not open tmx"); + let tmx_map = tiled::parse(tmx_file).unwrap(); + let image_path = Path::new("assets/tilesheet.png"); + let image_tex = Texture::from_path(&image_path).unwrap(); + + for e in window.events() { + use piston::event::{RenderEvent}; + + if let Some(args) = e.render_args() { + gl.draw(args.viewport(), |c, gl| { + graphics::clear([0.0, 0.0, 0.0, 1.0], gl); + render_tiled_map(&tmx_map, &image_tex, &mut blank_image, c.transform, gl); + }); + } + } +} + +fn render_tiled_map<G>(map: &tiled::Map, + image_tex: &<G as Graphics>::Texture, + drawn_image: &mut Image, + transform: Matrix2d, + g: &mut G) + where G: Graphics +{ + let ref tile_set = map.tilesets[0]; + let (tile_width, tile_height) = (tile_set.tile_width, tile_set.tile_height); + let tiles_in_row = (tile_set.images[0].width + tile_set.spacing as i32 )/ (tile_width as i32 + tile_set.spacing as i32); + + for layer in map.layers.iter() { + for (i, tile_row) in layer.tiles.iter().enumerate() { + for (j, tile_val) in tile_row.iter().enumerate() { + if *tile_val == 0 { + continue; + } + let tile_x = *tile_val % tiles_in_row as u32 - 1; + let tile_y = *tile_val / tiles_in_row as u32; + + let pixel_x = ((tile_x) * tile_width) + ((tile_x) * tile_set.spacing); + let pixel_y = ((tile_y) * tile_height) + ((tile_y) * tile_set.spacing); + + drawn_image.src_rect([pixel_x as i32, pixel_y as i32, tile_width as i32, tile_height as i32]) + .rect([j as f64 * tile_width as f64, i as f64 * tile_height as f64, + tile_width as f64, tile_height as f64]) + .draw(image_tex, default_draw_state(), transform, g); + } + } + } +} -- GitLab