Files
rust-smb/src/main.rs

128 lines
3.3 KiB
Rust

extern crate sdl2;
use sdl2::video::{Window, WindowPos, OPENGL};
use sdl2::event::{poll_event, Event};
use sdl2::timer::{get_ticks};
use sdl2::rect::{Rect};
const SCREEN_WIDTH : int = 800;
const SCREEN_HEIGHT : int = 600;
const MS_PER_UPDATE : uint = 10;
struct Player {
x: f32,
y: f32,
vel_x: f32,
vel_y: f32,
gravity: f32,
}
impl Player {
fn new(x: f32, y: f32) -> Player {
Player { x: x, y: y, vel_x: 0.0, vel_y: 0.0, gravity: 0.3 }
}
pub fn update(&mut self) {
self.vel_y += self.gravity;
self.x += self.vel_x;
self.y += self.vel_y;
}
pub fn render(&self, renderer: &sdl2::render::Renderer) {
let player = Rect::new(self.x as i32, self.y as i32, 10, 10);
let _ = renderer.set_draw_color(sdl2::pixels::Color::RGB(0, 255, 0));
let _ = renderer.fill_rect(&player);
}
}
fn main() {
sdl2::init(sdl2::INIT_EVERYTHING);
let window = match Window::new("SMB", WindowPos::PosCentered, WindowPos::PosCentered, SCREEN_WIDTH, SCREEN_HEIGHT, OPENGL) {
Ok(window) => window,
Err(err) => panic!("failed to create window: {}", err)
};
let 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 mut player = Player::new(390.0, 290.0);
let mut on_ground = true;
let mut current : uint = 0;
let mut elapsed : uint = 0;
let mut lag : uint = 0;
let mut previous : uint = get_ticks();
loop {
current = get_ticks();
elapsed = current - previous;
previous = current;
lag += elapsed;
match poll_event() {
Event::Quit(_) => break,
Event::KeyDown(_, _, key, _, _, _) => {
if key == sdl2::keycode::KeyCode::Escape {
break;
} else if key == sdl2::keycode::KeyCode::Right {
player.vel_x = 4.0;
} else if key == sdl2::keycode::KeyCode::Left {
player.vel_x = -4.0;
} else if key == sdl2::keycode::KeyCode::Up {
if on_ground {
player.vel_y = -8.0;
on_ground = false;
}
}
},
Event::KeyUp(_, _, key, _, _, _) => {
if key == sdl2::keycode::KeyCode::Right {
player.vel_x = 0.0;
} else if key == sdl2::keycode::KeyCode::Left {
player.vel_x = 0.0;
} else if key == sdl2::keycode::KeyCode::Up {
if player.vel_y < -4.0 {
player.vel_y = -4.0;
}
}
},
_ => (),
}
while lag >= MS_PER_UPDATE {
player.update();
if player.y > 290.0 {
player.y = 290.0;
player.vel_y = 0.0;
on_ground = true;
}
lag -= MS_PER_UPDATE;
}
let _ = renderer.set_draw_color(sdl2::pixels::Color::RGB(0, 0, 0));
let _ = renderer.clear();
player.render(&renderer);
renderer.present();
}
sdl2::quit();
}