-
-
Notifications
You must be signed in to change notification settings - Fork 250
/
player_movement2.rs
71 lines (62 loc) · 2.38 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
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()
}))
.add_startup_system(spawn_player)
.add_system(player_movement)
.add_plugin(RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(100.0))
.add_plugin(RapierDebugRenderPlugin::default())
.run();
}
// The float value is the player movement speed in 'pixels/second'.
#[derive(Component)]
struct Player(f32);
fn spawn_player(mut commands: Commands, mut rapier_config: ResMut<RapierConfiguration>) {
// 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::rgb(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),
));
}
fn player_movement(
keyboard_input: Res<Input<KeyCode>>,
mut player_info: Query<(&Player, &mut Velocity)>,
) {
for (player, mut rb_vels) in &mut player_info {
let up = keyboard_input.any_pressed([KeyCode::W, KeyCode::Up]);
let down = keyboard_input.any_pressed([KeyCode::S, KeyCode::Down]);
let left = keyboard_input.any_pressed([KeyCode::A, KeyCode::Left]);
let right = keyboard_input.any_pressed([KeyCode::D, KeyCode::Right]);
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;
}
}