Better first person controls
This commit is contained in:
parent
83065cedf2
commit
c5b04aef9d
@ -11,6 +11,7 @@ use glium::glutin::{
|
|||||||
MouseScrollDelta,
|
MouseScrollDelta,
|
||||||
KeyboardInput,
|
KeyboardInput,
|
||||||
VirtualKeyCode,
|
VirtualKeyCode,
|
||||||
|
MouseCursor,
|
||||||
};
|
};
|
||||||
|
|
||||||
use math::vector::{Vector2, Vector3};
|
use math::vector::{Vector2, Vector3};
|
||||||
@ -181,6 +182,9 @@ pub struct FirstPersonControls {
|
|||||||
/// Vector indicating the direction of the camera.
|
/// Vector indicating the direction of the camera.
|
||||||
forward: Vector3<f32>,
|
forward: Vector3<f32>,
|
||||||
|
|
||||||
|
/// Vector indicating the left of the camera.
|
||||||
|
left: Vector3<f32>,
|
||||||
|
|
||||||
/// Speed of the camera.
|
/// Speed of the camera.
|
||||||
speed: f32,
|
speed: f32,
|
||||||
|
|
||||||
@ -192,6 +196,15 @@ pub struct FirstPersonControls {
|
|||||||
|
|
||||||
/// Wether the backward button is pressed or not.
|
/// Wether the backward button is pressed or not.
|
||||||
backward_pressed: bool,
|
backward_pressed: bool,
|
||||||
|
|
||||||
|
/// Wether the left button is pressed or not.
|
||||||
|
left_pressed: bool,
|
||||||
|
|
||||||
|
/// Wether the right button is pressed or not.
|
||||||
|
right_pressed: bool,
|
||||||
|
|
||||||
|
/// Wether the boost is active or not.
|
||||||
|
boost: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FirstPersonControls {
|
impl FirstPersonControls {
|
||||||
@ -202,9 +215,13 @@ impl FirstPersonControls {
|
|||||||
phi: 0.0,
|
phi: 0.0,
|
||||||
position: Vector3::new(0.0, 0.0, 0.0),
|
position: Vector3::new(0.0, 0.0, 0.0),
|
||||||
forward: Vector3::new(0.0, 0.0, 1.0),
|
forward: Vector3::new(0.0, 0.0, 1.0),
|
||||||
|
left: Vector3::new(1.0, 0.0, 0.0),
|
||||||
speed: 0.001,
|
speed: 0.001,
|
||||||
forward_pressed: false,
|
forward_pressed: false,
|
||||||
backward_pressed: false,
|
backward_pressed: false,
|
||||||
|
left_pressed: false,
|
||||||
|
right_pressed: false,
|
||||||
|
boost: false,
|
||||||
sensitivity: 500.0,
|
sensitivity: 500.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -250,6 +267,39 @@ impl Controls for FirstPersonControls {
|
|||||||
self.backward_pressed = state == ElementState::Pressed;
|
self.backward_pressed = state == ElementState::Pressed;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// On Q pressed
|
||||||
|
Event::WindowEvent {
|
||||||
|
event: WindowEvent::KeyboardInput {
|
||||||
|
input: KeyboardInput {
|
||||||
|
virtual_keycode: Some(VirtualKeyCode::Q), state, ..
|
||||||
|
}, ..
|
||||||
|
}, ..
|
||||||
|
} => {
|
||||||
|
self.left_pressed = state == ElementState::Pressed;
|
||||||
|
},
|
||||||
|
|
||||||
|
// On D pressed
|
||||||
|
Event::WindowEvent {
|
||||||
|
event: WindowEvent::KeyboardInput {
|
||||||
|
input: KeyboardInput {
|
||||||
|
virtual_keycode: Some(VirtualKeyCode::D), state, ..
|
||||||
|
}, ..
|
||||||
|
}, ..
|
||||||
|
} => {
|
||||||
|
self.right_pressed = state == ElementState::Pressed;
|
||||||
|
},
|
||||||
|
|
||||||
|
// On Space pressed
|
||||||
|
Event::WindowEvent {
|
||||||
|
event: WindowEvent::KeyboardInput {
|
||||||
|
input: KeyboardInput {
|
||||||
|
virtual_keycode: Some(VirtualKeyCode::Space), state, ..
|
||||||
|
}, ..
|
||||||
|
}, ..
|
||||||
|
} => {
|
||||||
|
self.boost = state == ElementState::Pressed;
|
||||||
|
},
|
||||||
|
|
||||||
// On mouse move
|
// On mouse move
|
||||||
Event::WindowEvent {
|
Event::WindowEvent {
|
||||||
event: WindowEvent::CursorMoved {
|
event: WindowEvent::CursorMoved {
|
||||||
@ -275,6 +325,8 @@ impl Controls for FirstPersonControls {
|
|||||||
self.phi.cos() * self.theta.sin(),
|
self.phi.cos() * self.theta.sin(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
self.left = Vector3::new(0.0, 1.0, 0.0).cross_product(self.forward);
|
||||||
|
|
||||||
// Move the cursor back to the center
|
// Move the cursor back to the center
|
||||||
renderer
|
renderer
|
||||||
.gl_window()
|
.gl_window()
|
||||||
@ -292,15 +344,34 @@ impl Controls for FirstPersonControls {
|
|||||||
self.update_camera(camera);
|
self.update_camera(camera);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update<'a>(&mut self, camera: &mut Camera, _: &Renderer<'a, Display>) {
|
fn update<'a>(&mut self, camera: &mut Camera, renderer: &Renderer<'a, Display>) {
|
||||||
|
|
||||||
|
renderer.gl_window().window().set_cursor(MouseCursor::NoneCursor);
|
||||||
|
|
||||||
|
let mut speed = Vector3::new(0.0, 0.0, 0.0);
|
||||||
|
|
||||||
if self.forward_pressed {
|
if self.forward_pressed {
|
||||||
self.position += self.forward * self.speed;
|
speed += self.forward * self.speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.backward_pressed {
|
if self.backward_pressed {
|
||||||
self.position -= self.forward * self.speed;
|
speed -= self.forward * self.speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if self.left_pressed {
|
||||||
|
speed += self.left * self.speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.right_pressed {
|
||||||
|
speed -= self.left * self.speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.boost {
|
||||||
|
speed *= 10.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.position += speed;
|
||||||
|
|
||||||
self.update_camera(camera);
|
self.update_camera(camera);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user