From a32ac09b04a7963a5a0293ecf9cb2abe3e8cfef4 Mon Sep 17 00:00:00 2001 From: Rendo Date: Fri, 21 Nov 2025 00:56:23 +0500 Subject: [PATCH] State machine and crosshair --- levels/prototype_scene.tscn | 1 + project.godot | 4 +++ scenes/player.tscn | 37 +++++++++++++++++++++++++--- scritps/player/crosshair.gd | 21 ++++++++++++++++ scritps/player/crosshair.gd.uid | 1 + scritps/player/player.gd | 2 +- scritps/player/player_global.gd | 4 +++ scritps/player/player_global.gd.uid | 1 + scritps/state_machine/machine.gd | 36 +++++++++++++++++++++++++++ scritps/state_machine/machine.gd.uid | 1 + scritps/state_machine/state.gd | 12 +++++++++ scritps/state_machine/state.gd.uid | 1 + 12 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 scritps/player/crosshair.gd create mode 100644 scritps/player/crosshair.gd.uid create mode 100644 scritps/player/player_global.gd create mode 100644 scritps/player/player_global.gd.uid create mode 100644 scritps/state_machine/machine.gd create mode 100644 scritps/state_machine/machine.gd.uid create mode 100644 scritps/state_machine/state.gd create mode 100644 scritps/state_machine/state.gd.uid diff --git a/levels/prototype_scene.tscn b/levels/prototype_scene.tscn index 980f324..9e82504 100644 --- a/levels/prototype_scene.tscn +++ b/levels/prototype_scene.tscn @@ -16,6 +16,7 @@ environment = ExtResource("1_i6jab") [node name="Player" parent="." instance=ExtResource("2_ajphm")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.073462, 1.5000002, -0.5869317) +SPEED = 10.0 TOGGLE_CROUCH = false [node name="CSGCombiner3D" type="CSGCombiner3D" parent="."] diff --git a/project.godot b/project.godot index bfae44b..7094370 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,10 @@ run/main_scene="uid://cqrh2cc7m2i7f" config/features=PackedStringArray("4.5", "Forward Plus") config/icon="res://icon.svg" +[autoload] + +PlayerGlobal="*res://scritps/player/player_global.gd" + [input] plr_forward={ diff --git a/scenes/player.tscn b/scenes/player.tscn index ec58289..dd5bb40 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=9 format=3 uid="uid://dpsr6ug3pkb40"] +[gd_scene load_steps=10 format=3 uid="uid://dpsr6ug3pkb40"] [ext_resource type="Script" uid="uid://3dphlay25fih" path="res://scritps/player/player.gd" id="1_g2els"] +[ext_resource type="Script" uid="uid://dalwlndejfdhm" path="res://scritps/player/crosshair.gd" id="3_dqkch"] [ext_resource type="Script" uid="uid://bjhbdh6xsjgnn" path="res://scritps/player/player_camera.gd" id="3_qhqgy"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_u8vuu"] @@ -44,9 +45,6 @@ tracks/2/keys = { "values": [Vector3(0, 2, 0), Vector3(0, 1.5, 0)] } -[sub_resource type="Animation" id="Animation_qhqgy"] -resource_name = "Stand" - [sub_resource type="Animation" id="Animation_dqkch"] length = 0.001 tracks/0/type = "value" @@ -86,6 +84,9 @@ tracks/2/keys = { "values": [Vector3(0, 2, 0)] } +[sub_resource type="Animation" id="Animation_qhqgy"] +resource_name = "Stand" + [sub_resource type="AnimationLibrary" id="AnimationLibrary_qlg0r"] _data = { &"Crouch": SubResource("Animation_g2els"), @@ -125,3 +126,31 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) shape = SubResource("CapsuleShape3D_g2els") debug_color = Color(0.9878064, 0, 0.31407458, 0.41960785) debug_fill = false + +[node name="HUD" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Crosshair" type="Control" parent="HUD"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -20.0 +offset_top = -20.0 +offset_right = 20.0 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("3_dqkch") +crosses_width = 2.0 +crosses_length = 6.0 +crosses_offset = 3.0 + +[node name="MovementMachine" type="Node" parent="."] diff --git a/scritps/player/crosshair.gd b/scritps/player/crosshair.gd new file mode 100644 index 0000000..e601de4 --- /dev/null +++ b/scritps/player/crosshair.gd @@ -0,0 +1,21 @@ +extends Control + + +@export var outline: bool = true +@export var outline_color: Color = Color.BLACK +@export var outline_width: float = 0.1 + +@export var dot_radius: float = 1.0 +@export var dot_color: Color = Color.WHITE + +@export var crosses_width: float = 1.0 +@export var crosses_length: float = 2.0 +@export var crosses_offset: float = 0.2 +@export var crosses_color: Color = Color.WHITE + +func _draw() -> void: + draw_circle(Vector2(0,0),dot_radius,dot_color,true,outline_width) + for i in range(0,4): + var direction: Vector2 = Vector2.RIGHT.rotated(i*PI/2) + var offset_position: Vector2 = direction * crosses_offset + draw_line(offset_position,direction*crosses_length+offset_position,crosses_color,crosses_width) diff --git a/scritps/player/crosshair.gd.uid b/scritps/player/crosshair.gd.uid new file mode 100644 index 0000000..bf6b128 --- /dev/null +++ b/scritps/player/crosshair.gd.uid @@ -0,0 +1 @@ +uid://dalwlndejfdhm diff --git a/scritps/player/player.gd b/scritps/player/player.gd index 5dc0cca..be40fc1 100644 --- a/scritps/player/player.gd +++ b/scritps/player/player.gd @@ -22,7 +22,7 @@ var crouched: bool = false: var potential_crouched: bool = crouched -func _process(delta: float) -> void: +func _process(_delta: float) -> void: if potential_crouched != crouched: crouched = potential_crouched diff --git a/scritps/player/player_global.gd b/scritps/player/player_global.gd new file mode 100644 index 0000000..e821755 --- /dev/null +++ b/scritps/player/player_global.gd @@ -0,0 +1,4 @@ +extends Node + + +var player: CharacterBody3D diff --git a/scritps/player/player_global.gd.uid b/scritps/player/player_global.gd.uid new file mode 100644 index 0000000..36a2887 --- /dev/null +++ b/scritps/player/player_global.gd.uid @@ -0,0 +1 @@ +uid://dv3pm11t6p4si diff --git a/scritps/state_machine/machine.gd b/scritps/state_machine/machine.gd new file mode 100644 index 0000000..c51e3c8 --- /dev/null +++ b/scritps/state_machine/machine.gd @@ -0,0 +1,36 @@ +extends Node + + +class_name StateMachine + +@export var current_state: State +var states: Dictionary[StringName,State] = {} + +func _ready() -> void: + for child in get_children(): + if child is State: + states[child.name] = child + child.transition.connect(on_transition_required) + else: + push_warning("Child of state machine is not state") + +func on_transition_required(to: StringName): + if states.has(to) == false: + push_warning("Incorrect state request: " + to) + return + + current_state.exit() + current_state = states[to] + current_state.enter() + +func _process(delta: float) -> void: + if current_state == null: + push_error("State is not set") + return + current_state.update(delta) + +func _physics_process(delta: float) -> void: + if current_state == null: + push_error("State is not set") + return + current_state.physics_update(delta) diff --git a/scritps/state_machine/machine.gd.uid b/scritps/state_machine/machine.gd.uid new file mode 100644 index 0000000..a84fda8 --- /dev/null +++ b/scritps/state_machine/machine.gd.uid @@ -0,0 +1 @@ +uid://3777rkbebgjm diff --git a/scritps/state_machine/state.gd b/scritps/state_machine/state.gd new file mode 100644 index 0000000..a9e4aca --- /dev/null +++ b/scritps/state_machine/state.gd @@ -0,0 +1,12 @@ +@abstract +extends Node + + +class_name State + +signal transition(to: StringName) + +@abstract func enter() -> void +@abstract func exit() -> void +@abstract func update(delta: float) -> void +@abstract func physics_update(delta: float) -> void diff --git a/scritps/state_machine/state.gd.uid b/scritps/state_machine/state.gd.uid new file mode 100644 index 0000000..cb89ea8 --- /dev/null +++ b/scritps/state_machine/state.gd.uid @@ -0,0 +1 @@ +uid://cmsphnymgquwq