|
|
@@ -2,16 +2,15 @@ mod components; |
|
|
|
mod physics; |
|
|
|
mod animator; |
|
|
|
mod keyboard; |
|
|
|
mod renderer; |
|
|
|
|
|
|
|
use sdl2::pixels::Color; |
|
|
|
use sdl2::event::Event; |
|
|
|
use sdl2::keyboard::Keycode; |
|
|
|
use sdl2::render::{WindowCanvas, Texture}; |
|
|
|
use sdl2::rect::{Point, Rect}; |
|
|
|
use sdl2::image::{self, LoadTexture, InitFlag}; |
|
|
|
|
|
|
|
use specs::prelude::*; |
|
|
|
use specs_derive::Component; |
|
|
|
|
|
|
|
use std::time::Duration; |
|
|
|
|
|
|
@@ -52,56 +51,6 @@ fn character_animation_frames(spritesheet: usize, top_left_frame: Rect, directio |
|
|
|
return frames |
|
|
|
} |
|
|
|
|
|
|
|
fn render ( |
|
|
|
canvas: &mut WindowCanvas, |
|
|
|
color: Color, |
|
|
|
texture: &Texture, |
|
|
|
player: &Player |
|
|
|
) -> Result<(), String> { |
|
|
|
canvas.set_draw_color(color); |
|
|
|
canvas.clear(); |
|
|
|
|
|
|
|
let (width, height) = canvas.output_size()?; |
|
|
|
|
|
|
|
let (frame_width, frame_height) = player.sprite.size(); |
|
|
|
let current_frame = Rect::new( |
|
|
|
player.sprite.x() + frame_width as i32 * player.current_frame, |
|
|
|
player.sprite.y() + frame_height as i32 * direction_spritesheet_row(player.direction), |
|
|
|
frame_width, |
|
|
|
frame_height, |
|
|
|
); |
|
|
|
|
|
|
|
let screen_position = player.position + Point::new(width as i32 / 2, height as i32 / 2); |
|
|
|
let screen_rect = Rect::from_center(screen_position, frame_width, frame_height); |
|
|
|
canvas.copy(texture, current_frame, screen_rect)?; |
|
|
|
|
|
|
|
canvas.present(); |
|
|
|
|
|
|
|
Ok(()) |
|
|
|
} |
|
|
|
|
|
|
|
fn update_player(player: &mut Player) { |
|
|
|
use self::Direction::*; |
|
|
|
match player.direction { |
|
|
|
Left => { |
|
|
|
player.position = player.position.offset(-player.speed, 0); |
|
|
|
}, |
|
|
|
Right => { |
|
|
|
player.position = player.position.offset(player.speed, 0); |
|
|
|
}, |
|
|
|
Up => { |
|
|
|
player.position = player.position.offset(0, -player.speed); |
|
|
|
}, |
|
|
|
Down => { |
|
|
|
player.position = player.position.offset(0, player.speed); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if player.speed != 0 { |
|
|
|
player.current_frame = (player.current_frame + 1) % 3; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
fn main() -> Result<(), String> { |
|
|
|
let sdl_context = sdl2::init()?; |
|
|
|
let video_subsystem = sdl_context.video()?; |
|
|
@@ -124,6 +73,7 @@ fn main() -> Result<(), String> { |
|
|
|
|
|
|
|
let mut world = World::new(); |
|
|
|
dispatcher.setup(&mut world.res); |
|
|
|
renderer::SystemData::setup(&mut world.res); |
|
|
|
|
|
|
|
let movement_command: Option<MovementCommand> = None; |
|
|
|
world.add_resource(movement_command); |
|
|
@@ -190,7 +140,7 @@ fn main() -> Result<(), String> { |
|
|
|
dispatcher.dispatch(&mut world.res); |
|
|
|
world.maintain(); |
|
|
|
|
|
|
|
render(&mut canvas, Color::RGB(i, 64, 255 - i), &texture, &player)?; |
|
|
|
renderer::render(&mut canvas, Color::RGB(i, 64, 255 - i), &textures, world.system_data())?; |
|
|
|
|
|
|
|
::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 20)); |
|
|
|
|