Add mouse/controller sensitivity

This commit is contained in:
Sofia 2026-08-08 20:08:30 +03:00
parent 2eae18faa4
commit 5083e8a738
3 changed files with 45 additions and 8 deletions

View File

@ -26,6 +26,8 @@ pub struct GameSettings {
pub window_mode: WindowModeSetting,
pub render_scale: f32,
pub recent_servers: Vec<RecentServer>,
pub mouse_sensitivity: f32,
pub controller_sensitivity: f32,
pub volume: VolumeSettings,
pub keybinds: KeybindSettings,
}
@ -150,6 +152,8 @@ impl Default for GameSettings {
render_scale: 1.,
window_mode: WindowModeSetting::Maximized,
recent_servers: Vec::new(),
mouse_sensitivity: 1.5,
controller_sensitivity: 1.5,
volume: VolumeSettings {
master_volume: 100.,
sfx_volume: 100.,

View File

@ -40,7 +40,9 @@ use crate::{
#[class(base=CharacterBody3D, init)]
pub struct LocalPlayer {
#[export]
look_sensitivity: f32,
mouse_sensitivity: f32,
#[export]
controller_sensitivity: f32,
#[export]
camera: Option<Gd<Camera3D>>,
#[export]
@ -776,7 +778,7 @@ impl ICharacterBody3D for LocalPlayer {
}
if let Ok(event) = event.try_cast::<InputEventMouseMotion>() {
self.move_look(event.get_relative())
self.move_look(event.get_relative(), self.mouse_sensitivity)
}
}
}
@ -788,7 +790,7 @@ impl ICharacterBody3D for LocalPlayer {
input.get_action_strength("look_down") - input.get_action_strength("look_up"),
) * 5.;
if !joypad_look_dir.is_zero_approx() {
self.move_look(joypad_look_dir);
self.move_look(joypad_look_dir, self.controller_sensitivity);
}
let rot = self.y_rot;
@ -873,6 +875,8 @@ impl LocalPlayer {
if let Some(camera) = &mut self.camera {
camera.set_fov(settings.fov as f32);
}
self.mouse_sensitivity = settings.mouse_sensitivity;
self.controller_sensitivity = settings.controller_sensitivity;
}
pub fn play_local_hit_sound(&mut self) {
@ -919,19 +923,18 @@ impl LocalPlayer {
}
}
fn move_look(&mut self, direction: Vector2) {
fn move_look(&mut self, direction: Vector2, sensitivity: f32) {
if !self.is_dead() {
let dir = direction * 0.001 * self.look_sensitivity;
let dir = direction * 0.001 * sensitivity;
if let Some(camera) = self.camera.as_mut() {
let curr_rotation = camera.get_rotation();
let x_rot =
(curr_rotation.x - dir.y * self.look_sensitivity).clamp(-PI / 2., PI / 2.);
let x_rot = (curr_rotation.x - dir.y * sensitivity).clamp(-PI / 2., PI / 2.);
camera.set_rotation(Vector3::RIGHT * x_rot);
self.look_up = x_rot;
}
let y_rot = -dir.x * self.look_sensitivity;
let y_rot = -dir.x * sensitivity;
self.y_rot = self.base().get_global_rotation().y + y_rot;
}
}

View File

@ -23,6 +23,8 @@ pub enum Setting {
ReplayFPS,
WindowMode,
RenderScale,
MouseSensitivity,
ControllerSensitivity,
// Volume settings
MasterVolume,
@ -57,6 +59,8 @@ impl ToString for Setting {
Setting::ReplayFPS => "Replay FPS",
Setting::WindowMode => "Window Mode",
Setting::RenderScale => "Render Scale",
Setting::MouseSensitivity => "Mouse Sensitivity",
Setting::ControllerSensitivity => "Controller Sensitivity",
Setting::MasterVolume => "Master volume",
Setting::SfxVolume => "Sfx Volume",
@ -86,6 +90,8 @@ impl Setting {
Setting::ReplayFPS => SettingsTab::General,
Setting::WindowMode => SettingsTab::General,
Setting::RenderScale => SettingsTab::General,
Setting::MouseSensitivity => SettingsTab::General,
Setting::ControllerSensitivity => SettingsTab::General,
Setting::MasterVolume => SettingsTab::Volume,
Setting::SfxVolume => SettingsTab::Volume,
@ -383,6 +389,12 @@ impl SettingsPanel {
(Setting::RenderScale, SettingValue::SliderNumber(value)) => {
new_settings.render_scale = value.value as f32;
}
(Setting::MouseSensitivity, SettingValue::SliderNumber(value)) => {
new_settings.mouse_sensitivity = value.value as f32;
}
(Setting::ControllerSensitivity, SettingValue::SliderNumber(value)) => {
new_settings.controller_sensitivity = value.value as f32;
}
(Setting::MasterVolume, SettingValue::SliderNumber(value)) => {
new_settings.volume.master_volume = value.value;
@ -509,6 +521,24 @@ fn settings_from(map: &mut HashMap<Setting, SettingValue>, settings: &GameSettin
value: settings.render_scale as f64,
}),
);
map.insert(
Setting::MouseSensitivity,
SettingValue::SliderNumber(SliderValue {
min: 0.25,
max: 3.,
step: 0.05,
value: settings.mouse_sensitivity as f64,
}),
);
map.insert(
Setting::ControllerSensitivity,
SettingValue::SliderNumber(SliderValue {
min: 0.25,
max: 3.,
step: 0.05,
value: settings.controller_sensitivity as f64,
}),
);
map.insert(
Setting::MasterVolume,
SettingValue::SliderNumber(SliderValue {