| @@ -2,15 +2,15 @@ use sdl2::pixels::Color; | |||
| use sdl2::event::Event; | |||
| use sdl2::keyboard::Keycode; | |||
| use sdl2::render::{WindowCanvas, Texture}; | |||
| use sdl2::image::{self, LoadTexture, InitFlag}; | |||
| use sdl2::rect::{Point, Rect}; | |||
| use sdl2::image::{self, LoadTexture, InitFlag}; | |||
| use specs::prelude::*; | |||
| use specs_derive::Component; | |||
| use std::time::Duration; | |||
| const PLAYER_MOVEMENT_SPEED: i32 = 5; | |||
| const PLAYER_MOVEMENT_SPEED: i32 = 20; | |||
| #[derive(Debug, Clone, Copy, PartialEq, Eq)] | |||
| enum Direction { | |||
| @@ -31,7 +31,7 @@ struct Velocity { | |||
| direction: Direction, | |||
| } | |||
| #[derive(Component, Debug)] | |||
| #[derive(Component, Debug, Clone)] | |||
| #[storage(VecStorage)] | |||
| struct Sprite { | |||
| spritesheet: usize, | |||
| @@ -67,12 +67,32 @@ fn direction_spritesheet_row(direction: Direction) -> i32 { | |||
| } | |||
| } | |||
| fn render( | |||
| canvas: &mut WindowCanvas, | |||
| color: Color, | |||
| fn character_animation_frames(spritesheet: usize, top_left_frame: Rect, direction: Direction) -> Vec<Sprite> { | |||
| let (frame_width, frame_height) = top_left_frame.size(); | |||
| let y_offset = top_left_frame.y() + frame_height as i32 * direction_spritesheet_row(direction); | |||
| let mut frames = Vec::new(); | |||
| for i in 0..3 { | |||
| frames.push(Sprite { | |||
| spritesheet, | |||
| region: Rect::new( | |||
| top_left_frame.x() + frame_width as i32 * i, | |||
| y_offset, | |||
| frame_width, | |||
| frame_height, | |||
| ) | |||
| }) | |||
| } | |||
| return frames | |||
| } | |||
| fn render ( | |||
| canvas: &mut WindowCanvas, | |||
| color: Color, | |||
| texture: &Texture, | |||
| player: &Player | |||
| ) -> Result<(), String> { | |||
| ) -> Result<(), String> { | |||
| canvas.set_draw_color(color); | |||
| canvas.clear(); | |||
| @@ -109,7 +129,7 @@ fn update_player(player: &mut Player) { | |||
| }, | |||
| Down => { | |||
| player.position = player.position.offset(0, player.speed); | |||
| }, | |||
| } | |||
| } | |||
| if player.speed != 0 { | |||
| @@ -120,26 +140,40 @@ fn update_player(player: &mut Player) { | |||
| fn main() -> Result<(), String> { | |||
| let sdl_context = sdl2::init()?; | |||
| let video_subsystem = sdl_context.video()?; | |||
| let _image_context = image::init(InitFlag::PNG | InitFlag::JPG)?; | |||
| let _image_content = image::init(InitFlag::PNG | InitFlag::JPG)?; | |||
| let window = video_subsystem.window("game tutorial", 800, 600) | |||
| .position_centered() | |||
| .build() | |||
| .expect("could not initialize video subsystem"); | |||
| let mut canvas = window.into_canvas().build() | |||
| .expect("could not make a canvas"); | |||
| let mut canvas = window.into_canvas().build().expect("could not make a canvas"); | |||
| let texture_creator = canvas.texture_creator(); | |||
| let texture = texture_creator.load_texture("assets/bardo.png")?; | |||
| let mut player = Player { | |||
| position: Point::new(0,0), | |||
| sprite: Rect::new(0, 0, 26, 36), | |||
| speed: 0, | |||
| direction: Direction::Right, | |||
| let textures = [ | |||
| texture_creator.load_texture("assets/bardo.png")?, | |||
| ]; | |||
| let player_spritesheet = 0; | |||
| let player_top_left_frame = Rect::new(0, 0, 26, 36); | |||
| let player_animation = MovementAnimation { | |||
| current_frame: 0, | |||
| }; | |||
| up_frames: character_animation_frames(player_spritesheet, player_top_left_frame, Direction::Up), | |||
| down_frames: character_animation_frames(player_spritesheet, player_top_left_frame, Direction::Down), | |||
| left_frames: character_animation_frames(player_spritesheet, player_top_left_frame, Direction::Left), | |||
| right_frames: character_animation_frames(player_spritesheet, player_top_left_frame, Direction::Right), | |||
| } | |||
| let mut world = World::new(); | |||
| world.create_entity() | |||
| .with(Position(Point::new(0, 0))) | |||
| .with(Velocity {speed: 0, direction: Direction::Right}), | |||
| .with(player_animation.right_frames[0].clone()) | |||
| .with(player_animation) | |||
| .build(); | |||
| let mut event_pump = sdl_context.event_pump()?; | |||
| let mut i = 0; | |||
| @@ -150,19 +184,19 @@ fn main() -> Result<(), String> { | |||
| Event::KeyDown { keycode: Some(Keycode::Escape), .. } => { | |||
| break 'running; | |||
| }, | |||
| Event::KeyDown { keycode: Some(Keycode::Left), .. } => { | |||
| Event::KeyDown { keycode: Some(Keycode::Left), repeat: false, .. } => { | |||
| player.speed = PLAYER_MOVEMENT_SPEED; | |||
| player.direction = Direction::Left; | |||
| }, | |||
| Event::KeyDown { keycode: Some(Keycode::Right), .. } => { | |||
| Event::KeyDown { keycode: Some(Keycode::Right), repeat: false, .. } => { | |||
| player.speed = PLAYER_MOVEMENT_SPEED; | |||
| player.direction = Direction::Right; | |||
| }, | |||
| Event::KeyDown { keycode: Some(Keycode::Up), .. } => { | |||
| Event::KeyDown { keycode: Some(Keycode::Up), repeat: false, .. } => { | |||
| player.speed = PLAYER_MOVEMENT_SPEED; | |||
| player.direction = Direction::Up; | |||
| }, | |||
| Event::KeyDown { keycode: Some(Keycode::Down), .. } => { | |||
| Event::KeyDown { keycode: Some(Keycode::Down), repeat: false, .. } => { | |||
| player.speed = PLAYER_MOVEMENT_SPEED; | |||
| player.direction = Direction::Down; | |||
| }, | |||
| @@ -179,10 +213,12 @@ fn main() -> Result<(), String> { | |||
| i = (i + 1) % 255; | |||
| update_player(&mut player); | |||
| render(&mut canvas, Color::RGB(i, 64, 255-i), &texture, &player)?; | |||
| render(&mut canvas, Color::RGB(i, 64, 255 - i), &texture, &player)?; | |||
| ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 20)); | |||
| ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60)); | |||
| } | |||
| Ok(()) | |||
| } | |||
| } | |||