Guest User

First person controller

a guest
Nov 18th, 2023
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.47 KB | Source Code | 0 0
  1. use bevy::input::mouse::MouseMotion;
  2. use bevy::prelude::*;
  3. use bevy::window::CursorGrabMode;
  4.  
  5. #[derive(Component)]
  6. struct Player;
  7.  
  8. #[derive(Component)]
  9. struct CameraSpeed(f32);
  10.  
  11. fn main() {
  12.     App::new()
  13.         .insert_resource(Msaa::Sample4)
  14.         .add_plugins(DefaultPlugins.set(WindowPlugin {
  15.             primary_window: Some(Window {
  16.                 title: "Zombie Mayhem".into(),
  17.                 mode: bevy::window::WindowMode::Fullscreen,
  18.                 ..Default::default()
  19.             }),
  20.             ..Default::default()
  21.         }))
  22.         .add_systems(Startup, setup)
  23.         .add_systems(Update, (cursor_grab_system, look_y))
  24.         .run();
  25. }
  26.  
  27. fn setup(
  28.     mut commands: Commands,
  29.     mut meshes: ResMut<Assets<Mesh>>,
  30.     mut materials: ResMut<Assets<StandardMaterial>>,
  31. ) {
  32.     //floor
  33.     commands.spawn(PbrBundle {
  34.         mesh: meshes.add(Mesh::from(shape::Plane::from_size(16.0))),
  35.         material: materials.add(Color::rgb(1., 0.9, 0.9).into()),
  36.         transform: Transform::from_xyz(0., 0., 0.),
  37.         ..Default::default()
  38.     });
  39.     //Cube
  40.     commands.spawn(PbrBundle {
  41.         mesh: meshes.add(Mesh::from(shape::Cube::new(1.))),
  42.         material: materials.add(Color::rgb(1., 0.9, 0.9).into()),
  43.         transform: Transform::from_xyz(0., 2., -10.),
  44.         ..Default::default()
  45.     });
  46.     // light
  47.     commands.spawn(PointLightBundle {
  48.         point_light: PointLight {
  49.             intensity: 1500.0,
  50.             shadows_enabled: true,
  51.             ..default()
  52.         },
  53.         transform: Transform::from_xyz(4.0, 8.0, 4.0),
  54.         ..default()
  55.     });
  56.  
  57.     // Player
  58.     commands
  59.         .spawn((Player, Transform::from_xyz(0., 0., 0.)))
  60.         .with_children(|parent| {
  61.             parent
  62.                 .spawn(Camera3dBundle {
  63.                     transform: Transform::from_xyz(0., 4., 0.0),
  64.                     ..Default::default()
  65.                 })
  66.                 .insert(CameraSpeed(4.));
  67.         });
  68. }
  69.  
  70. fn cursor_grab_system(
  71.     mut windows: Query<&mut Window>,
  72.     btn: Res<Input<MouseButton>>,
  73.     key: Res<Input<KeyCode>>,
  74. ) {
  75.     for mut window in &mut windows {
  76.         if btn.just_pressed(MouseButton::Left) {
  77.             // if you want to use the cursor, but not let it leave the window,
  78.             // use `Confined` mode:
  79.             window.cursor.grab_mode = CursorGrabMode::Confined;
  80.  
  81.             // also hide the cursor
  82.             window.cursor.visible = false;
  83.         }
  84.         if key.just_pressed(KeyCode::Escape) {
  85.             window.cursor.grab_mode = CursorGrabMode::None;
  86.             window.cursor.visible = true;
  87.         }
  88.     }
  89. }
  90.  
  91. fn look_y(
  92.     mut cam_query: Query<(&mut Transform, &CameraSpeed, &Parent), With<Camera3d>>,
  93.     mut player_query: Query<&mut Transform, Without<Camera3d>>,
  94.     windows: Query<&Window>,
  95.     mut mouse_event: EventReader<MouseMotion>,
  96.     time: Res<Time>,
  97. ) {
  98.     for (mut cam, spd, parent) in &mut cam_query {
  99.         let mut player = player_query.get_mut(parent.get()).unwrap();
  100.         for window in &windows {
  101.             if !window.cursor.visible {
  102.                 for event in mouse_event.read() {
  103.                     println!("X:{} Y:{}", event.delta.x, event.delta.y);
  104.                     // Rotate by mouse movement
  105.                     player.rotate_y(-event.delta.x * spd.0 * time.delta_seconds());
  106.                     cam.rotate_x(-event.delta.y * spd.0 * time.delta_seconds());
  107.                 }
  108.             }
  109.         }
  110.     }
  111. }
  112.  
Advertisement
Add Comment
Please, Sign In to add comment