It's alive!
This commit is contained in:
71
src/main.rs
71
src/main.rs
@@ -3,6 +3,7 @@ extern crate sdl2_image;
|
|||||||
|
|
||||||
|
|
||||||
use std::num::Float;
|
use std::num::Float;
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
use sdl2::video::{Window, WindowPos, OPENGL};
|
use sdl2::video::{Window, WindowPos, OPENGL};
|
||||||
use sdl2::timer::{get_ticks, delay};
|
use sdl2::timer::{get_ticks, delay};
|
||||||
@@ -30,7 +31,7 @@ const SCREEN_HEIGHT : i32 = 640;
|
|||||||
const TILE_WIDTH : i32 = 32;
|
const TILE_WIDTH : i32 = 32;
|
||||||
const TILE_HEIGHT : i32 = 32;
|
const TILE_HEIGHT : i32 = 32;
|
||||||
|
|
||||||
const MS_PER_UPDATE : usize = 10;
|
const MS_PER_UPDATE : u32 = 10;
|
||||||
|
|
||||||
const PLAYER_SPEED_X : f32 = 4.0;
|
const PLAYER_SPEED_X : f32 = 4.0;
|
||||||
const PLAYER_THRESHOLD_X : f32 = 0.2;
|
const PLAYER_THRESHOLD_X : f32 = 0.2;
|
||||||
@@ -51,10 +52,11 @@ enum Tile<'a> {
|
|||||||
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
sdl2::init(sdl2::INIT_EVERYTHING);
|
let sdl_context = sdl2::init(sdl2::INIT_EVERYTHING).unwrap();
|
||||||
|
|
||||||
sdl2_image::init(sdl2_image::INIT_PNG);
|
sdl2_image::init(sdl2_image::INIT_PNG);
|
||||||
|
|
||||||
let window = match Window::new("Super Matte Bros", WindowPos::PosCentered, WindowPos::PosCentered, SCREEN_WIDTH as isize, SCREEN_HEIGHT as isize, OPENGL) {
|
let window = match Window::new("Super Matte Bros", WindowPos::PosCentered, WindowPos::PosCentered, SCREEN_WIDTH, SCREEN_HEIGHT, OPENGL) {
|
||||||
Ok(window) => window,
|
Ok(window) => window,
|
||||||
Err(err) => panic!("failed to create window: {}", err)
|
Err(err) => panic!("failed to create window: {}", err)
|
||||||
};
|
};
|
||||||
@@ -190,7 +192,7 @@ fn main() {
|
|||||||
layer.set_tile(52, 17, Tile::Background(Rect::new(16 * 10, 16 * 8, 16, 16)));
|
layer.set_tile(52, 17, Tile::Background(Rect::new(16 * 10, 16 * 8, 16, 16)));
|
||||||
|
|
||||||
|
|
||||||
for x in range(0, 212) {
|
for x in 0..212 {
|
||||||
layer.set_tile(x, 18, Tile::Static(&floor_sprite, true));
|
layer.set_tile(x, 18, Tile::Static(&floor_sprite, true));
|
||||||
layer.set_tile(x, 19, Tile::Static(&floor_sprite, true));
|
layer.set_tile(x, 19, Tile::Static(&floor_sprite, true));
|
||||||
}
|
}
|
||||||
@@ -200,11 +202,12 @@ fn main() {
|
|||||||
|
|
||||||
let mut player = Player::new(390.0, 390.0);
|
let mut player = Player::new(390.0, 390.0);
|
||||||
|
|
||||||
let mut current : usize;
|
let mut current : u32;
|
||||||
let mut elapsed : usize;
|
let mut elapsed : u32;
|
||||||
let mut previous : usize = get_ticks();
|
let mut previous : u32 = get_ticks();
|
||||||
let mut lag : usize = 0;
|
let mut lag : u32 = 0;
|
||||||
|
|
||||||
|
let mut drawer = renderer.drawer();
|
||||||
let mut event_pump = sdl_context.event_pump();
|
let mut event_pump = sdl_context.event_pump();
|
||||||
|
|
||||||
'main : loop {
|
'main : loop {
|
||||||
@@ -215,23 +218,20 @@ fn main() {
|
|||||||
|
|
||||||
keyboard.clear();
|
keyboard.clear();
|
||||||
|
|
||||||
'event : loop {
|
for event in event_pump.poll_iter() {
|
||||||
for event in event_pump.poll_iter() {
|
use sdl2::event::Event;
|
||||||
use sdl2::event::Event;
|
|
||||||
|
|
||||||
match event {
|
match event {
|
||||||
Event::Quit(_) => break 'main,
|
Event::Quit {..} => break 'main,
|
||||||
Event::KeyDown(_, _, key, _, _, repeat) => {
|
Event::KeyDown {keycode, repeat, ..} => {
|
||||||
if repeat == false {
|
if repeat == false {
|
||||||
keyboard.key_down(key);
|
keyboard.key_down(keycode);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Event::KeyUp(_, _, key, _, _, _) => {
|
Event::KeyUp {keycode, ..} => {
|
||||||
keyboard.key_up(key);
|
keyboard.key_up(keycode);
|
||||||
},
|
},
|
||||||
Event::None => break 'event,
|
_ => (),
|
||||||
_ => (),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,7 +287,7 @@ fn main() {
|
|||||||
let p = player.x + player.w as f32;
|
let p = player.x + player.w as f32;
|
||||||
let mut d = player.dx;
|
let mut d = player.dx;
|
||||||
|
|
||||||
for y in range(intersect.y, intersect.y + intersect.h + 1) {
|
for y in intersect.y..intersect.y + intersect.h + 1 {
|
||||||
let mut x = intersect.x;
|
let mut x = intersect.x;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
@@ -323,7 +323,7 @@ fn main() {
|
|||||||
let p = player.x;
|
let p = player.x;
|
||||||
let mut d = player.dx;
|
let mut d = player.dx;
|
||||||
|
|
||||||
for y in range(intersect.y, intersect.y + intersect.h + 1) {
|
for y in intersect.y..intersect.y + intersect.h + 1 {
|
||||||
let mut x = intersect.x;
|
let mut x = intersect.x;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
@@ -361,7 +361,7 @@ fn main() {
|
|||||||
let p = player.y + player.h as f32;
|
let p = player.y + player.h as f32;
|
||||||
let mut d = player.dy;
|
let mut d = player.dy;
|
||||||
|
|
||||||
for x in range(intersect.x, intersect.x + intersect.w + 1) {
|
for x in intersect.x..intersect.x + intersect.w + 1 {
|
||||||
let mut y = intersect.y;
|
let mut y = intersect.y;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
@@ -401,7 +401,7 @@ fn main() {
|
|||||||
let p = player.y;
|
let p = player.y;
|
||||||
let mut d = player.dy;
|
let mut d = player.dy;
|
||||||
|
|
||||||
for x in range(intersect.x, intersect.x + intersect.w + 1) {
|
for x in intersect.x..intersect.x + intersect.w + 1 {
|
||||||
let mut y = intersect.y;
|
let mut y = intersect.y;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
@@ -443,35 +443,34 @@ fn main() {
|
|||||||
lag -= MS_PER_UPDATE;
|
lag -= MS_PER_UPDATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
let _ = renderer.set_draw_color(Color::RGB(93, 148, 251));
|
drawer.set_draw_color(Color::RGB(93, 148, 251));
|
||||||
let _ = renderer.clear();
|
drawer.clear();
|
||||||
|
|
||||||
layer.for_each_intersecting(&camera.to_rect(), |tile: &Tile, position: &Rect| {
|
layer.for_each_intersecting(&camera.to_rect(), |tile: &Tile, position: &Rect| {
|
||||||
let object = camera_relative_rect(&camera.to_rect(), position);
|
let object = camera_relative_rect(&camera.to_rect(), position);
|
||||||
|
|
||||||
match *tile {
|
match *tile {
|
||||||
Tile::Background(src) => {
|
Tile::Background(src) => {
|
||||||
let _ = renderer.copy(&world_sprites, Some(src), Some(object));
|
let _ = drawer.copy(&world_sprites, Some(src), Some(object));
|
||||||
},
|
},
|
||||||
Tile::Floor(src) => {
|
Tile::Floor(src) => {
|
||||||
let _ = renderer.copy(&world_sprites, Some(src), Some(object));
|
let _ = drawer.copy(&world_sprites, Some(src), Some(object));
|
||||||
},
|
},
|
||||||
Tile::Static(ref sprite, _) => sprite.render(&renderer, &object),
|
Tile::Static(ref sprite, _) => sprite.render(&mut drawer, &object),
|
||||||
_ => ()
|
_ => ()
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let player_rect = camera_relative_rect(&camera.to_rect(), &player.to_rect());
|
let player_rect = camera_relative_rect(&camera.to_rect(), &player.to_rect());
|
||||||
|
|
||||||
player_sprite.render(&renderer, &player_rect);
|
player_sprite.render(&mut drawer, &player_rect);
|
||||||
|
|
||||||
renderer.present();
|
drawer.present();
|
||||||
|
|
||||||
delay(5);
|
delay(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
sdl2_image::quit();
|
sdl2_image::quit();
|
||||||
sdl2::quit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn camera_relative_rect(camera: &Rect, other: &Rect) -> Rect {
|
fn camera_relative_rect(camera: &Rect, other: &Rect) -> Rect {
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
use sdl2::render::{Texture, Renderer};
|
use sdl2::render::{Texture, RenderDrawer};
|
||||||
use sdl2::rect::Rect;
|
use sdl2::rect::Rect;
|
||||||
|
|
||||||
|
|
||||||
pub trait Sprite {
|
pub trait Sprite {
|
||||||
fn update(&mut self, usize) {}
|
fn update(&mut self, u32) {}
|
||||||
fn render(&self, &Renderer, &Rect);
|
fn render(&self, &mut RenderDrawer, &Rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub struct StaticSprite<'a> {
|
pub struct StaticSprite<'a> {
|
||||||
texture: &'a Texture,
|
texture: &'a Texture<'a>,
|
||||||
x: i32,
|
x: i32,
|
||||||
y: i32
|
y: i32
|
||||||
}
|
}
|
||||||
@@ -25,20 +25,20 @@ impl<'a> StaticSprite<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Sprite for StaticSprite<'a> {
|
impl<'a> Sprite for StaticSprite<'a> {
|
||||||
fn render(&self, renderer: &Renderer, destination: &Rect) {
|
fn render(&self, drawer: &mut RenderDrawer, destination: &Rect) {
|
||||||
let _ = renderer.copy(self.texture, Some(Rect::new(self.x, self.y, 16, 16)), Some(*destination));
|
drawer.copy(self.texture, Some(Rect::new(self.x, self.y, 16, 16)), Some(*destination));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub struct AnimatedSprite<'a> {
|
pub struct AnimatedSprite<'a> {
|
||||||
texture: &'a Texture,
|
texture: &'a Texture<'a>,
|
||||||
x: i32,
|
x: i32,
|
||||||
y: i32,
|
y: i32,
|
||||||
frame: i32,
|
frame: i32,
|
||||||
frames: i32,
|
frames: i32,
|
||||||
time: usize,
|
time: u32,
|
||||||
frame_time: usize
|
frame_time: u32
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> AnimatedSprite<'a> {
|
impl<'a> AnimatedSprite<'a> {
|
||||||
@@ -50,13 +50,13 @@ impl<'a> AnimatedSprite<'a> {
|
|||||||
frame: 0,
|
frame: 0,
|
||||||
frames: frames,
|
frames: frames,
|
||||||
time: 0,
|
time: 0,
|
||||||
frame_time: 1000 / fps as usize
|
frame_time: 1000 / fps as u32
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Sprite for AnimatedSprite<'a> {
|
impl<'a> Sprite for AnimatedSprite<'a> {
|
||||||
fn update(&mut self, elapsed: usize) {
|
fn update(&mut self, elapsed: u32) {
|
||||||
self.time += elapsed;
|
self.time += elapsed;
|
||||||
|
|
||||||
if self.time > self.frame_time {
|
if self.time > self.frame_time {
|
||||||
@@ -73,7 +73,7 @@ impl<'a> Sprite for AnimatedSprite<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render(&self, renderer: &Renderer, destination: &Rect) {
|
fn render(&self, drawer: &mut RenderDrawer, destination: &Rect) {
|
||||||
let _ = renderer.copy(self.texture, Some(Rect::new(self.x, self.y, 16, 16)), Some(*destination));
|
drawer.copy(self.texture, Some(Rect::new(self.x, self.y, 16, 16)), Some(*destination));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,8 +58,8 @@ impl<T> Layer<T> where T: Clone {
|
|||||||
|
|
||||||
pub fn for_each_intersecting<F: FnMut(&T, &Rect)>(&self, rect: &Rect, mut f: F) {
|
pub fn for_each_intersecting<F: FnMut(&T, &Rect)>(&self, rect: &Rect, mut f: F) {
|
||||||
if let Some(intersect) = self.find_intersecting(rect) {
|
if let Some(intersect) = self.find_intersecting(rect) {
|
||||||
for y in range(intersect.y, intersect.y + intersect.h + 1) {
|
for y in intersect.y..intersect.y + intersect.h + 1 {
|
||||||
for x in range(intersect.x, intersect.x + intersect.w + 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);
|
let position = Rect::new(x * self.tile_width, y * self.tile_height, self.tile_width, self.tile_height);
|
||||||
|
|
||||||
f(self.get_tile(x, y).unwrap(), &position);
|
f(self.get_tile(x, y).unwrap(), &position);
|
||||||
|
|||||||
Reference in New Issue
Block a user