New timer struct.
Fix frame rate for animated sprites.
This commit is contained in:
20
Cargo.lock
generated
20
Cargo.lock
generated
@@ -4,7 +4,6 @@ version = "0.0.1"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"sdl2 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"sdl2 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"sdl2_image 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"sdl2_image 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -21,15 +20,6 @@ name = "bitflags"
|
|||||||
version = "0.3.2"
|
version = "0.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "kernel32-sys"
|
|
||||||
version = "0.2.1"
|
|
||||||
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]]
|
[[package]]
|
||||||
name = "lazy_static"
|
name = "lazy_static"
|
||||||
version = "0.1.16"
|
version = "0.1.16"
|
||||||
@@ -101,16 +91,6 @@ dependencies = [
|
|||||||
"sdl2-sys 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"sdl2-sys 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "time"
|
|
||||||
version = "0.1.35"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"libc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi"
|
name = "winapi"
|
||||||
version = "0.2.4"
|
version = "0.2.4"
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ version = "0.0.1"
|
|||||||
authors = ["logaritmisk <anders.e.olsson@gmail.com>"]
|
authors = ["logaritmisk <anders.e.olsson@gmail.com>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
time = "0.1.35"
|
|
||||||
sdl2 = "0.16.0"
|
sdl2 = "0.16.0"
|
||||||
sdl2_image = "0.16.0"
|
sdl2_image = "0.16.0"
|
||||||
|
|
||||||
|
|||||||
36
src/main.rs
36
src/main.rs
@@ -1,10 +1,8 @@
|
|||||||
extern crate time;
|
|
||||||
extern crate sdl2;
|
extern crate sdl2;
|
||||||
extern crate sdl2_image;
|
extern crate sdl2_image;
|
||||||
|
|
||||||
|
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
// use std::thread::sleep;
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
@@ -15,12 +13,12 @@ use sdl2::pixels::Color;
|
|||||||
use sdl2::render::{Renderer, Texture};
|
use sdl2::render::{Renderer, Texture};
|
||||||
|
|
||||||
|
|
||||||
// use timer::current_time;
|
|
||||||
use tile::Layer;
|
use tile::Layer;
|
||||||
use camera::Camera;
|
use camera::Camera;
|
||||||
// use player::Player;
|
// use player::Player;
|
||||||
use keyboard::KeyboardHandler;
|
use keyboard::KeyboardHandler;
|
||||||
use sprite::{Sprite, StaticSprite, AnimatedSprite};
|
use sprite::{Sprite, StaticSprite, AnimatedSprite};
|
||||||
|
use timer::Timer;
|
||||||
|
|
||||||
|
|
||||||
mod timer;
|
mod timer;
|
||||||
@@ -142,19 +140,6 @@ enum Tile<'a> {
|
|||||||
Floor(Rect)
|
Floor(Rect)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct TextureManager<'a> {
|
|
||||||
renderer: &'a mut Renderer<'a>,
|
|
||||||
textures: HashMap<&'static str, Texture>
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> TextureManager<'a> {
|
|
||||||
fn new(renderer: &'a mut Renderer<'a>) -> TextureManager<'a> {
|
|
||||||
TextureManager {
|
|
||||||
renderer: renderer,
|
|
||||||
textures: HashMap::new()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let sdl_context = sdl2::init().unwrap();
|
let sdl_context = sdl2::init().unwrap();
|
||||||
@@ -165,8 +150,6 @@ fn main() {
|
|||||||
let window = video_subsystem.window("Super Matte Bros", SCREEN_WIDTH, SCREEN_HEIGHT).position_centered().build().unwrap();
|
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 = window.renderer().software().build().unwrap();
|
||||||
|
|
||||||
// let textures = TextureManager::new(&mut renderer);
|
|
||||||
|
|
||||||
let world_sprites = renderer.load_texture(&Path::new("gfx/world.png")).unwrap();
|
let world_sprites = renderer.load_texture(&Path::new("gfx/world.png")).unwrap();
|
||||||
|
|
||||||
let floor_sprite = StaticSprite::new(&world_sprites, 16 * 0, 16 * 0);
|
let floor_sprite = StaticSprite::new(&world_sprites, 16 * 0, 16 * 0);
|
||||||
@@ -174,6 +157,8 @@ fn main() {
|
|||||||
|
|
||||||
let player_sprites = renderer.load_texture(&Path::new("gfx/mario.png")).unwrap();
|
let player_sprites = renderer.load_texture(&Path::new("gfx/mario.png")).unwrap();
|
||||||
|
|
||||||
|
let timer = Timer::new();
|
||||||
|
|
||||||
let mut player = GameObject::new(390.0, 390.0, Box::new(PlayerPhysicsComponent), Box::new(PlayerGraphicsComponent::new(&player_sprites)));
|
let mut player = GameObject::new(390.0, 390.0, Box::new(PlayerPhysicsComponent), Box::new(PlayerGraphicsComponent::new(&player_sprites)));
|
||||||
|
|
||||||
let mut keyboard = KeyboardHandler::new();
|
let mut keyboard = KeyboardHandler::new();
|
||||||
@@ -285,16 +270,17 @@ fn main() {
|
|||||||
|
|
||||||
let mut camera = Camera::new(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, layer.to_rect());
|
let mut camera = Camera::new(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, layer.to_rect());
|
||||||
|
|
||||||
let mut current : f64;
|
let previous = timer.current_time();
|
||||||
let mut elapsed : f64;
|
|
||||||
let mut previous : f64 = timer::current_time();
|
let mut previous : f64 = 0.0;
|
||||||
let mut lag : f64 = 0.0;
|
let mut lag = 0.0;
|
||||||
|
|
||||||
let mut event_pump = sdl_context.event_pump().unwrap();
|
let mut event_pump = sdl_context.event_pump().unwrap();
|
||||||
|
|
||||||
'main : loop {
|
'main : loop {
|
||||||
current = timer::current_time();
|
let current = timer.current_time();
|
||||||
elapsed = current - previous;
|
let elapsed = current - previous;
|
||||||
|
|
||||||
previous = current;
|
previous = current;
|
||||||
lag += elapsed;
|
lag += elapsed;
|
||||||
|
|
||||||
@@ -553,7 +539,7 @@ fn main() {
|
|||||||
|
|
||||||
let player_rect = camera.to_relative_rect(&player.to_rect());
|
let player_rect = camera.to_relative_rect(&player.to_rect());
|
||||||
|
|
||||||
player.render(lag / MS_PER_UPDATE, &mut renderer, &player_rect);
|
player.render(elapsed, &mut renderer, &player_rect);
|
||||||
|
|
||||||
renderer.present();
|
renderer.present();
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ impl<'a> Sprite for AnimatedSprite<'a> {
|
|||||||
let mut time = self.time.borrow_mut();
|
let mut time = self.time.borrow_mut();
|
||||||
let mut frame = self.frame.borrow_mut();
|
let mut frame = self.frame.borrow_mut();
|
||||||
|
|
||||||
*time += 10.0 + elapsed;
|
*time += elapsed;
|
||||||
*frame += (*time / self.frame_time) as u32;
|
*frame += (*time / self.frame_time) as u32;
|
||||||
*time %= self.frame_time;
|
*time %= self.frame_time;
|
||||||
*frame %= self.frames;
|
*frame %= self.frames;
|
||||||
|
|||||||
22
src/timer.rs
22
src/timer.rs
@@ -1,5 +1,21 @@
|
|||||||
extern crate time;
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
pub fn current_time() -> f64 {
|
|
||||||
(time::precise_time_ns() / 1_000_000) as f64
|
pub struct Timer {
|
||||||
|
time: Instant
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Timer {
|
||||||
|
pub fn new() -> Timer {
|
||||||
|
Timer {
|
||||||
|
time: Instant::now()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn current_time(&self) -> f64 {
|
||||||
|
let secs = self.time.elapsed().as_secs() as f64;
|
||||||
|
let nanos = self.time.elapsed().subsec_nanos() as f64;
|
||||||
|
|
||||||
|
secs * 1_000.0 + nanos / 1_000_000.0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user