diff --git a/Scenes/TestBullet.tscn b/Scenes/TestBullet.tscn new file mode 100644 index 0000000..b2bafbe --- /dev/null +++ b/Scenes/TestBullet.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=5 format=3 uid="uid://si4byubqnng4"] + +[ext_resource type="Script" path="res://Scripts/TestBullet.cs" id="1_cavby"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_5vpcx"] +albedo_color = Color(0.584314, 0.0352941, 0.141176, 1) + +[sub_resource type="SphereMesh" id="SphereMesh_wuk0e"] +material = SubResource("StandardMaterial3D_5vpcx") + +[sub_resource type="SphereShape3D" id="SphereShape3D_rokeu"] + +[node name="TestBullet" type="Node3D"] +script = ExtResource("1_cavby") +_projectileSpeed = 5.0 + +[node name="RigidBody3D" type="RigidBody3D" parent="."] +collision_layer = 0 +gravity_scale = 0.0 +continuous_cd = true +contact_monitor = true + +[node name="MeshInstance3D" type="MeshInstance3D" parent="RigidBody3D"] +transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0) +mesh = SubResource("SphereMesh_wuk0e") +skeleton = NodePath("../..") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D"] +transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0) +shape = SubResource("SphereShape3D_rokeu") diff --git a/Scenes/TestCharacter.tscn b/Scenes/TestCharacter.tscn index 15c02c6..a2cc303 100644 --- a/Scenes/TestCharacter.tscn +++ b/Scenes/TestCharacter.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=4 format=3 uid="uid://b38hcomu4tpm5"] +[gd_scene load_steps=5 format=3 uid="uid://b38hcomu4tpm5"] [ext_resource type="Script" path="res://Scripts/TestCharacter.cs" id="1_hddqi"] [ext_resource type="PackedScene" uid="uid://dtyujwnb6w3kv" path="res://Models/TestModels/link.gltf" id="1_rwdbt"] +[ext_resource type="PackedScene" uid="uid://si4byubqnng4" path="res://Scenes/TestBullet.tscn" id="3_ojvu2"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_fqik1"] radius = 0.152487 @@ -10,6 +11,7 @@ height = 0.456443 [node name="Character" type="CharacterBody3D"] script = ExtResource("1_hddqi") _speed = 2.0 +_attackPattern = ExtResource("3_ojvu2") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] transform = Transform3D(0.999665, -0.0258978, -7.10543e-15, 0.0258978, 0.999665, 0, 0, 0, 1, 0, 0.19703, 0) @@ -18,4 +20,4 @@ shape = SubResource("CapsuleShape3D_fqik1") [node name="Pivot" type="Node3D" parent="."] [node name="link" parent="Pivot" instance=ExtResource("1_rwdbt")] -transform = Transform3D(-10, 0, 8.74228e-07, 0, 10, 0, -8.74228e-07, 0, -10, 0, 0, 0) +transform = Transform3D(10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0) diff --git a/Scenes/TestLevel.tscn b/Scenes/TestLevel.tscn index 3aec14f..3c72f9c 100644 --- a/Scenes/TestLevel.tscn +++ b/Scenes/TestLevel.tscn @@ -19,9 +19,13 @@ shape = SubResource("BoxShape3D_dk0pn") mesh = SubResource("BoxMesh_eaper") [node name="Camera3D" type="Camera3D" parent="."] -transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.118128, 5.82113, -1.13346) +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.118128, 8.18686, -1.13346) fov = 40.0 +[node name="DebugCamera" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.821149, 0.570714, 0, -0.570714, 0.821149, -0.36148, 1.40359, 0.864433) +visible = false + [node name="Link" parent="." instance=ExtResource("1_fwf6c")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) diff --git a/Scripts/Projectile.cs b/Scripts/Projectile.cs new file mode 100644 index 0000000..3d5e356 --- /dev/null +++ b/Scripts/Projectile.cs @@ -0,0 +1,22 @@ +using Godot; + +public partial class Projectile : Node3D +{ + [Export] + public double Cooldown { get; protected set; } + + [Export] + private float _projectileSpeed = 100f; + + public override void _Ready() + { + Speed = _projectileSpeed; + } + + public float Speed { get; private set; } + + public void OnTimeToLiveTimeout() + { + QueueFree(); + } +} diff --git a/Scripts/TestBullet.cs b/Scripts/TestBullet.cs new file mode 100644 index 0000000..d5d4ec6 --- /dev/null +++ b/Scripts/TestBullet.cs @@ -0,0 +1,10 @@ +using Godot; + +public partial class TestBullet : Projectile +{ + public override void _PhysicsProcess(double delta) + { + Translate(new Vector3(0, 0, Speed * -(float)delta)); + } + +} diff --git a/Scripts/TestCharacter.cs b/Scripts/TestCharacter.cs index 04a8260..b24e7a3 100644 --- a/Scripts/TestCharacter.cs +++ b/Scripts/TestCharacter.cs @@ -1,32 +1,46 @@ using Godot; -using System; public partial class TestCharacter : CharacterBody3D { - [Export] - private float _speed = 5.0f; + [Export] + private float _speed = 5.0f; + [Export] + private PackedScene _attackPattern; - public override void _PhysicsProcess(double delta) - { - Vector3 velocity = Velocity; + public override void _PhysicsProcess(double delta) + { + if (Input.IsActionJustPressed("p1_fire")) + Fire(); - // Get the input direction and handle the movement/deceleration. - // As good practice, you should replace UI actions with custom gameplay actions. - Vector2 inputDir = Input.GetVector("p1_left", "p1_right", "p1_up", "p1_down"); - Vector3 direction = (Transform.Basis * new Vector3(inputDir.X, 0, inputDir.Y)).Normalized(); - if (direction != Vector3.Zero) - { - velocity.X = direction.X * _speed; - velocity.Z = direction.Z * _speed; - GetNode("Pivot").LookAt(Position + direction, Vector3.Up); - } - else - { - velocity.X = Mathf.MoveToward(Velocity.X, 0, _speed); - velocity.Z = Mathf.MoveToward(Velocity.Z, 0, _speed); - } + Velocity = CalculateCharacterMovement(); + MoveAndSlide(); + } - Velocity = velocity; - MoveAndSlide(); - } + private Vector3 CalculateCharacterMovement() + { + var velocity = Velocity; + var inputDir = Input.GetVector("p1_left", "p1_right", "p1_up", "p1_down"); + var direction = (Transform.Basis * new Vector3(inputDir.X, 0, inputDir.Y)).Normalized(); + if (direction != Vector3.Zero) + { + velocity.X = direction.X * _speed; + velocity.Z = direction.Z * _speed; + GetNode("Pivot").LookAt(Position + -direction, Vector3.Up); + } + else + { + velocity.X = Mathf.MoveToward(Velocity.X, 0, _speed); + velocity.Z = Mathf.MoveToward(Velocity.Z, 0, _speed); + } + return velocity; + } + + private async void Fire() + { + GD.Print("Shoot"); + var projectile = _attackPattern.Instantiate(); + projectile.Position = Position + new Vector3(0f, 0f, -0.2f); + GetParent().AddChild(projectile); + await ToSignal(GetTree().CreateTimer(projectile.Cooldown), "timeout"); + } } diff --git a/project.godot b/project.godot index 6af3b13..88127e3 100644 --- a/project.godot +++ b/project.godot @@ -40,3 +40,17 @@ p1_down={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null) ] } +p1_fire={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +p1_altfire={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":2,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} + +[physics] + +common/physics_ticks_per_second=144