Merge pull request #34 from Ewpratten/better_physics

Better physics
This commit is contained in:
Evan Pratten 2021-10-02 17:48:55 -07:00 committed by GitHub
commit ab2e64c111
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 15 deletions

View File

@ -44,6 +44,19 @@ pub fn modify_player_based_on_forces(
translated_rect.check_collision_recs(&player_rect)
})
};
let check_player_colliding_with_colliders_forwards = || {
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(&Rectangle{
x: player_rect.x + 1.0,
y: player_rect.y - 1.0 ,
width: player_rect.width,
height: player_rect.height,
})
})
};
// If the player is colliding, only apply the x force
if (check_player_colliding_with_floor()
@ -66,7 +79,7 @@ pub fn modify_player_based_on_forces(
}
// Check sideways collisions
if player.velocity.y == 0.0 && check_player_colliding_with_colliders(){
if player.velocity.y == 0.0 && check_player_colliding_with_colliders_forwards(){
return Err(());
}

View File

@ -40,7 +40,7 @@ impl MainCharacter {
movement_force: Vector2::zero(),
velocity: Vector2::zero(),
base_velocity: Vector2::new(0.0, GRAVITY_PPS),
size: Vector2::new(80.0, 100.0),
size: Vector2::new(60.0, 100.0),
sprite_sheet: AnimatedSpriteSheet::new(
sprite_sheet,
Vector2::new(300.0, 300.0),
@ -69,8 +69,8 @@ impl MainCharacter {
// Handle extra external forces based on the character state
self.movement_force = match state {
CharacterState::Running => Vector2::new(12.0, 0.0),
CharacterState::Jumping => Vector2::new(12.0, -30.0),
CharacterState::Running => Vector2::new(10.0, 0.0),
CharacterState::Jumping => Vector2::new(10.0, -30.0),
CharacterState::Dashing => Vector2::new(30.0, -20.0),
};
}

View File

@ -33,13 +33,15 @@ pub fn render_character_in_camera_space(
);
player.sprite_sheet.render(
raylib,
player.position.sub(player.size.div(2.0)),
player
.position
.sub(Vector2::new(player.size.y, player.size.y).div(4.0)),
Some(Vector2::new(player.size.y, player.size.y)),
Some(frame_id),
);
// Possibly render a debug vector
if config.debug_view {
// if config.debug_view {
raylib.draw_line_v(
player.position.sub(player.size.div(2.0)),
player
@ -48,5 +50,15 @@ pub fn render_character_in_camera_space(
.add(player.velocity.mul(10.0).add(Vector2::new(0.0, 100.0))),
Color::RED,
);
}
raylib.draw_rectangle_lines_ex(
Rectangle::new(
player.position.x - (player.size.x / 2.0),
player.position.y - (player.size.x / 2.0),
player.size.x,
player.size.y,
),
2,
Color::RED,
);
// }
}