for_each_intersecting gives a rect

This commit is contained in:
2015-01-06 15:35:34 +01:00
parent 9623439ca7
commit 62c74a0736
2 changed files with 34 additions and 32 deletions

View File

@@ -28,10 +28,10 @@ const TILE_HEIGHT : i32 = 32;
const MS_PER_UPDATE : uint = 10; const MS_PER_UPDATE : uint = 10;
#[derive(Clone, Show)] #[derive(Clone)]
enum Tile { enum Tile {
Empty, Empty,
Floor Floor(Color)
} }
@@ -71,15 +71,15 @@ fn main() {
Err(err) => panic!("failed to create renderer: {}", err) Err(err) => panic!("failed to create renderer: {}", err)
}; };
let camera = Camera::new(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); let mut camera = Camera::new(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
let mut layer = Layer::new(30, 20, TILE_WIDTH, TILE_HEIGHT, Tile::Empty); let mut layer = Layer::new(120, 20, TILE_WIDTH, TILE_HEIGHT, Tile::Empty);
for x in range(0, 14) { camera.x = 16;
layer.set_tile(x, 14, Tile::Floor);
}
for x in range(17, 30) { let colors = vec![Color::RGB(0, 0, 255), Color::RGB(0, 128, 255)];
layer.set_tile(x, 13, Tile::Floor);
for x in range(0, 120) {
layer.set_tile(x, 14, Tile::Floor(colors[(x % 2) as uint]));
} }
let mut player = Player::new(290.0, 390.0); let mut player = Player::new(290.0, 390.0);
@@ -97,7 +97,7 @@ fn main() {
match poll_event() { match poll_event() {
Event::Quit(_) => break, Event::Quit(_) => break,
Event::KeyDown(_, _, key, _, _, _) => { Event::KeyDown(_, _, key, _, _, repeat) => {
if key == KeyCode::Escape { if key == KeyCode::Escape {
break; break;
} else if key == KeyCode::Right { } else if key == KeyCode::Right {
@@ -105,7 +105,7 @@ fn main() {
} else if key == KeyCode::Left { } else if key == KeyCode::Left {
player.velocity.x = -4.0; player.velocity.x = -4.0;
} else if key == KeyCode::Up { } else if key == KeyCode::Up {
if player.on_ground { if player.on_ground && repeat == false {
player.velocity.y = -12.0; player.velocity.y = -12.0;
player.on_ground = false; player.on_ground = false;
@@ -113,10 +113,14 @@ fn main() {
} }
}, },
Event::KeyUp(_, _, key, _, _, _) => { Event::KeyUp(_, _, key, _, _, _) => {
if key == KeyCode::Right && player.velocity.x > 0.0 { if key == KeyCode::Right {
if player.velocity.x > 0.0 {
player.velocity.x = 0.0; player.velocity.x = 0.0;
} else if key == KeyCode::Left && player.velocity.x < 0.0 { }
} else if key == KeyCode::Left {
if player.velocity.x < 0.0 {
player.velocity.x = 0.0; player.velocity.x = 0.0;
}
} else if key == KeyCode::Up { } else if key == KeyCode::Up {
if player.velocity.y < -6.0 { if player.velocity.y < -6.0 {
player.velocity.y = -6.0; player.velocity.y = -6.0;
@@ -129,14 +133,12 @@ fn main() {
while lag >= MS_PER_UPDATE { while lag >= MS_PER_UPDATE {
player.update(); player.update();
layer.for_each_intersecting(&player.get_rect(), |tile: &Tile, x: i32, y: i32| { layer.for_each_intersecting(&player.get_rect(), |tile: &Tile, position: &Rect| {
match *tile { match *tile {
Tile::Empty => (), Tile::Empty => (),
Tile::Floor => { Tile::Floor(_) => {
let object = Rect::new(x, y, TILE_WIDTH, TILE_HEIGHT); if collision_detection(position, &player.get_rect()) {
let intersect = collision_intersect(position, &player.get_rect());
if collision_detection(&object, &player.get_rect()) {
let intersect = collision_intersect(&object, &player.get_rect());
if intersect.w >= intersect.h { if intersect.w >= intersect.h {
if player.velocity.y < 0.0 { if player.velocity.y < 0.0 {
@@ -169,13 +171,11 @@ fn main() {
ground.y += ground.h; ground.y += ground.h;
ground.h = 1; ground.h = 1;
layer.for_each_intersecting(&ground, |tile: &Tile, x: i32, y: i32| { layer.for_each_intersecting(&ground, |tile: &Tile, position: &Rect| {
match *tile { match *tile {
Tile::Empty => (), Tile::Empty => (),
Tile::Floor => { Tile::Floor(_) => {
let object = Rect::new(x, y, TILE_WIDTH, TILE_HEIGHT); if collision_detection(position, &ground) {
if collision_detection(&object, &ground) {
player.on_ground = true; player.on_ground = true;
} }
} }
@@ -188,12 +188,12 @@ fn main() {
let _ = renderer.set_draw_color(Color::RGB(0, 0, 0)); let _ = renderer.set_draw_color(Color::RGB(0, 0, 0));
let _ = renderer.clear(); let _ = renderer.clear();
layer.for_each_intersecting(&camera.get_rect(), |tile: &Tile, x: i32, y: i32| { layer.for_each_intersecting(&camera.get_rect(), |tile: &Tile, position: &Rect| {
match *tile { match *tile {
Tile::Empty => (), Tile::Empty => (),
Tile::Floor => { Tile::Floor(c) => {
let _ = renderer.set_draw_color(Color::RGB(0, 0, 255)); let _ = renderer.set_draw_color(c);
let _ = renderer.fill_rect(&Rect::new(x, y, TILE_WIDTH, TILE_HEIGHT)); let _ = renderer.fill_rect(position);
} }
} }
}); });

View File

@@ -44,7 +44,7 @@ impl<T> Layer<T> where T: Clone {
Rect::new(x1, y1, x2 - x1, y2 - y1) Rect::new(x1, y1, x2 - x1, y2 - y1)
} }
pub fn for_each_intersecting<F>(&self, rect: &Rect, mut f: F) where F: FnMut(&T, i32, i32) { pub fn for_each_intersecting<F>(&self, rect: &Rect, mut f: F) where F: FnMut(&T, &Rect) {
let intersect = self.get_intersecting(rect); let intersect = self.get_intersecting(rect);
if intersect.x < 0 || intersect.x + intersect.w > self.width { if intersect.x < 0 || intersect.x + intersect.w > self.width {
@@ -56,7 +56,9 @@ impl<T> Layer<T> where T: Clone {
for y in range(intersect.y, intersect.y + intersect.h + 1) { for y in range(intersect.y, intersect.y + intersect.h + 1) {
for x in range(intersect.x, intersect.x + intersect.w + 1) { for x in range(intersect.x, intersect.x + intersect.w + 1) {
f(self.get_tile(x, y), x * self.tile_width, y * 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), &position);
} }
} }
} }