Fix forward colliders
This commit is contained in:
parent
22b93a02cf
commit
35f41d3e51
@ -25,7 +25,13 @@ pub fn modify_player_based_on_forces(
|
|||||||
let predicted_player_position = player.position + player.velocity;
|
let predicted_player_position = player.position + player.velocity;
|
||||||
|
|
||||||
// Calculate a bounding rect around the player both now, and one frame in the future
|
// Calculate a bounding rect around the player both now, and one frame in the future
|
||||||
let player_rect = Rectangle::new(
|
let mut player_rect = Rectangle::new(
|
||||||
|
predicted_player_position.x - (player.size.x / 2.0),
|
||||||
|
predicted_player_position.y - (player.size.x / 2.0),
|
||||||
|
player.size.x,
|
||||||
|
player.size.y,
|
||||||
|
);
|
||||||
|
let predicted_player_rect = Rectangle::new(
|
||||||
predicted_player_position.x - (player.size.x / 2.0),
|
predicted_player_position.x - (player.size.x / 2.0),
|
||||||
predicted_player_position.y - (player.size.x / 2.0),
|
predicted_player_position.y - (player.size.x / 2.0),
|
||||||
player.size.x,
|
player.size.x,
|
||||||
@ -39,6 +45,7 @@ pub fn modify_player_based_on_forces(
|
|||||||
translated_rect.y += level_height_offset;
|
translated_rect.y += level_height_offset;
|
||||||
translated_rect.x += WORLD_LEVEL_X_OFFSET;
|
translated_rect.x += WORLD_LEVEL_X_OFFSET;
|
||||||
translated_rect.check_collision_recs(&player_rect)
|
translated_rect.check_collision_recs(&player_rect)
|
||||||
|
|| translated_rect.check_collision_recs(&predicted_player_rect)
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
let check_player_colliding_with_colliders_forwards = || {
|
let check_player_colliding_with_colliders_forwards = || {
|
||||||
@ -46,9 +53,9 @@ pub fn modify_player_based_on_forces(
|
|||||||
let mut translated_rect = rect.clone();
|
let mut translated_rect = rect.clone();
|
||||||
translated_rect.y += level_height_offset;
|
translated_rect.y += level_height_offset;
|
||||||
translated_rect.x += WORLD_LEVEL_X_OFFSET;
|
translated_rect.x += WORLD_LEVEL_X_OFFSET;
|
||||||
translated_rect.check_collision_recs(&Rectangle{
|
translated_rect.check_collision_recs(&Rectangle {
|
||||||
x: player_rect.x + 1.0,
|
x: player_rect.x + 1.0,
|
||||||
y: player_rect.y - 1.0 ,
|
y: player_rect.y - 1.0,
|
||||||
width: player_rect.width,
|
width: player_rect.width,
|
||||||
height: player_rect.height,
|
height: player_rect.height,
|
||||||
})
|
})
|
||||||
@ -56,9 +63,9 @@ pub fn modify_player_based_on_forces(
|
|||||||
};
|
};
|
||||||
|
|
||||||
// If the player is colliding, only apply the x force
|
// If the player is colliding, only apply the x force
|
||||||
if (
|
if player.velocity.y != 0.0
|
||||||
check_player_colliding_with_colliders() || check_player_colliding_with_colliders_forwards())
|
&& (check_player_colliding_with_colliders()
|
||||||
&& player.velocity.y != 0.0
|
|| check_player_colliding_with_colliders_forwards())
|
||||||
{
|
{
|
||||||
player.velocity.y = 0.0;
|
player.velocity.y = 0.0;
|
||||||
|
|
||||||
@ -73,14 +80,25 @@ pub fn modify_player_based_on_forces(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check sideways collisions
|
|
||||||
if player.velocity.y == 0.0 && check_player_colliding_with_colliders_forwards(){
|
|
||||||
return Err(());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finally apply the velocity to the player
|
// Finally apply the velocity to the player
|
||||||
player.position += player.velocity;
|
player.position += player.velocity;
|
||||||
|
|
||||||
|
// Re-calculate the player rect
|
||||||
|
player_rect = Rectangle::new(
|
||||||
|
player.position.x - (player.size.x / 2.0),
|
||||||
|
player.position.y - (player.size.x / 2.0),
|
||||||
|
player.size.x,
|
||||||
|
player.size.y,
|
||||||
|
);
|
||||||
|
|
||||||
|
if colliders.iter().any(|rect| {
|
||||||
|
let mut translated_rect = rect.clone();
|
||||||
|
translated_rect.y += level_height_offset;
|
||||||
|
translated_rect.x += WORLD_LEVEL_X_OFFSET;
|
||||||
|
translated_rect.check_collision_recs(&player_rect)
|
||||||
|
}) {
|
||||||
|
return Err(());
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user