From 5678a04042b7b2ea52a927101cf66064535dc272 Mon Sep 17 00:00:00 2001 From: David Date: Sat, 16 Jul 2022 11:42:39 +0200 Subject: add separate shooting intensity --- rust/src/basic_die.rs | 331 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 331 insertions(+) create mode 100644 rust/src/basic_die.rs (limited to 'rust/src/basic_die.rs') diff --git a/rust/src/basic_die.rs b/rust/src/basic_die.rs new file mode 100644 index 0000000..9dab3ce --- /dev/null +++ b/rust/src/basic_die.rs @@ -0,0 +1,331 @@ +use std::borrow::Borrow; +use gdnative::api::*; +use gdnative::prelude::*; + +/// the input state for the player +enum InputState { + Default, + Shooting, + Moving +} + +/// the basic die used by the player +#[derive(NativeClass)] +#[inherit(RigidBody)] +#[register_with(Self::register_builder)] +pub struct BasicDie { + #[property(path="camera/camera_clamp")] + camera_clamp: Vector2, + #[property(path="shooting/max_force")] + max_force: f32, + #[property(path="shooting/up_angle")] + up_angle: f32, + #[property(path="shooting/stopping_velocity")] + stopping_velocity: f32, + #[property(path="input/camera_mouse_sensitivity")] + mouse_sensitivity: Vector2, + #[property(path="input/shoot_sensitivity")] + shoot_sensitivity: f32, + + input_state: InputState, + current_force: f32, + + action_shooting: String, + + node_camera_arm_horizontal: Option>, + node_camera_arm_vertical: Option>, + node_camera: Option>, +} + +#[methods] +impl BasicDie { + // Register the builder for methods, properties and/or signals. + fn register_builder(_builder: &ClassBuilder) { + godot_print!("BasicDie builder is registered!"); + } + + fn new(_owner: &RigidBody) -> Self { + BasicDie { + camera_clamp: Vector2 { x: 0.0, y: 0.0 }, + max_force: 0.0, + up_angle: 5.0, + stopping_velocity: 0.0, + mouse_sensitivity: Vector2 { x: 1.0, y: 1.0 }, + shoot_sensitivity: 1.0, + + input_state: InputState::Default, + current_force: 0.0, + + action_shooting: String::from("mouse_btn_left"), + + node_camera_arm_horizontal: None, + node_camera_arm_vertical: None, + node_camera: None, + } + } + + #[export] + unsafe fn _ready(&mut self, owner: &RigidBody) { + owner.set_physics_process(true); + + // look for the vertical camera arm + match self.node_camera_arm_horizontal { + Some(arm) => { + let save_arm = arm.assume_safe(); + match save_arm.get_node(NodePath::from_str("CameraArmVertical")) { + Some(node) => { + let save_node = node.assume_safe(); + match save_node.cast::() { + Some(casted) => { + let save_casted = casted.claim(); + self.node_camera_arm_vertical = Some(save_casted)}, + _ => godot_warn!("Camera Arm was not of type 'Spatial'"), + } + }, + _ => godot_warn!("No vertical arm found.") + } + }, + _ => godot_warn!("No horizontal arm to look for the vertical arm") + } + + // look for the camera + match self.node_camera_arm_vertical { + Some(arm) => { + let save_arm = arm.assume_safe(); + match save_arm.get_node(NodePath::from_str("Camera")) { + Some(node) => { + let save_node = node.assume_safe(); + match save_node.cast::() { + Some(casted) => { + let save_casted = casted.claim(); + self.node_camera = Some(save_casted)}, + _ => godot_warn!("Camera was not of type 'Spatial'"), + } + }, + _ => godot_warn!("No camera found.") + } + }, + _ => godot_warn!("No vertical arm to look for the camera") + } + } + + #[export] + unsafe fn _physics_process(&mut self, owner: &RigidBody, _delta: f64) { + + // detect if the die stops moving + if matches!(self.input_state, InputState::Moving) { + // get the current velocity + let current_vel = owner.linear_velocity().length(); + + godot_print!("current velocity: {}", current_vel); + + // check if the velocity is less than the threshold and change input state in that case + if current_vel <= self.stopping_velocity { + self.input_state = InputState::Default; + } + }; + } + + #[export] + unsafe fn _input(&mut self, owner: &RigidBody, event: Ref) { + + self.general_input(event.borrow()); + + match self.input_state { + InputState::Default => self.default_input(event), + InputState::Shooting => self.shooting_input(owner, event), + InputState::Moving => self.moving_input(event), + } + + // look for the horizontal camera arm + match owner.get_node(NodePath::from_str("CameraArmHorizontal")) { + Some(node) => { + let save_node = node.assume_safe(); + match save_node.cast::() { + Some(casted) => { + let save_casted = casted.claim(); + self.node_camera_arm_horizontal = Some(save_casted)}, + _ => godot_warn!("Camera Arm was not of type 'Spatial'"), + } + }, + _ => godot_warn!("No horizontal arm found") + } + + // look for the vertical camera arm + match self.node_camera_arm_horizontal { + Some(arm) => { + let save_arm = arm.assume_safe(); + match save_arm.get_node(NodePath::from_str("CameraArmVertical")) { + Some(node) => { + let save_node = node.assume_safe(); + match save_node.cast::() { + Some(casted) => { + let save_casted = casted.claim(); + self.node_camera_arm_vertical = Some(save_casted)}, + _ => godot_warn!("Camera Arm was not of type 'Spatial'"), + } + }, + _ => godot_warn!("No vertical arm found.") + } + }, + _ => godot_warn!("No horizontal arm to look for the vertical arm") + } + + // look for the camera + match self.node_camera_arm_vertical { + Some(arm) => { + let save_arm = arm.assume_safe(); + match save_arm.get_node(NodePath::from_str("Camera")) { + Some(node) => { + let save_node = node.assume_safe(); + match save_node.cast::() { + Some(casted) => { + let save_casted = casted.claim(); + self.node_camera = Some(save_casted)}, + _ => godot_warn!("Camera was not of type 'Spatial'"), + } + }, + _ => godot_warn!("No camera found.") + } + }, + _ => godot_warn!("No vertical arm to look for the camera") + } + } + + /// this input method will always be called, regardless of the input state + unsafe fn general_input(&mut self, event: &Ref) { + let save_event = event.assume_safe(); + + // rotate camera horizontally + let mouse_event = save_event.cast::(); // get the input as mouse input + match mouse_event { + Some(motion_event) => { + let x_mov = motion_event.relative().x * self.mouse_sensitivity.x; + self.rotate_cam_horizontal(x_mov); + }, + _ => {} + } + } + + /// this input method will be called when looking around, before taking a shot + unsafe fn default_input(&mut self, event: Ref) { + let save_event = event.assume_safe(); + + // left mouse button was pressed => switch to shooting mode + if save_event.is_action_pressed(GodotString::from_str(&self.action_shooting), false, false) { + godot_print!("mouse_button, switching to shooting mode"); + self.input_state = InputState::Shooting; + return; + } + + // rotate camera vertically + let mouse_event = save_event.cast::(); // get the input as mouse input + match mouse_event { + Some(motion_event) => { + let y_mov = -motion_event.relative().y * self.mouse_sensitivity.y; + self.rotate_cam_vertical(y_mov); + }, + _ => {} + }; + } + + /// this input method will be called when player is currently taking a shot + unsafe fn shooting_input(&mut self, owner: &RigidBody, event: Ref) { + let save_event = event.assume_safe(); + + // mouse released, shoot + if save_event.is_action_released(GodotString::from_str(&self.action_shooting), false) { + self.input_state = InputState::Moving; + self.shoot(owner); + return; + } + + // charge shot with vertical mouse movement + let mouse_event = save_event.cast::(); // get the input as mouse input + match mouse_event { + Some(motion_event) => { + let y_mov = motion_event.relative().y * self.mouse_sensitivity.y; + self.current_force = match self.current_force + y_mov { + x if x < 0.0 => 0.0, + x if x > self.max_force => self.max_force, + x => x + }; + + godot_print!("current force: {}", self.current_force); + }, + _ => {} + }; + } + + /// this input method will be called when player is moving + unsafe fn moving_input(&mut self, event: Ref) { + let save_event = event.assume_safe(); + + // rotate camera vertically + let mouse_event = save_event.cast::(); // get the input as mouse input + match mouse_event { + Some(motion_event) => { + let y_mov = motion_event.relative().y * self.mouse_sensitivity.y; + self.rotate_cam_vertical(y_mov); + }, + _ => {} + }; + } + + unsafe fn rotate_cam_horizontal(&mut self, input: f32) { + // make sure the arm exists + match self.node_camera_arm_horizontal { + Some(arm) => { + // rotate the horizontal camera arm + let save_arm = arm.assume_safe(); + save_arm.rotate_object_local(Vector3 {x: 0.0, y: 1.0, z: 0.0}, input as f64) + }, + _ => godot_warn!("No horizontal camera arm assigned.") + } + } + + unsafe fn rotate_cam_vertical(&mut self, input: f32) { + // make sure the camera arm actually exists + match self.node_camera_arm_vertical { + Some(arm) => { + // check for the current rotation + let save_arm = arm.assume_safe(); + let current_rot = save_arm.rotation(); + + // clamp the rotation + if current_rot.x + input > self.camera_clamp.x || current_rot.x + input <= self.camera_clamp.y { + return; + } + + // actually rotate if possible + let save_arm = arm.assume_safe(); + save_arm.rotate_object_local(Vector3 {x: 1.0, y: 0.0, z: 0.0}, input as f64) + }, + _ => godot_warn!("No vertical camera arm assigned") + } + } + + unsafe fn shoot(&mut self, owner: &RigidBody) { + // make sure the camera actually exists + match self.node_camera { + Some(cam) => { + // get the base position of the node + let base_pos = owner.transform().origin; + + // get the save reference + let save_cam = cam.assume_safe(); + + // get the forward vector of the camera setting the up angle to the defined value in the editor + let mut forward_vector = save_cam.global_transform().basis.c(); + forward_vector.y = self.up_angle; + + // calculate the impulse force + let impulse = forward_vector.normalized() * self.current_force; + + // actually add the force + owner.apply_impulse(base_pos, impulse); + }, + None => godot_warn!("No camera assigned!"), + } + } +} -- cgit From bb721621d661ab4e068a589a853c2420b7ac6566 Mon Sep 17 00:00:00 2001 From: David Date: Sat, 16 Jul 2022 14:36:27 +0200 Subject: change player script to work with new structure --- rust/src/basic_die.rs | 197 ++++++++++++++++++++------------------------------ 1 file changed, 78 insertions(+), 119 deletions(-) (limited to 'rust/src/basic_die.rs') diff --git a/rust/src/basic_die.rs b/rust/src/basic_die.rs index 9dab3ce..0b028b8 100644 --- a/rust/src/basic_die.rs +++ b/rust/src/basic_die.rs @@ -8,10 +8,13 @@ enum InputState { Shooting, Moving } + + +type SpatialRef = Option>; /// the basic die used by the player #[derive(NativeClass)] -#[inherit(RigidBody)] +#[inherit(Spatial)] #[register_with(Self::register_builder)] pub struct BasicDie { #[property(path="camera/camera_clamp")] @@ -32,9 +35,12 @@ pub struct BasicDie { action_shooting: String, - node_camera_arm_horizontal: Option>, - node_camera_arm_vertical: Option>, - node_camera: Option>, + node_die: SpatialRef, + + node_camera_root: SpatialRef, + node_camera_arm_horizontal: SpatialRef, + node_camera_arm_vertical: SpatialRef, + node_camera: SpatialRef, } #[methods] @@ -44,7 +50,7 @@ impl BasicDie { godot_print!("BasicDie builder is registered!"); } - fn new(_owner: &RigidBody) -> Self { + fn new(_owner: &Spatial) -> Self { BasicDie { camera_clamp: Vector2 { x: 0.0, y: 0.0 }, max_force: 0.0, @@ -58,6 +64,9 @@ impl BasicDie { action_shooting: String::from("mouse_btn_left"), + node_die: None, + + node_camera_root: None, node_camera_arm_horizontal: None, node_camera_arm_vertical: None, node_camera: None, @@ -65,58 +74,57 @@ impl BasicDie { } #[export] - unsafe fn _ready(&mut self, owner: &RigidBody) { + unsafe fn _ready(&mut self, owner: &Spatial) { + godot_print!("Player starting"); owner.set_physics_process(true); - // look for the vertical camera arm - match self.node_camera_arm_horizontal { - Some(arm) => { - let save_arm = arm.assume_safe(); - match save_arm.get_node(NodePath::from_str("CameraArmVertical")) { - Some(node) => { - let save_node = node.assume_safe(); - match save_node.cast::() { - Some(casted) => { - let save_casted = casted.claim(); - self.node_camera_arm_vertical = Some(save_casted)}, - _ => godot_warn!("Camera Arm was not of type 'Spatial'"), - } - }, - _ => godot_warn!("No vertical arm found.") + let search_node = | parent: &SpatialRef, name: String | { + let parent_node = match parent { + Some(node) => node.assume_safe().as_ref(), + None => owner + }; + match parent_node.get_node(NodePath::from_str(&name)) { + None => { godot_warn!("Could not find {}.", name); None }, + Some(node) => { + let save_node = node.assume_safe(); + match save_node.cast::() { + None => { godot_warn!("{} was not of type 'Spatial'.", name); None }, + Some(casted) => Some(casted.claim()) + } } - }, - _ => godot_warn!("No horizontal arm to look for the vertical arm") - } + } + }; - // look for the camera - match self.node_camera_arm_vertical { - Some(arm) => { - let save_arm = arm.assume_safe(); - match save_arm.get_node(NodePath::from_str("Camera")) { - Some(node) => { - let save_node = node.assume_safe(); - match save_node.cast::() { - Some(casted) => { - let save_casted = casted.claim(); - self.node_camera = Some(save_casted)}, - _ => godot_warn!("Camera was not of type 'Spatial'"), - } - }, - _ => godot_warn!("No camera found.") - } - }, - _ => godot_warn!("No vertical arm to look for the camera") - } + // look for the camera and arm nodes + self.node_camera_root = search_node(&None, String::from("Camera")); + self.node_camera_arm_horizontal = search_node(&self.node_camera_root, String::from("CameraArmHorizontal")); + self.node_camera_arm_vertical = search_node(&self.node_camera_arm_horizontal, String::from("CameraArmVertical")); + self.node_camera = search_node(&self.node_camera_arm_vertical, String::from("Camera")); + + godot_print!("{:?}", self.node_camera_root); + godot_print!("{:?}", self.node_camera_arm_horizontal); + godot_print!("{:?}", self.node_camera_arm_vertical); + godot_print!("{:?}", self.node_camera); + + self.node_die = search_node(&None, String::from("W8")); + + godot_print!("Player is ready"); } #[export] - unsafe fn _physics_process(&mut self, owner: &RigidBody, _delta: f64) { + unsafe fn _physics_process(&mut self, _owner: &Spatial, _delta: f64) { // detect if the die stops moving if matches!(self.input_state, InputState::Moving) { // get the current velocity - let current_vel = owner.linear_velocity().length(); - + let current_vel = match self.node_die { + None => { godot_warn!("No W8 assigned."); 0.0 }, + Some(node) => + match node.assume_safe().cast::() { + None => { godot_warn!("W8 is not a RigidBody."); 0.0 }, + Some(rb) => rb.linear_velocity().length() + } + }; godot_print!("current velocity: {}", current_vel); // check if the velocity is less than the threshold and change input state in that case @@ -127,69 +135,15 @@ impl BasicDie { } #[export] - unsafe fn _input(&mut self, owner: &RigidBody, event: Ref) { + unsafe fn _input(&mut self, _owner: &Spatial, event: Ref) { self.general_input(event.borrow()); match self.input_state { InputState::Default => self.default_input(event), - InputState::Shooting => self.shooting_input(owner, event), + InputState::Shooting => self.shooting_input(event), InputState::Moving => self.moving_input(event), } - - // look for the horizontal camera arm - match owner.get_node(NodePath::from_str("CameraArmHorizontal")) { - Some(node) => { - let save_node = node.assume_safe(); - match save_node.cast::() { - Some(casted) => { - let save_casted = casted.claim(); - self.node_camera_arm_horizontal = Some(save_casted)}, - _ => godot_warn!("Camera Arm was not of type 'Spatial'"), - } - }, - _ => godot_warn!("No horizontal arm found") - } - - // look for the vertical camera arm - match self.node_camera_arm_horizontal { - Some(arm) => { - let save_arm = arm.assume_safe(); - match save_arm.get_node(NodePath::from_str("CameraArmVertical")) { - Some(node) => { - let save_node = node.assume_safe(); - match save_node.cast::() { - Some(casted) => { - let save_casted = casted.claim(); - self.node_camera_arm_vertical = Some(save_casted)}, - _ => godot_warn!("Camera Arm was not of type 'Spatial'"), - } - }, - _ => godot_warn!("No vertical arm found.") - } - }, - _ => godot_warn!("No horizontal arm to look for the vertical arm") - } - - // look for the camera - match self.node_camera_arm_vertical { - Some(arm) => { - let save_arm = arm.assume_safe(); - match save_arm.get_node(NodePath::from_str("Camera")) { - Some(node) => { - let save_node = node.assume_safe(); - match save_node.cast::() { - Some(casted) => { - let save_casted = casted.claim(); - self.node_camera = Some(save_casted)}, - _ => godot_warn!("Camera was not of type 'Spatial'"), - } - }, - _ => godot_warn!("No camera found.") - } - }, - _ => godot_warn!("No vertical arm to look for the camera") - } } /// this input method will always be called, regardless of the input state @@ -230,13 +184,13 @@ impl BasicDie { } /// this input method will be called when player is currently taking a shot - unsafe fn shooting_input(&mut self, owner: &RigidBody, event: Ref) { + unsafe fn shooting_input(&mut self, event: Ref) { let save_event = event.assume_safe(); // mouse released, shoot if save_event.is_action_released(GodotString::from_str(&self.action_shooting), false) { self.input_state = InputState::Moving; - self.shoot(owner); + self.shoot(); return; } @@ -305,27 +259,32 @@ impl BasicDie { } } - unsafe fn shoot(&mut self, owner: &RigidBody) { + unsafe fn shoot(&mut self) { + // make sure the camera actually exists - match self.node_camera { + let impulse_dir = match self.node_camera { + None => { godot_warn!("No camera assigned!"); return; }, Some(cam) => { - // get the base position of the node - let base_pos = owner.transform().origin; - - // get the save reference - let save_cam = cam.assume_safe(); - // get the forward vector of the camera setting the up angle to the defined value in the editor - let mut forward_vector = save_cam.global_transform().basis.c(); + let mut forward_vector = cam.assume_safe().global_transform().basis.c(); forward_vector.y = self.up_angle; // calculate the impulse force - let impulse = forward_vector.normalized() * self.current_force; + forward_vector.normalized() * self.current_force + } + }; - // actually add the force - owner.apply_impulse(base_pos, impulse); - }, - None => godot_warn!("No camera assigned!"), - } + // get the die + let die = match self.node_die { + None => { godot_warn!("No W8 assigned."); return; }, + Some(node) => + match node.assume_safe().cast::() { + None => { godot_warn!("W8 is not a RigidBody."); return; }, + Some(rb) => rb + } + }; + + // actually add the force + die.apply_impulse(die.transform().origin, impulse_dir); } } -- cgit From 635cfebff3ec0ce5b74ac728a5655339755efe39 Mon Sep 17 00:00:00 2001 From: David Date: Sat, 16 Jul 2022 15:12:11 +0200 Subject: better mouse handling. correct impulse --- rust/src/basic_die.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'rust/src/basic_die.rs') diff --git a/rust/src/basic_die.rs b/rust/src/basic_die.rs index 0b028b8..ffd3bff 100644 --- a/rust/src/basic_die.rs +++ b/rust/src/basic_die.rs @@ -75,7 +75,8 @@ impl BasicDie { #[export] unsafe fn _ready(&mut self, owner: &Spatial) { - godot_print!("Player starting"); + Input::godot_singleton().set_mouse_mode(Input::MOUSE_MODE_CAPTURED); + owner.set_physics_process(true); let search_node = | parent: &SpatialRef, name: String | { @@ -125,11 +126,11 @@ impl BasicDie { Some(rb) => rb.linear_velocity().length() } }; - godot_print!("current velocity: {}", current_vel); // check if the velocity is less than the threshold and change input state in that case if current_vel <= self.stopping_velocity { self.input_state = InputState::Default; + godot_print!("Die stopped moving"); } }; } @@ -159,6 +160,16 @@ impl BasicDie { }, _ => {} } + + let key_event = save_event.cast::(); + match key_event { + Some(key_event) => { + if key_event.scancode() == GlobalConstants::KEY_ESCAPE { + Input::godot_singleton().set_mouse_mode(Input::MOUSE_MODE_VISIBLE); + } + }, + _ => {} + } } /// this input method will be called when looking around, before taking a shot @@ -198,7 +209,7 @@ impl BasicDie { let mouse_event = save_event.cast::(); // get the input as mouse input match mouse_event { Some(motion_event) => { - let y_mov = motion_event.relative().y * self.mouse_sensitivity.y; + let y_mov = motion_event.relative().y * self.shoot_sensitivity; self.current_force = match self.current_force + y_mov { x if x < 0.0 => 0.0, x if x > self.max_force => self.max_force, @@ -266,7 +277,7 @@ impl BasicDie { None => { godot_warn!("No camera assigned!"); return; }, Some(cam) => { // get the forward vector of the camera setting the up angle to the defined value in the editor - let mut forward_vector = cam.assume_safe().global_transform().basis.c(); + let mut forward_vector = -cam.assume_safe().global_transform().basis.c(); forward_vector.y = self.up_angle; // calculate the impulse force -- cgit From ea7596edf57149b3c3f84378276c9d0558aed050 Mon Sep 17 00:00:00 2001 From: David Date: Sat, 16 Jul 2022 15:47:20 +0200 Subject: better stopping detection --- rust/src/basic_die.rs | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) (limited to 'rust/src/basic_die.rs') diff --git a/rust/src/basic_die.rs b/rust/src/basic_die.rs index ffd3bff..ab53720 100644 --- a/rust/src/basic_die.rs +++ b/rust/src/basic_die.rs @@ -25,6 +25,8 @@ pub struct BasicDie { up_angle: f32, #[property(path="shooting/stopping_velocity")] stopping_velocity: f32, + #[property(path="shooting/stopping_min_milliseconds")] + stopping_min_ms: i64, #[property(path="input/camera_mouse_sensitivity")] mouse_sensitivity: Vector2, #[property(path="input/shoot_sensitivity")] @@ -32,6 +34,7 @@ pub struct BasicDie { input_state: InputState, current_force: f32, + last_shot_time: i64, action_shooting: String, @@ -56,11 +59,13 @@ impl BasicDie { max_force: 0.0, up_angle: 5.0, stopping_velocity: 0.0, + stopping_min_ms: 1000, mouse_sensitivity: Vector2 { x: 1.0, y: 1.0 }, shoot_sensitivity: 1.0, input_state: InputState::Default, current_force: 0.0, + last_shot_time: 0, action_shooting: String::from("mouse_btn_left"), @@ -75,10 +80,12 @@ impl BasicDie { #[export] unsafe fn _ready(&mut self, owner: &Spatial) { - Input::godot_singleton().set_mouse_mode(Input::MOUSE_MODE_CAPTURED); + Input::godot_singleton().set_mouse_mode(Input::MOUSE_MODE_CAPTURED); owner.set_physics_process(true); + self.last_shot_time = OS::godot_singleton().get_ticks_msec(); + let search_node = | parent: &SpatialRef, name: String | { let parent_node = match parent { Some(node) => node.assume_safe().as_ref(), @@ -114,23 +121,33 @@ impl BasicDie { #[export] unsafe fn _physics_process(&mut self, _owner: &Spatial, _delta: f64) { + + let die = match self.node_die { + None => { godot_warn!("No W8 assigned."); return; }, + Some(node) => match node.assume_safe().cast::() { + None => { godot_warn!("W8 is not a RigidBody."); return; }, + Some(rb) => rb + } + }; + + // let the cam follow the die + match self.node_camera_root { + None => { godot_warn!("No W8 assigned."); }, + Some(cam) => { + cam.assume_safe().set_translation(die.translation()); + } + } // detect if the die stops moving - if matches!(self.input_state, InputState::Moving) { - // get the current velocity - let current_vel = match self.node_die { - None => { godot_warn!("No W8 assigned."); 0.0 }, - Some(node) => - match node.assume_safe().cast::() { - None => { godot_warn!("W8 is not a RigidBody."); 0.0 }, - Some(rb) => rb.linear_velocity().length() - } - }; + let delta_ms = OS::godot_singleton().get_ticks_msec() - self.last_shot_time; + if matches!(self.input_state, InputState::Moving) + && (delta_ms > self.stopping_min_ms) { // check if the velocity is less than the threshold and change input state in that case + let current_vel = die.linear_velocity().length(); if current_vel <= self.stopping_velocity { self.input_state = InputState::Default; - godot_print!("Die stopped moving"); + godot_print!("Die stopped moving at velocity {} after {} ms", current_vel, delta_ms); } }; } @@ -297,5 +314,7 @@ impl BasicDie { // actually add the force die.apply_impulse(die.transform().origin, impulse_dir); + + self.last_shot_time = OS::godot_singleton().get_ticks_msec(); } } -- cgit From bdf6f0328e870c308299f37155b9e89d91a2859c Mon Sep 17 00:00:00 2001 From: David Date: Sat, 16 Jul 2022 16:01:31 +0200 Subject: fix up angle and force --- rust/src/basic_die.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'rust/src/basic_die.rs') diff --git a/rust/src/basic_die.rs b/rust/src/basic_die.rs index ab53720..2a61197 100644 --- a/rust/src/basic_die.rs +++ b/rust/src/basic_die.rs @@ -219,6 +219,7 @@ impl BasicDie { if save_event.is_action_released(GodotString::from_str(&self.action_shooting), false) { self.input_state = InputState::Moving; self.shoot(); + self.current_force = 0.0; return; } @@ -294,7 +295,7 @@ impl BasicDie { None => { godot_warn!("No camera assigned!"); return; }, Some(cam) => { // get the forward vector of the camera setting the up angle to the defined value in the editor - let mut forward_vector = -cam.assume_safe().global_transform().basis.c(); + let mut forward_vector = -cam.assume_safe().global_transform().basis.c().normalized(); forward_vector.y = self.up_angle; // calculate the impulse force -- cgit