forked from dimforge/bevy_rapier
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathplayer_movement2.rs
74 lines (65 loc) · 2.54 KB
/
player_movement2.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
use bevy::{prelude::*, window::WindowResolution};
use bevy_rapier2d::prelude::*;
fn main() {
App::new()
.add_plugins((
DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window {
resolution: WindowResolution::new(1000., 1000.),
title: "Player Movement Example".to_string(),
..default()
}),
..default()
}),
RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(100.0),
RapierDebugRenderPlugin::default(),
))
.add_systems(Startup, spawn_player)
.add_systems(Update, player_movement)
.run();
}
// The float value is the player movement speed in 'pixels/second'.
#[derive(Component)]
pub struct Player(f32);
pub fn spawn_player(mut commands: Commands, mut rapier_config: Query<&mut RapierConfiguration>) {
let mut rapier_config = rapier_config.single_mut();
// Set gravity to 0.0 and spawn camera.
rapier_config.gravity = Vec2::ZERO;
commands.spawn(Camera2dBundle::default());
let sprite_size = 100.0;
// Spawn entity with `Player` struct as a component for access in movement query.
commands.spawn((
SpriteBundle {
sprite: Sprite {
color: Color::srgb(0.0, 0.0, 0.0),
custom_size: Some(Vec2::new(sprite_size, sprite_size)),
..Default::default()
},
..Default::default()
},
RigidBody::Dynamic,
Velocity::zero(),
Collider::ball(sprite_size / 2.0),
Player(100.0),
));
}
pub fn player_movement(
keyboard_input: Res<ButtonInput<KeyCode>>,
mut player_info: Query<(&Player, &mut Velocity)>,
) {
for (player, mut rb_vels) in &mut player_info {
let up = keyboard_input.any_pressed([KeyCode::KeyW, KeyCode::ArrowUp]);
let down = keyboard_input.any_pressed([KeyCode::KeyS, KeyCode::ArrowDown]);
let left = keyboard_input.any_pressed([KeyCode::KeyA, KeyCode::ArrowLeft]);
let right = keyboard_input.any_pressed([KeyCode::KeyD, KeyCode::ArrowRight]);
let x_axis = -(left as i8) + right as i8;
let y_axis = -(down as i8) + up as i8;
let mut move_delta = Vec2::new(x_axis as f32, y_axis as f32);
if move_delta != Vec2::ZERO {
move_delta /= move_delta.length();
}
// Update the velocity on the rigid_body_component,
// the bevy_rapier plugin will update the Sprite transform.
rb_vels.linvel = move_delta * player.0;
}
}