aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--godot/scenes/Game.tscn23
-rw-r--r--lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dllbin477696 -> 482304 bytes
-rw-r--r--rust/src/BasicDie.rs71
3 files changed, 81 insertions, 13 deletions
diff --git a/godot/scenes/Game.tscn b/godot/scenes/Game.tscn
index 320f926..f569f85 100644
--- a/godot/scenes/Game.tscn
+++ b/godot/scenes/Game.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=5 format=2]
+[gd_scene load_steps=7 format=2]
[ext_resource path="res://native/Game.gdns" type="Script" id=1]
[ext_resource path="res://native/BasicDie.gdns" type="Script" id=2]
@@ -7,15 +7,20 @@
[sub_resource type="BoxShape" id=2]
+[sub_resource type="CubeMesh" id=3]
+
+[sub_resource type="BoxShape" id=4]
+
[node name="Game" type="Spatial"]
script = ExtResource( 1 )
[node name="RigidBody" type="RigidBody" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.25589, 0 )
script = ExtResource( 2 )
-base/camera_offset = 500.0
-base/camera_clamp = Vector2( 0, -1 )
+camera/camera_clamp = Vector2( 0, -1.5 )
shooting/max_force = 100.0
-shooting/up_angle = 5.0
+shooting/up_angle = 1.0
+shooting/stopping_velocity = 10.0
input/mouse_sensitivity = Vector2( 0.05, 0.05 )
[node name="MeshInstance" type="MeshInstance" parent="RigidBody"]
@@ -31,3 +36,13 @@ shape = SubResource( 2 )
[node name="Camera" type="Camera" parent="RigidBody/CameraArmHorizontal/CameraArmVertical"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10 )
+
+[node name="StaticBody" type="StaticBody" parent="."]
+transform = Transform( 100, 0, 0, 0, 0.1, 0, 0, 0, 100, 0, 0, 0 )
+
+[node name="MeshInstance" type="MeshInstance" parent="StaticBody"]
+mesh = SubResource( 3 )
+material/0 = null
+
+[node name="CollisionShape" type="CollisionShape" parent="StaticBody"]
+shape = SubResource( 4 )
diff --git a/lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll b/lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll
index ceaed1c..115f39f 100644
--- a/lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll
+++ b/lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll
Binary files differ
diff --git a/rust/src/BasicDie.rs b/rust/src/BasicDie.rs
index 7bc6d65..3f15de5 100644
--- a/rust/src/BasicDie.rs
+++ b/rust/src/BasicDie.rs
@@ -14,14 +14,14 @@ enum InputState {
#[inherit(RigidBody)]
#[register_with(Self::register_builder)]
pub struct BasicDie {
- #[property(path="base/camera_offset")]
- camera_offset: f32,
- #[property(path="base/camera_clamp")]
+ #[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/mouse_sensitivity")]
mouse_sensitivity: Vector2,
@@ -32,6 +32,7 @@ pub struct BasicDie {
node_camera_arm_horizontal: Option<Ref<Spatial>>,
node_camera_arm_vertical: Option<Ref<Spatial>>,
+ node_camera: Option<Ref<Spatial>>,
}
#[methods]
@@ -43,10 +44,10 @@ impl BasicDie {
fn new(_owner: &RigidBody) -> Self {
BasicDie {
- camera_offset: 0.0,
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 },
input_state: InputState::Default,
@@ -56,6 +57,7 @@ impl BasicDie {
node_camera_arm_horizontal: None,
node_camera_arm_vertical: None,
+ node_camera: None,
}
}
@@ -96,13 +98,41 @@ impl BasicDie {
},
_ => 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::<Spatial>() {
+ 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) {
if matches!(self.input_state, InputState::Moving) {
- // TODO check if velocity reached a certain threshold and set the mode to default again
+ // 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;
+ }
};
}
@@ -113,7 +143,7 @@ impl BasicDie {
match self.input_state {
InputState::Default => self.default_input(event),
- InputState::Shooting => self.shooting_input(event),
+ InputState::Shooting => self.shooting_input(owner, event),
InputState::Moving => self.moving_input(event),
}
}
@@ -158,14 +188,14 @@ impl BasicDie {
}
/// this input method will be called when player is currently taking a shot
- unsafe fn shooting_input(&mut self, event: Ref<InputEvent>) {
+ unsafe fn shooting_input(&mut self, owner: &RigidBody, event: Ref<InputEvent>) {
let save_event = event.assume_safe();
godot_print!("shooting input");
if save_event.is_action_released(GodotString::from_str(&self.action_shooting), false) {
self.input_state = InputState::Moving;
- // TODO add force based on input and strength
+ self.shoot(owner);
return;
}
@@ -222,7 +252,6 @@ impl BasicDie {
// check for the current rotation
let save_arm = arm.assume_safe();
let current_rot = save_arm.rotation();
- godot_print!("current rotation: {} | {} | {} ", current_rot.x, current_rot.y, current_rot.z);
// clamp the rotation
if current_rot.x + input > self.camera_clamp.x || current_rot.x + input <= self.camera_clamp.y {
@@ -236,4 +265,28 @@ impl BasicDie {
_ => 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!"),
+ }
+ }
}