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

View File

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

View File

@ -23,6 +23,8 @@ pub enum Setting {
ReplayFPS, ReplayFPS,
WindowMode, WindowMode,
RenderScale, RenderScale,
MouseSensitivity,
ControllerSensitivity,
// Volume settings // Volume settings
MasterVolume, MasterVolume,
@ -57,6 +59,8 @@ impl ToString for Setting {
Setting::ReplayFPS => "Replay FPS", Setting::ReplayFPS => "Replay FPS",
Setting::WindowMode => "Window Mode", Setting::WindowMode => "Window Mode",
Setting::RenderScale => "Render Scale", Setting::RenderScale => "Render Scale",
Setting::MouseSensitivity => "Mouse Sensitivity",
Setting::ControllerSensitivity => "Controller Sensitivity",
Setting::MasterVolume => "Master volume", Setting::MasterVolume => "Master volume",
Setting::SfxVolume => "Sfx Volume", Setting::SfxVolume => "Sfx Volume",
@ -86,6 +90,8 @@ impl Setting {
Setting::ReplayFPS => SettingsTab::General, Setting::ReplayFPS => SettingsTab::General,
Setting::WindowMode => SettingsTab::General, Setting::WindowMode => SettingsTab::General,
Setting::RenderScale => SettingsTab::General, Setting::RenderScale => SettingsTab::General,
Setting::MouseSensitivity => SettingsTab::General,
Setting::ControllerSensitivity => SettingsTab::General,
Setting::MasterVolume => SettingsTab::Volume, Setting::MasterVolume => SettingsTab::Volume,
Setting::SfxVolume => SettingsTab::Volume, Setting::SfxVolume => SettingsTab::Volume,
@ -383,6 +389,12 @@ impl SettingsPanel {
(Setting::RenderScale, SettingValue::SliderNumber(value)) => { (Setting::RenderScale, SettingValue::SliderNumber(value)) => {
new_settings.render_scale = value.value as f32; 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)) => { (Setting::MasterVolume, SettingValue::SliderNumber(value)) => {
new_settings.volume.master_volume = value.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, 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( map.insert(
Setting::MasterVolume, Setting::MasterVolume,
SettingValue::SliderNumber(SliderValue { SettingValue::SliderNumber(SliderValue {