aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cargo0
-rw-r--r--godot/native/BasicDie.gdns8
-rw-r--r--godot/project.godot8
-rw-r--r--godot/scenes/Game.tscn29
-rw-r--r--lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dllbin0 -> 477696 bytes
-rw-r--r--rust/src/BasicDie.rs239
-rw-r--r--rust/src/game.rs4
-rw-r--r--rust/src/lib.rs2
8 files changed, 280 insertions, 10 deletions
diff --git a/cargo b/cargo
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cargo
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
new file mode 100644
index 0000000..ceaed1c
--- /dev/null
+++ 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
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.