diff --git a/Cargo.lock b/Cargo.lock index c9486ee..6e740b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,80 +2,112 @@ name = "super-matte-bros" version = "0.0.1" dependencies = [ - "sdl2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sdl2_image 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sdl2 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sdl2_image 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "advapi32-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bitflags" -version = "0.1.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "libc" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "log" -version = "0.3.1" +name = "kernel32-sys" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libc" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "num" -version = "0.1.22" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand" -version = "0.3.7" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "advapi32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-serialize" -version = "0.3.12" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sdl2" -version = "0.2.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "sdl2-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "num 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "sdl2-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sdl2-sys" -version = "0.2.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "num 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sdl2_image" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sdl2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sdl2-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "sdl2 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sdl2-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "time" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + diff --git a/Cargo.toml b/Cargo.toml index 434054c..66f98ab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,8 +4,9 @@ version = "0.0.1" authors = ["logaritmisk "] [dependencies] -sdl2 = "0.2.1" -sdl2_image = "0.2.1" +time = "0.1" +sdl2 = "0.9" +sdl2_image = "0.3" [[bin]] name = "super-matte-bros" diff --git a/src/camera.rs b/src/camera.rs index 7c6cd59..2aeffd1 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -4,13 +4,13 @@ use sdl2::rect::Rect; pub struct Camera { x: i32, y: i32, - w: i32, - h: i32, + w: u32, + h: u32, bounding: Rect } impl Camera { - pub fn new(x: i32, y: i32, w: i32, h: i32, bounding: Rect) -> Camera { + pub fn new(x: i32, y: i32, w: u32, h: u32, bounding: Rect) -> Camera { Camera { x: x, y: y, @@ -21,19 +21,19 @@ impl Camera { } pub fn center(&mut self, object: &Rect) { - let mut x = (object.x + object.w / 2) - (self.w / 2); - let mut y = (object.y + object.h / 2) - (self.h / 2); + let mut x = (object.x() + object.width() as i32 / 2) - (self.w as i32 / 2); + let mut y = (object.y() + object.height() as i32 / 2) - (self.h as i32 / 2); - if x < self.bounding.x { - x = self.bounding.x; - } else if x + self.w > self.bounding.w { - x = self.bounding.w - self.w; + if x < self.bounding.x() { + x = self.bounding.x(); + } else if x + self.w as i32 > self.bounding.width() as i32 { + x = (self.bounding.width() - self.w) as i32; } - if y < self.bounding.y { - y = self.bounding.y; - } else if y + self.h > self.bounding.h { - y = self.bounding.h - self.h; + if y < self.bounding.y() { + y = self.bounding.y(); + } else if y + self.h as i32 > self.bounding.height() as i32 { + y = (self.bounding.height() - self.h) as i32; } self.x = x; @@ -41,6 +41,6 @@ impl Camera { } pub fn to_rect(&self) -> Rect { - Rect::new(self.x, self.y, self.w, self.h) + Rect::new_unwrap(self.x, self.y, self.w, self.h) } } diff --git a/src/keyboard.rs b/src/keyboard.rs index e7396b8..1fb2ed4 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -1,12 +1,12 @@ use std::collections::HashMap; -use sdl2::keycode::KeyCode; +use sdl2::keyboard::Keycode; pub struct KeyboardHandler { - pressed_keys: HashMap, - released_keys: HashMap, - held_keys: HashMap + pressed_keys: HashMap, + released_keys: HashMap, + held_keys: HashMap } impl KeyboardHandler { @@ -23,31 +23,31 @@ impl KeyboardHandler { self.released_keys.clear(); } - pub fn key_down(&mut self, keycode: KeyCode) { + pub fn key_down(&mut self, keycode: Keycode) { self.pressed_keys.insert(keycode, true); self.held_keys.insert(keycode, true); } - pub fn key_up(&mut self, keycode: KeyCode) { + pub fn key_up(&mut self, keycode: Keycode) { self.released_keys.insert(keycode, true); self.held_keys.insert(keycode, false); } - pub fn was_pressed(&self, keycode: KeyCode) -> bool { + pub fn was_pressed(&self, keycode: Keycode) -> bool { match self.pressed_keys.get(&keycode) { Some(state) => *state, None => false } } - pub fn was_released(&self, keycode: KeyCode) -> bool { + pub fn was_released(&self, keycode: Keycode) -> bool { match self.released_keys.get(&keycode) { Some(state) => *state, None => false } } - pub fn is_held(&self, keycode: KeyCode) -> bool { + pub fn is_held(&self, keycode: Keycode) -> bool { match self.held_keys.get(&keycode) { Some(state) => *state, None => false diff --git a/src/main.rs b/src/main.rs index 7e5dd40..acf7d15 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,16 @@ +extern crate time; extern crate sdl2; extern crate sdl2_image; use std::path::Path; +use std::thread::sleep_ms; -use sdl2::video::{Window, WindowPos, OPENGL}; -use sdl2::timer::{get_ticks, delay}; +//use sdl2::video::{Window, WindowPos, OPENGL}; +//use sdl2::timer::{get_ticks, delay}; +use sdl2_image::LoadTexture; use sdl2::rect::Rect; -use sdl2::keycode::KeyCode; +use sdl2::keyboard::Keycode; use sdl2::pixels::Color; use tile::Layer; @@ -24,13 +27,13 @@ mod keyboard; mod sprite; -const SCREEN_WIDTH : i32 = 960; -const SCREEN_HEIGHT : i32 = 640; +const SCREEN_WIDTH : u32 = 960; +const SCREEN_HEIGHT : u32 = 640; -const TILE_WIDTH : i32 = 32; -const TILE_HEIGHT : i32 = 32; +const TILE_WIDTH : u32 = 32; +const TILE_HEIGHT : u32 = 32; -const MS_PER_UPDATE : u32 = 10; +const MS_PER_UPDATE : u64 = 10; const PLAYER_SPEED_X : f32 = 4.0; const PLAYER_THRESHOLD_X : f32 = 0.2; @@ -51,41 +54,20 @@ enum Tile<'a> { fn main() { - let sdl_context = sdl2::init(sdl2::INIT_EVERYTHING).unwrap(); + let sdl_context = sdl2::init().unwrap(); + let video_subsystem = sdl_context.video().unwrap(); + sdl2_image::init(sdl2_image::INIT_PNG); - let window = match Window::new(&sdl_context, "Super Matte Bros", WindowPos::PosCentered, WindowPos::PosCentered, SCREEN_WIDTH, SCREEN_HEIGHT, OPENGL) { - Ok(window) => window, - Err(err) => panic!("failed to create window: {}", err) - }; + let window = video_subsystem.window("Super Matte Bros", SCREEN_WIDTH, SCREEN_HEIGHT).position_centered().build().unwrap(); + let mut renderer = window.renderer().software().build().unwrap(); - let mut renderer = match sdl2::render::Renderer::from_window(window, sdl2::render::RenderDriverIndex::Auto, sdl2::render::ACCELERATED) { - Ok(renderer) => renderer, - Err(err) => panic!("failed to create renderer: {}", err) - }; - - let world_surface = match sdl2_image::LoadSurface::from_file(&Path::new("gfx/world.png")) { - Ok(surface) => surface, - Err(err) => panic!("failed to load png: {}", err) - }; - - let world_sprites = match renderer.create_texture_from_surface(&world_surface) { - Ok(texture) => texture, - Err(err) => panic!("failed to create surface: {}", err) - }; + let world_sprites = renderer.load_texture(&Path::new("gfx/world.png")).unwrap(); let floor_sprite = StaticSprite::new(&world_sprites, 16 * 0, 16 * 0); let brick_sprite = StaticSprite::new(&world_sprites, 16 * 1, 16 * 0); - let player_surface = match sdl2_image::LoadSurface::from_file(&Path::new("gfx/mario.png")) { - Ok(surface) => surface, - Err(err) => panic!("failed to load png: {}", err) - }; - - let player_sprites = match renderer.create_texture_from_surface(&player_surface) { - Ok(texture) => texture, - Err(err) => panic!("failed to create surface: {}", err) - }; + let player_sprites = renderer.load_texture(&Path::new("gfx/mario.png")).unwrap(); let mut player_sprite = AnimatedSprite::new(&player_sprites, 96, 32, 3, 15); @@ -94,100 +76,100 @@ fn main() { let mut layer = Layer::new(212, 20, TILE_WIDTH, TILE_HEIGHT, Tile::Empty); - layer.set_tile(2, 15, Tile::Background(Rect::new(16 * 9, 16 * 8, 16, 16))); + layer.set_tile(2, 15, Tile::Background(Rect::new_unwrap(16 * 9, 16 * 8, 16, 16))); - layer.set_tile(1, 16, Tile::Background(Rect::new(16 * 8, 16 * 8, 16, 16))); - layer.set_tile(2, 16, Tile::Background(Rect::new(16 * 8, 16 * 9, 16, 16))); - layer.set_tile(3, 16, Tile::Background(Rect::new(16 * 10, 16 * 8, 16, 16))); + layer.set_tile(1, 16, Tile::Background(Rect::new_unwrap(16 * 8, 16 * 8, 16, 16))); + layer.set_tile(2, 16, Tile::Background(Rect::new_unwrap(16 * 8, 16 * 9, 16, 16))); + layer.set_tile(3, 16, Tile::Background(Rect::new_unwrap(16 * 10, 16 * 8, 16, 16))); - layer.set_tile(0, 17, Tile::Background(Rect::new(16 * 8, 16 * 8, 16, 16))); - layer.set_tile(1, 17, Tile::Background(Rect::new(16 * 8, 16 * 9, 16, 16))); - layer.set_tile(2, 17, Tile::Background(Rect::new(16 * 9, 16 * 9, 16, 16))); - layer.set_tile(3, 17, Tile::Background(Rect::new(16 * 8, 16 * 9, 16, 16))); - layer.set_tile(4, 17, Tile::Background(Rect::new(16 * 10, 16 * 8, 16, 16))); + layer.set_tile(0, 17, Tile::Background(Rect::new_unwrap(16 * 8, 16 * 8, 16, 16))); + layer.set_tile(1, 17, Tile::Background(Rect::new_unwrap(16 * 8, 16 * 9, 16, 16))); + layer.set_tile(2, 17, Tile::Background(Rect::new_unwrap(16 * 9, 16 * 9, 16, 16))); + layer.set_tile(3, 17, Tile::Background(Rect::new_unwrap(16 * 8, 16 * 9, 16, 16))); + layer.set_tile(4, 17, Tile::Background(Rect::new_unwrap(16 * 10, 16 * 8, 16, 16))); - layer.set_tile(11, 17, Tile::Background(Rect::new(16 * 11, 16 * 9, 16, 16))); - layer.set_tile(12, 17, Tile::Background(Rect::new(16 * 12, 16 * 9, 16, 16))); - layer.set_tile(13, 17, Tile::Background(Rect::new(16 * 12, 16 * 9, 16, 16))); - layer.set_tile(14, 17, Tile::Background(Rect::new(16 * 12, 16 * 9, 16, 16))); - layer.set_tile(15, 17, Tile::Background(Rect::new(16 * 13, 16 * 9, 16, 16))); + layer.set_tile(11, 17, Tile::Background(Rect::new_unwrap(16 * 11, 16 * 9, 16, 16))); + layer.set_tile(12, 17, Tile::Background(Rect::new_unwrap(16 * 12, 16 * 9, 16, 16))); + layer.set_tile(13, 17, Tile::Background(Rect::new_unwrap(16 * 12, 16 * 9, 16, 16))); + layer.set_tile(14, 17, Tile::Background(Rect::new_unwrap(16 * 12, 16 * 9, 16, 16))); + layer.set_tile(15, 17, Tile::Background(Rect::new_unwrap(16 * 13, 16 * 9, 16, 16))); - layer.set_tile(16, 14, Tile::Floor(Rect::new(16 * 24, 16 * 0, 16, 16))); + layer.set_tile(16, 14, Tile::Floor(Rect::new_unwrap(16 * 24, 16 * 0, 16, 16))); - layer.set_tile(17, 16, Tile::Background(Rect::new(16 * 9, 16 * 8, 16, 16))); + layer.set_tile(17, 16, Tile::Background(Rect::new_unwrap(16 * 9, 16 * 8, 16, 16))); - layer.set_tile(16, 17, Tile::Background(Rect::new(16 * 8, 16 * 8, 16, 16))); - layer.set_tile(17, 17, Tile::Background(Rect::new(16 * 8, 16 * 9, 16, 16))); - layer.set_tile(18, 17, Tile::Background(Rect::new(16 * 10, 16 * 8, 16, 16))); + layer.set_tile(16, 17, Tile::Background(Rect::new_unwrap(16 * 8, 16 * 8, 16, 16))); + layer.set_tile(17, 17, Tile::Background(Rect::new_unwrap(16 * 8, 16 * 9, 16, 16))); + layer.set_tile(18, 17, Tile::Background(Rect::new_unwrap(16 * 10, 16 * 8, 16, 16))); layer.set_tile(20, 14, Tile::Static(&brick_sprite, true)); - layer.set_tile(21, 14, Tile::Floor(Rect::new(16 * 24, 16 * 0, 16, 16))); + layer.set_tile(21, 14, Tile::Floor(Rect::new_unwrap(16 * 24, 16 * 0, 16, 16))); layer.set_tile(22, 14, Tile::Static(&brick_sprite, true)); - layer.set_tile(23, 14, Tile::Floor(Rect::new(16 * 24, 16 * 0, 16, 16))); + layer.set_tile(23, 14, Tile::Floor(Rect::new_unwrap(16 * 24, 16 * 0, 16, 16))); layer.set_tile(24, 14, Tile::Static(&brick_sprite, true)); - layer.set_tile(22, 10, Tile::Floor(Rect::new(16 * 24, 16 * 0, 16, 16))); + layer.set_tile(22, 10, Tile::Floor(Rect::new_unwrap(16 * 24, 16 * 0, 16, 16))); - layer.set_tile(19, 7, Tile::Floor(Rect::new(16 * 0, 16 * 20, 16, 16))); - layer.set_tile(20, 7, Tile::Floor(Rect::new(16 * 1, 16 * 20, 16, 16))); - layer.set_tile(21, 7, Tile::Floor(Rect::new(16 * 2, 16 * 20, 16, 16))); - layer.set_tile(19, 8, Tile::Floor(Rect::new(16 * 0, 16 * 21, 16, 16))); - layer.set_tile(20, 8, Tile::Floor(Rect::new(16 * 1, 16 * 21, 16, 16))); - layer.set_tile(21, 8, Tile::Floor(Rect::new(16 * 2, 16 * 21, 16, 16))); + layer.set_tile(19, 7, Tile::Floor(Rect::new_unwrap(16 * 0, 16 * 20, 16, 16))); + layer.set_tile(20, 7, Tile::Floor(Rect::new_unwrap(16 * 1, 16 * 20, 16, 16))); + layer.set_tile(21, 7, Tile::Floor(Rect::new_unwrap(16 * 2, 16 * 20, 16, 16))); + layer.set_tile(19, 8, Tile::Floor(Rect::new_unwrap(16 * 0, 16 * 21, 16, 16))); + layer.set_tile(20, 8, Tile::Floor(Rect::new_unwrap(16 * 1, 16 * 21, 16, 16))); + layer.set_tile(21, 8, Tile::Floor(Rect::new_unwrap(16 * 2, 16 * 21, 16, 16))); - layer.set_tile(23, 17, Tile::Background(Rect::new(16 * 11, 16 * 9, 16, 16))); - layer.set_tile(24, 17, Tile::Background(Rect::new(16 * 12, 16 * 9, 16, 16))); - layer.set_tile(25, 17, Tile::Background(Rect::new(16 * 13, 16 * 9, 16, 16))); + layer.set_tile(23, 17, Tile::Background(Rect::new_unwrap(16 * 11, 16 * 9, 16, 16))); + layer.set_tile(24, 17, Tile::Background(Rect::new_unwrap(16 * 12, 16 * 9, 16, 16))); + layer.set_tile(25, 17, Tile::Background(Rect::new_unwrap(16 * 13, 16 * 9, 16, 16))); - layer.set_tile(28, 16, Tile::Floor(Rect::new(16 * 0, 16 * 8, 16, 16))); - layer.set_tile(29, 16, Tile::Floor(Rect::new(16 * 1, 16 * 8, 16, 16))); - layer.set_tile(28, 17, Tile::Floor(Rect::new(16 * 0, 16 * 9, 16, 16))); - layer.set_tile(29, 17, Tile::Floor(Rect::new(16 * 1, 16 * 9, 16, 16))); + layer.set_tile(28, 16, Tile::Floor(Rect::new_unwrap(16 * 0, 16 * 8, 16, 16))); + layer.set_tile(29, 16, Tile::Floor(Rect::new_unwrap(16 * 1, 16 * 8, 16, 16))); + layer.set_tile(28, 17, Tile::Floor(Rect::new_unwrap(16 * 0, 16 * 9, 16, 16))); + layer.set_tile(29, 17, Tile::Floor(Rect::new_unwrap(16 * 1, 16 * 9, 16, 16))); - layer.set_tile(38, 15, Tile::Floor(Rect::new(16 * 0, 16 * 8, 16, 16))); - layer.set_tile(39, 15, Tile::Floor(Rect::new(16 * 1, 16 * 8, 16, 16))); - layer.set_tile(38, 16, Tile::Floor(Rect::new(16 * 0, 16 * 9, 16, 16))); - layer.set_tile(39, 16, Tile::Floor(Rect::new(16 * 1, 16 * 9, 16, 16))); - layer.set_tile(38, 17, Tile::Floor(Rect::new(16 * 0, 16 * 9, 16, 16))); - layer.set_tile(39, 17, Tile::Floor(Rect::new(16 * 1, 16 * 9, 16, 16))); + layer.set_tile(38, 15, Tile::Floor(Rect::new_unwrap(16 * 0, 16 * 8, 16, 16))); + layer.set_tile(39, 15, Tile::Floor(Rect::new_unwrap(16 * 1, 16 * 8, 16, 16))); + layer.set_tile(38, 16, Tile::Floor(Rect::new_unwrap(16 * 0, 16 * 9, 16, 16))); + layer.set_tile(39, 16, Tile::Floor(Rect::new_unwrap(16 * 1, 16 * 9, 16, 16))); + layer.set_tile(38, 17, Tile::Floor(Rect::new_unwrap(16 * 0, 16 * 9, 16, 16))); + layer.set_tile(39, 17, Tile::Floor(Rect::new_unwrap(16 * 1, 16 * 9, 16, 16))); - layer.set_tile(41, 17, Tile::Background(Rect::new(16 * 11, 16 * 9, 16, 16))); - layer.set_tile(42, 17, Tile::Background(Rect::new(16 * 12, 16 * 9, 16, 16))); - layer.set_tile(43, 17, Tile::Background(Rect::new(16 * 12, 16 * 9, 16, 16))); - layer.set_tile(44, 17, Tile::Background(Rect::new(16 * 13, 16 * 9, 16, 16))); + layer.set_tile(41, 17, Tile::Background(Rect::new_unwrap(16 * 11, 16 * 9, 16, 16))); + layer.set_tile(42, 17, Tile::Background(Rect::new_unwrap(16 * 12, 16 * 9, 16, 16))); + layer.set_tile(43, 17, Tile::Background(Rect::new_unwrap(16 * 12, 16 * 9, 16, 16))); + layer.set_tile(44, 17, Tile::Background(Rect::new_unwrap(16 * 13, 16 * 9, 16, 16))); - layer.set_tile(46, 14, Tile::Floor(Rect::new(16 * 0, 16 * 8, 16, 16))); - layer.set_tile(47, 14, Tile::Floor(Rect::new(16 * 1, 16 * 8, 16, 16))); - layer.set_tile(46, 15, Tile::Floor(Rect::new(16 * 0, 16 * 9, 16, 16))); - layer.set_tile(47, 15, Tile::Floor(Rect::new(16 * 1, 16 * 9, 16, 16))); - layer.set_tile(46, 16, Tile::Floor(Rect::new(16 * 0, 16 * 9, 16, 16))); - layer.set_tile(47, 16, Tile::Floor(Rect::new(16 * 1, 16 * 9, 16, 16))); - layer.set_tile(46, 17, Tile::Floor(Rect::new(16 * 0, 16 * 9, 16, 16))); - layer.set_tile(47, 17, Tile::Floor(Rect::new(16 * 1, 16 * 9, 16, 16))); + layer.set_tile(46, 14, Tile::Floor(Rect::new_unwrap(16 * 0, 16 * 8, 16, 16))); + layer.set_tile(47, 14, Tile::Floor(Rect::new_unwrap(16 * 1, 16 * 8, 16, 16))); + layer.set_tile(46, 15, Tile::Floor(Rect::new_unwrap(16 * 0, 16 * 9, 16, 16))); + layer.set_tile(47, 15, Tile::Floor(Rect::new_unwrap(16 * 1, 16 * 9, 16, 16))); + layer.set_tile(46, 16, Tile::Floor(Rect::new_unwrap(16 * 0, 16 * 9, 16, 16))); + layer.set_tile(47, 16, Tile::Floor(Rect::new_unwrap(16 * 1, 16 * 9, 16, 16))); + layer.set_tile(46, 17, Tile::Floor(Rect::new_unwrap(16 * 0, 16 * 9, 16, 16))); + layer.set_tile(47, 17, Tile::Floor(Rect::new_unwrap(16 * 1, 16 * 9, 16, 16))); - layer.set_tile(50, 15, Tile::Background(Rect::new(16 * 9, 16 * 8, 16, 16))); + layer.set_tile(50, 15, Tile::Background(Rect::new_unwrap(16 * 9, 16 * 8, 16, 16))); - layer.set_tile(49, 16, Tile::Background(Rect::new(16 * 8, 16 * 8, 16, 16))); - layer.set_tile(50, 16, Tile::Background(Rect::new(16 * 8, 16 * 9, 16, 16))); - layer.set_tile(51, 16, Tile::Background(Rect::new(16 * 10, 16 * 8, 16, 16))); + layer.set_tile(49, 16, Tile::Background(Rect::new_unwrap(16 * 8, 16 * 8, 16, 16))); + layer.set_tile(50, 16, Tile::Background(Rect::new_unwrap(16 * 8, 16 * 9, 16, 16))); + layer.set_tile(51, 16, Tile::Background(Rect::new_unwrap(16 * 10, 16 * 8, 16, 16))); - layer.set_tile(48, 17, Tile::Background(Rect::new(16 * 8, 16 * 8, 16, 16))); - layer.set_tile(49, 17, Tile::Background(Rect::new(16 * 8, 16 * 9, 16, 16))); - layer.set_tile(50, 17, Tile::Background(Rect::new(16 * 9, 16 * 9, 16, 16))); - layer.set_tile(51, 17, Tile::Background(Rect::new(16 * 8, 16 * 9, 16, 16))); - layer.set_tile(52, 17, Tile::Background(Rect::new(16 * 10, 16 * 8, 16, 16))); + layer.set_tile(48, 17, Tile::Background(Rect::new_unwrap(16 * 8, 16 * 8, 16, 16))); + layer.set_tile(49, 17, Tile::Background(Rect::new_unwrap(16 * 8, 16 * 9, 16, 16))); + layer.set_tile(50, 17, Tile::Background(Rect::new_unwrap(16 * 9, 16 * 9, 16, 16))); + layer.set_tile(51, 17, Tile::Background(Rect::new_unwrap(16 * 8, 16 * 9, 16, 16))); + layer.set_tile(52, 17, Tile::Background(Rect::new_unwrap(16 * 10, 16 * 8, 16, 16))); for x in 0..212 { @@ -200,16 +182,15 @@ fn main() { let mut player = Player::new(390.0, 390.0); - let mut current : u32; - let mut elapsed : u32; - let mut previous : u32 = get_ticks(); - let mut lag : u32 = 0; + let mut current : u64; + let mut elapsed : u64; + let mut previous : u64 = time::precise_time_ns(); + let mut lag : u64 = 0; - let mut drawer = renderer.drawer(); - let mut event_pump = sdl_context.event_pump(); + let mut event_pump = sdl_context.event_pump().unwrap(); 'main : loop { - current = get_ticks(); + current = time::precise_time_ns(); elapsed = current - previous; previous = current; lag += elapsed; @@ -223,21 +204,21 @@ fn main() { Event::Quit {..} => break 'main, Event::KeyDown {keycode, repeat, ..} => { if repeat == false { - keyboard.key_down(keycode); + keyboard.key_down(keycode.unwrap()); } }, Event::KeyUp {keycode, ..} => { - keyboard.key_up(keycode); + keyboard.key_up(keycode.unwrap()); }, _ => (), } } - if keyboard.was_pressed(KeyCode::Escape) { + if keyboard.was_pressed(Keycode::Escape) { break 'main; } - if keyboard.is_held(KeyCode::Right) && (player.dx >= 0.0 || player.on_ground) { + if keyboard.is_held(Keycode::Right) && (player.dx >= 0.0 || player.on_ground) { let a = if player.dx > 0.0 { PLAYER_ACCELERATION_X_START } else { @@ -245,7 +226,7 @@ fn main() { }; player.dx = a * PLAYER_SPEED_X + (1.0 - a) * player.dx; - } else if keyboard.is_held(KeyCode::Left) && (player.dx <= 0.0 || player.on_ground) { + } else if keyboard.is_held(Keycode::Left) && (player.dx <= 0.0 || player.on_ground) { let a = if player.dx < 0.0 { PLAYER_ACCELERATION_X_START } else { @@ -262,14 +243,14 @@ fn main() { } if player.on_ground { - if keyboard.was_pressed(KeyCode::Up) { + if keyboard.was_pressed(Keycode::Up) { player.dy = -8.0; player.on_ground = false; } } - if keyboard.was_released(KeyCode::Up) { + if keyboard.was_released(Keycode::Up) { if player.dy < -4.0 { player.dy = -4.0; } @@ -285,11 +266,11 @@ fn main() { let p = player.x + player.w as f32; let mut d = player.dx; - for y in intersect.y..intersect.y + intersect.h + 1 { - let mut x = intersect.x; + for y in intersect.y()..intersect.y() + intersect.height() as i32 + 1 { + let mut x = intersect.x(); loop { - let t = (x * TILE_WIDTH) as f32 - p; + let t = (x * TILE_WIDTH as i32) as f32 - p; if t > d { break; @@ -321,11 +302,11 @@ fn main() { let p = player.x; let mut d = player.dx; - for y in intersect.y..intersect.y + intersect.h + 1 { - let mut x = intersect.x; + for y in intersect.y()..intersect.y() + intersect.height() as i32 + 1 { + let mut x = intersect.x(); loop { - let t = (x * TILE_WIDTH + TILE_WIDTH) as f32 - p; + let t = (x * TILE_WIDTH as i32 + TILE_WIDTH as i32) as f32 - p; if t < d { break; @@ -359,11 +340,11 @@ fn main() { let p = player.y + player.h as f32; let mut d = player.dy; - for x in intersect.x..intersect.x + intersect.w + 1 { - let mut y = intersect.y; + for x in intersect.x()..intersect.x() + intersect.width() as i32 + 1 { + let mut y = intersect.y(); loop { - let t = (y * TILE_HEIGHT) as f32 - p; + let t = (y * TILE_HEIGHT as i32) as f32 - p; if t > d { break; @@ -399,11 +380,11 @@ fn main() { let p = player.y; let mut d = player.dy; - for x in intersect.x..intersect.x + intersect.w + 1 { - let mut y = intersect.y; + for x in intersect.x()..intersect.x() + intersect.width() as i32 + 1 { + let mut y = intersect.y(); loop { - let t = (y * TILE_HEIGHT + TILE_HEIGHT) as f32 - p; + let t = (y * TILE_HEIGHT as i32 + TILE_HEIGHT as i32) as f32 - p; if t < d { break; @@ -441,36 +422,36 @@ fn main() { lag -= MS_PER_UPDATE; } - drawer.set_draw_color(Color::RGB(93, 148, 251)); - drawer.clear(); + renderer.set_draw_color(Color::RGB(93, 148, 251)); + renderer.clear(); layer.for_each_intersecting(&camera.to_rect(), |tile: &Tile, position: &Rect| { let object = camera_relative_rect(&camera.to_rect(), position); match *tile { Tile::Background(src) => { - let _ = drawer.copy(&world_sprites, Some(src), Some(object)); + let _ = renderer.copy(&world_sprites, Some(src), Some(object)); }, Tile::Floor(src) => { - let _ = drawer.copy(&world_sprites, Some(src), Some(object)); + let _ = renderer.copy(&world_sprites, Some(src), Some(object)); }, - Tile::Static(ref sprite, _) => sprite.render(&mut drawer, &object), + Tile::Static(ref sprite, _) => sprite.render(&mut renderer, &object), _ => () } }); let player_rect = camera_relative_rect(&camera.to_rect(), &player.to_rect()); - player_sprite.render(&mut drawer, &player_rect); + player_sprite.render(&mut renderer, &player_rect); - drawer.present(); + renderer.present(); - delay(5); + sleep_ms(5); } sdl2_image::quit(); } fn camera_relative_rect(camera: &Rect, other: &Rect) -> Rect { - Rect::new(other.x - camera.x, other.y - camera.y, other.w, other.h) + Rect::new_unwrap(other.x() - camera.x(), other.y() - camera.y(), other.width(), other.height()) } diff --git a/src/player.rs b/src/player.rs index 0b9d2d3..c178ddd 100644 --- a/src/player.rs +++ b/src/player.rs @@ -4,8 +4,8 @@ use sdl2::rect::Rect; pub struct Player { pub x: f32, pub y: f32, - pub w: i32, - pub h: i32, + pub w: u32, + pub h: u32, pub dx: f32, pub dy: f32, pub gravity: f32, @@ -37,6 +37,6 @@ impl Player { } pub fn to_rect(&self) -> Rect { - Rect::new(self.x as i32, self.y as i32, self.w, self.h) + Rect::new_unwrap(self.x as i32, self.y as i32, self.w, self.h) } } diff --git a/src/sprite.rs b/src/sprite.rs index 690235a..e604187 100644 --- a/src/sprite.rs +++ b/src/sprite.rs @@ -1,10 +1,10 @@ -use sdl2::render::{Texture, RenderDrawer}; +use sdl2::render::{Texture, Renderer}; use sdl2::rect::Rect; pub trait Sprite { - fn update(&mut self, u32) {} - fn render(&self, &mut RenderDrawer, &Rect); + fn update(&mut self, u64) {} + fn render(&self, &mut Renderer, &Rect); } @@ -25,8 +25,8 @@ impl<'a> StaticSprite<'a> { } impl<'a> Sprite for StaticSprite<'a> { - fn render(&self, drawer: &mut RenderDrawer, destination: &Rect) { - drawer.copy(self.texture, Some(Rect::new(self.x, self.y, 16, 16)), Some(*destination)); + fn render(&self, drawer: &mut Renderer, destination: &Rect) { + drawer.copy(self.texture, Some(Rect::new_unwrap(self.x, self.y, 16, 16)), Some(*destination)); } } @@ -35,14 +35,14 @@ pub struct AnimatedSprite<'a> { texture: &'a Texture, x: i32, y: i32, - frame: i32, - frames: i32, - time: u32, - frame_time: u32 + frame: u32, + frames: u32, + time: u64, + frame_time: u64 } impl<'a> AnimatedSprite<'a> { - pub fn new(texture: &'a Texture, x: i32, y: i32, frames: i32, fps: i32) -> AnimatedSprite<'a> { + pub fn new(texture: &'a Texture, x: i32, y: i32, frames: u32, fps: u32) -> AnimatedSprite<'a> { AnimatedSprite { texture: texture, x: x, @@ -50,13 +50,13 @@ impl<'a> AnimatedSprite<'a> { frame: 0, frames: frames, time: 0, - frame_time: 1000 / fps as u32 + frame_time: 1000 / fps as u64 } } } impl<'a> Sprite for AnimatedSprite<'a> { - fn update(&mut self, elapsed: u32) { + fn update(&mut self, elapsed: u64) { self.time += elapsed; if self.time > self.frame_time { @@ -73,7 +73,7 @@ impl<'a> Sprite for AnimatedSprite<'a> { } } - fn render(&self, drawer: &mut RenderDrawer, destination: &Rect) { - drawer.copy(self.texture, Some(Rect::new(self.x, self.y, 16, 16)), Some(*destination)); + fn render(&self, drawer: &mut Renderer, destination: &Rect) { + drawer.copy(self.texture, Some(Rect::new_unwrap(self.x, self.y, 16, 16)), Some(*destination)); } } diff --git a/src/tile.rs b/src/tile.rs index 590165e..e95b88e 100644 --- a/src/tile.rs +++ b/src/tile.rs @@ -6,14 +6,14 @@ use sdl2::rect::Rect; pub struct Layer { tiles: Vec, - width: i32, - height: i32, - tile_width: i32, - tile_height: i32 + width: u32, + height: u32, + tile_width: u32, + tile_height: u32 } impl Layer where T: Clone { - pub fn new(width: i32, height: i32, tile_width: i32, tile_height: i32, tile: T) -> Layer { + pub fn new(width: u32, height: u32, tile_width: u32, tile_height: u32, tile: T) -> Layer { Layer { tiles: repeat(tile).take((width * height) as usize).collect(), width: width, @@ -24,7 +24,7 @@ impl Layer where T: Clone { } pub fn get_tile(&self, x: i32, y: i32) -> Option<&T> { - let offset = (x + y * self.width) as usize; + let offset = (x + y * self.width as i32) as usize; if offset < self.tiles.len() { Some(&self.tiles[offset]) @@ -34,33 +34,33 @@ impl Layer where T: Clone { } pub fn set_tile(&mut self, x: i32, y: i32, tile: T) { - let offset = (x + y * self.width) as usize; + let offset = (x + y * self.width as i32) as usize; self.tiles[offset] = tile; } pub fn find_intersecting(&self, rect: &Rect) -> Option { - let x1 = max(rect.x / self.tile_width, 0); - let y1 = max(rect.y / self.tile_height, 0); - let x2 = min((rect.x + rect.w - 1) / self.tile_width, self.width - 1); - let y2 = min((rect.y + rect.h - 1) / self.tile_height, self.height - 1); + let x1 = max(rect.x() / self.tile_width as i32, 0); + let y1 = max(rect.y() / self.tile_height as i32, 0); + let x2 = min((rect.x() + rect.width() as i32 - 1) / self.tile_width as i32, self.width as i32 - 1); + let y2 = min((rect.y() + rect.height() as i32 - 1) / self.tile_height as i32, self.height as i32 - 1); - if x1 < 0 || x2 >= self.width { + if x1 < 0 || x2 >= self.width as i32 { None } - else if y1 < 0 || y2 >= self.height { + else if y1 < 0 || y2 >= self.height as i32 { None } else { - Some(Rect::new(x1, y1, x2 - x1, y2 - y1)) + Some(Rect::new_unwrap(x1, y1, (x2 - x1) as u32, (y2 - y1) as u32)) } } pub fn for_each_intersecting(&self, rect: &Rect, mut f: F) { if let Some(intersect) = self.find_intersecting(rect) { - for y in intersect.y..intersect.y + intersect.h + 1 { - for x in intersect.x..intersect.x + intersect.w + 1 { - let position = Rect::new(x * self.tile_width, y * self.tile_height, self.tile_width, self.tile_height); + for y in intersect.y()..intersect.y() + intersect.height() as i32 + 1 { + for x in intersect.x()..intersect.x() + intersect.width() as i32 + 1 { + let position = Rect::new_unwrap(x * self.tile_width as i32, y * self.tile_height as i32, self.tile_width, self.tile_height); f(self.get_tile(x, y).unwrap(), &position); } @@ -69,6 +69,6 @@ impl Layer where T: Clone { } pub fn to_rect(&self) -> Rect { - Rect::new(0, 0, self.width * self.tile_width, self.height * self.tile_height) + Rect::new_unwrap(0, 0, self.width * self.tile_width, self.height * self.tile_height) } }