diff --git a/README.md b/README.md index e6e623b..1e6349e 100644 --- a/README.md +++ b/README.md @@ -28,9 +28,18 @@ Key features: - f: toggle 3rd person view - TAB: toggle augmented reality overlay (HUD, low-light amplifier) +Extra key bindings for mouseless playing: + +- j: look left +- i: look up +- k: look down +- l: look right +- u: rotate left +- o: rotate right + # System Requirements -- Screen, keyboard, mouse +- Screen, keyboard - Operating System: Linux, Windows, MacOS - Ideally, a graphics card with vulkan support diff --git a/src/camera.rs b/src/camera.rs index 638a3ed..e002ee4 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -197,12 +197,13 @@ fn apply_input_to_player( let mut acceleration_total = actor::ENGINE_SPEED_FACTOR * dt * acceleration_global; let threshold = 1e-5; if key_input.pressed(settings.key_stop) { + // Decelerate for i in 0..3 { if v[i].abs() < threshold { v[i] = 0.0; } else if v[i].signum() != (v[i] + acceleration_total[i]).signum() { - // Overshoot + // Almost stopped, but we overshot v=0 v[i] = 0.0; acceleration_total[i] = 0.0; } @@ -216,29 +217,46 @@ fn apply_input_to_player( engine.current_warmup = (engine.current_warmup - dt / engine.warmup_seconds).clamp(0.0, 1.0); } - // Handle mouse input + // Handle mouse input and mouse-like key bindings let mut mouse_delta = Vec2::ZERO; + let mut pitch_yaw_rot = Vec3::ZERO; + let mouseless_sensitivity = 8.0; + if key_input.pressed(settings.key_mouseup) { + pitch_yaw_rot[0] -= mouseless_sensitivity; + } + if key_input.pressed(settings.key_mousedown) { + pitch_yaw_rot[0] += mouseless_sensitivity; + } + if key_input.pressed(settings.key_mouseleft) { + pitch_yaw_rot[1] += mouseless_sensitivity; + } + if key_input.pressed(settings.key_mouseright) { + pitch_yaw_rot[1] -= mouseless_sensitivity; + } + if key_input.pressed(settings.key_rotateleft) { + pitch_yaw_rot[2] -= mouseless_sensitivity; + } + if key_input.pressed(settings.key_rotateright) { + pitch_yaw_rot[2] += mouseless_sensitivity; + } for mouse_event in mouse_events.read() { mouse_delta += mouse_event.delta; } - if mouse_delta != Vec2::ZERO { - // Apply look update - let mouse_y_movement = (mouse_delta.y * RADIANS_PER_DOT * settings.mouse_sensitivity).clamp(-PI / 2., PI / 2.); - let mouse_x_movement = -mouse_delta.x * RADIANS_PER_DOT * settings.mouse_sensitivity; - let (pitch, yaw, rot); if key_input.pressed(settings.key_rotate) { - pitch = 0.0; - yaw = 0.0; - rot = mouse_x_movement; + pitch_yaw_rot[2] += mouse_delta.x; } else { - pitch = mouse_y_movement; - yaw = mouse_x_movement; - rot = 0.0; + pitch_yaw_rot[0] += mouse_delta.y; + pitch_yaw_rot[1] -= mouse_delta.x; } - player_transform.rotation *= Quat::from_euler(EulerRot::ZYX, rot, yaw, pitch).normalize(); + } + if pitch_yaw_rot.length_squared() > 0.0001 { + pitch_yaw_rot *= RADIANS_PER_DOT * settings.mouse_sensitivity; + player_transform.rotation *= Quat::from_euler(EulerRot::ZYX, + pitch_yaw_rot[2], pitch_yaw_rot[1], pitch_yaw_rot[0]).normalize(); } + // Play sound effects if let Ok(sink) = thruster_sound_controller.get_single() { if play_thruster_sound && engine.engine_type == actor::EngineType::Monopropellant { sink.play() diff --git a/src/settings.rs b/src/settings.rs index 9cd01aa..6015715 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -28,6 +28,12 @@ pub struct Settings { pub key_vehicle: KeyCode, pub key_camera: KeyCode, pub key_rotate: KeyCode, + pub key_mouseup: KeyCode, + pub key_mousedown: KeyCode, + pub key_mouseleft: KeyCode, + pub key_mouseright: KeyCode, + pub key_rotateleft: KeyCode, + pub key_rotateright: KeyCode, pub key_reply1: KeyCode, pub key_reply2: KeyCode, pub key_reply3: KeyCode, @@ -78,6 +84,12 @@ impl Default for Settings { key_vehicle: KeyCode::KeyQ, key_camera: KeyCode::KeyF, key_rotate: KeyCode::KeyR, + key_mouseup: KeyCode::KeyI, + key_mousedown: KeyCode::KeyK, + key_mouseleft: KeyCode::KeyJ, + key_mouseright: KeyCode::KeyL, + key_rotateleft: KeyCode::KeyU, + key_rotateright: KeyCode::KeyO, key_reply1: KeyCode::Digit1, key_reply2: KeyCode::Digit2, key_reply3: KeyCode::Digit3,