diff options
Diffstat (limited to '')
-rw-r--r-- | cargo | 0 | ||||
-rw-r--r-- | godot/native/BasicDie.gdns | 8 | ||||
-rw-r--r-- | godot/project.godot | 8 | ||||
-rw-r--r-- | godot/scenes/Game.tscn | 29 | ||||
-rw-r--r-- | lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll | bin | 0 -> 477696 bytes | |||
-rw-r--r-- | rust/src/BasicDie.rs | 239 | ||||
-rw-r--r-- | rust/src/game.rs | 4 | ||||
-rw-r--r-- | rust/src/lib.rs | 2 |
8 files changed, 280 insertions, 10 deletions
diff --git a/godot/native/BasicDie.gdns b/godot/native/BasicDie.gdns new file mode 100644 index 0000000..ab5d534 --- /dev/null +++ b/godot/native/BasicDie.gdns @@ -0,0 +1,8 @@ +[gd_resource type="NativeScript" load_steps=2 format=2] + +[ext_resource path="res://native/game.gdnlib" type="GDNativeLibrary" id=1] + +[resource] +resource_name = "BasicDie" +class_name = "BasicDie" +library = ExtResource( 1 ) diff --git a/godot/project.godot b/godot/project.godot index 50f9a46..8439ce7 100644 --- a/godot/project.godot +++ b/godot/project.godot @@ -18,6 +18,14 @@ config/name="code-with-your-friends2022" run/main_scene="res://scenes/Game.tscn" config/icon="res://assets/godot-ferris-32x32.png" +[input] + +mouse_btn_left={ +"deadzone": 0.5, +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) + ] +} + [rendering] environment/default_environment="res://default_env.tres" diff --git a/godot/scenes/Game.tscn b/godot/scenes/Game.tscn index a37a7eb..320f926 100644 --- a/godot/scenes/Game.tscn +++ b/godot/scenes/Game.tscn @@ -1,18 +1,33 @@ -[gd_scene load_steps=4 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://native/Game.gdns" type="Script" id=1] -[ext_resource path="res://scenes/SpinningCube.tscn" type="PackedScene" id=2] +[ext_resource path="res://native/BasicDie.gdns" type="Script" id=2] [sub_resource type="CubeMesh" id=1] +[sub_resource type="BoxShape" id=2] + [node name="Game" type="Spatial"] script = ExtResource( 1 ) -[node name="Camera" type="Camera" parent="."] -transform = Transform( 0.572229, -0.327396, 0.751909, 0, 0.916856, 0.399217, -0.820094, -0.228443, 0.524651, 4.71648, 2.5, 3.45846 ) -current = true +[node name="RigidBody" type="RigidBody" parent="."] +script = ExtResource( 2 ) +base/camera_offset = 500.0 +base/camera_clamp = Vector2( 0, -1 ) +shooting/max_force = 100.0 +shooting/up_angle = 5.0 +input/mouse_sensitivity = Vector2( 0.05, 0.05 ) -[node name="SpinningCube" parent="." instance=ExtResource( 2 )] +[node name="MeshInstance" type="MeshInstance" parent="RigidBody"] mesh = SubResource( 1 ) material/0 = null -base/rotate_speed = 1.0 + +[node name="CollisionShape" type="CollisionShape" parent="RigidBody"] +shape = SubResource( 2 ) + +[node name="CameraArmHorizontal" type="Spatial" parent="RigidBody"] + +[node name="CameraArmVertical" type="Spatial" parent="RigidBody/CameraArmHorizontal"] + +[node name="Camera" type="Camera" parent="RigidBody/CameraArmHorizontal/CameraArmVertical"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10 ) 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 Binary files differnew file mode 100644 index 0000000..ceaed1c --- /dev/null +++ b/lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll diff --git a/rust/src/BasicDie.rs b/rust/src/BasicDie.rs new file mode 100644 index 0000000..7bc6d65 --- /dev/null +++ b/rust/src/BasicDie.rs @@ -0,0 +1,239 @@ +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="base/camera_offset")] + camera_offset: f32, + #[property(path="base/camera_clamp")] + camera_clamp: Vector2, + #[property(path="shooting/max_force")] + max_force: f32, + #[property(path="shooting/up_angle")] + up_angle: f32, + #[property(path="input/mouse_sensitivity")] + mouse_sensitivity: Vector2, + + input_state: InputState, + current_force: f32, + + action_shooting: String, + + node_camera_arm_horizontal: Option<Ref<Spatial>>, + node_camera_arm_vertical: Option<Ref<Spatial>>, +} + +#[methods] +impl BasicDie { + // Register the builder for methods, properties and/or signals. + fn register_builder(_builder: &ClassBuilder<Self>) { + godot_print!("BasicDie builder is registered!"); + } + + 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, + mouse_sensitivity: Vector2 { x: 1.0, y: 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, + } + } + + #[export] + unsafe fn _ready(&mut self, owner: &RigidBody) { + owner.set_physics_process(true); + + // 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::<Spatial>() { + 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 child node called 'Camera 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::<Spatial>() { + 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") + } + } + + #[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 + }; + } + + #[export] + unsafe fn _input(&mut self, owner: &RigidBody, event: Ref<InputEvent>) { + + self.general_input(event.borrow()); + + match self.input_state { + InputState::Default => self.default_input(event), + InputState::Shooting => self.shooting_input(event), + InputState::Moving => self.moving_input(event), + } + } + + /// this input method will always be called, regardless of the input state + unsafe fn general_input(&mut self, event: &Ref<InputEvent>) { + let save_event = event.assume_safe(); + + // get the input as mouse input + let mouse_event = save_event.cast::<InputEventMouseMotion>(); + 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<InputEvent>) { + let save_event = event.assume_safe(); + + godot_print!("default input"); + + // 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; + } + + // get the input as mouse input + let mouse_event = save_event.cast::<InputEventMouseMotion>(); + 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, 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 + return; + } + + // get the input as mouse input + let mouse_event = save_event.cast::<InputEventMouseMotion>(); + 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, + _ => self.current_force + y_mov + }; + + 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<InputEvent>) { + let save_event = event.assume_safe(); + + godot_print!("moving input"); + + // get the input as mouse input + let mouse_event = save_event.cast::<InputEventMouseMotion>(); + 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(); + 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 { + 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") + } + } +} diff --git a/rust/src/game.rs b/rust/src/game.rs index ece5a54..16c93d8 100644 --- a/rust/src/game.rs +++ b/rust/src/game.rs @@ -40,7 +40,5 @@ impl Game { // This function will be called in every frame #[export] - unsafe fn _process(&self, _owner: &Spatial, delta: f64) { - godot_print!("Inside {} _process(), delta is {}", self.name, delta); - } + unsafe fn _process(&self, _owner: &Spatial, delta: f64) {} } diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 1cc766a..e2ed1ac 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1,5 +1,6 @@ mod game; mod spinning_cube; +mod BasicDie; use gdnative::prelude::{godot_init, InitHandle}; @@ -7,6 +8,7 @@ use gdnative::prelude::{godot_init, InitHandle}; fn init(handle: InitHandle) { handle.add_class::<game::Game>(); handle.add_class::<spinning_cube::SpinningCube>(); + handle.add_class::<BasicDie::BasicDie>(); } // macros that create the entry-points of the dynamic library. |