From f3cc4a774b08d34a34b1ded2cd15ad6bdaf6ea9d Mon Sep 17 00:00:00 2001 From: Brandon Marshall Date: Mon, 19 Aug 2024 21:46:36 -0700 Subject: [PATCH] Add Joystick --- Characters/Hero/hero.gd | 2 ++ Menus/MainMenu.tscn | 2 +- UI/Joystick.tscn | 49 ++++++++++++++++++++++++++++++++++++ UI/UI.tscn | 6 ++++- UI/joystick.gd | 55 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 UI/Joystick.tscn create mode 100644 UI/joystick.gd diff --git a/Characters/Hero/hero.gd b/Characters/Hero/hero.gd index 5276e76..4e9cd13 100644 --- a/Characters/Hero/hero.gd +++ b/Characters/Hero/hero.gd @@ -63,6 +63,8 @@ func get_input(): #var run := Input.is_action_pressed("run") #var attack := Input.is_action_pressed("attack") var input_direction := Input.get_vector("left", "right", "up", "down") + if GameManager.game_state.has("joystick"): + input_direction = GameManager.game_state["joystick"] var rest = input_direction == Vector2.ZERO var interact := Input.is_action_pressed("interact") var interact2 := Input.is_action_pressed("interact2") diff --git a/Menus/MainMenu.tscn b/Menus/MainMenu.tscn index 8cf0ee5..bf69c30 100644 --- a/Menus/MainMenu.tscn +++ b/Menus/MainMenu.tscn @@ -80,7 +80,7 @@ scene_path = "res://Menus/TestsMenu.tscn" layout_mode = 2 text = "Quit" -[node name="Gmtk2024-logo" type="Sprite2D" parent="."] +[node name="Gmtk2024-logo" type="Sprite2D" parent="Panel"] position = Vector2(1016.4, 567.125) scale = Vector2(0.127493, 0.127493) texture = ExtResource("4_xf6fx") diff --git a/UI/Joystick.tscn b/UI/Joystick.tscn new file mode 100644 index 0000000..4a24b6b --- /dev/null +++ b/UI/Joystick.tscn @@ -0,0 +1,49 @@ +[gd_scene load_steps=6 format=3 uid="uid://crd0d1dxajbfi"] + +[ext_resource type="Script" path="res://UI/joystick.gd" id="1_0lls8"] + +[sub_resource type="Gradient" id="Gradient_l1esd"] +offsets = PackedFloat32Array(0.543544, 0.54955) +colors = PackedColorArray(1, 1, 1, 1, 0, 0, 0, 0) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_beaca"] +gradient = SubResource("Gradient_l1esd") +fill = 1 +fill_from = Vector2(0.5, 0.5) + +[sub_resource type="Gradient" id="Gradient_04c1n"] +offsets = PackedFloat32Array(0.552553, 0.555556, 0.606607, 0.612613) +colors = PackedColorArray(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_6y6lu"] +gradient = SubResource("Gradient_04c1n") +width = 256 +height = 256 +fill = 1 +fill_from = Vector2(0.5, 0.5) + +[node name="Joystick" type="Node2D"] +script = ExtResource("1_0lls8") + +[node name="Knob" type="Sprite2D" parent="."] +texture = SubResource("GradientTexture2D_beaca") + +[node name="Ring" type="Sprite2D" parent="."] +texture = SubResource("GradientTexture2D_6y6lu") + +[node name="Button" type="Button" parent="."] +modulate = Color(1, 1, 1, 0) +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -128.0 +offset_top = -128.0 +offset_right = 128.0 +offset_bottom = 128.0 +grow_horizontal = 2 +grow_vertical = 2 + +[connection signal="button_down" from="Button" to="." method="_on_button_button_down"] +[connection signal="button_up" from="Button" to="." method="_on_button_button_up"] diff --git a/UI/UI.tscn b/UI/UI.tscn index f9b1bd5..a65f2d9 100644 --- a/UI/UI.tscn +++ b/UI/UI.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=4 format=3 uid="uid://c4f4xoibdq0s3"] +[gd_scene load_steps=5 format=3 uid="uid://c4f4xoibdq0s3"] [ext_resource type="Script" path="res://UI/progress_bar.gd" id="1_0ykeg"] [ext_resource type="Theme" uid="uid://bewgrgj1ylev2" path="res://Menus/MenuTheme.tres" id="1_1l0h6"] [ext_resource type="Script" path="res://Scripts/Debug.gd" id="2_i4ly0"] +[ext_resource type="PackedScene" uid="uid://crd0d1dxajbfi" path="res://UI/Joystick.tscn" id="4_cyln3"] [node name="UI" type="CanvasLayer"] @@ -50,3 +51,6 @@ text = "Debug" horizontal_alignment = 2 script = ExtResource("2_i4ly0") metadata/_edit_use_anchors_ = true + +[node name="Joystick" parent="." instance=ExtResource("4_cyln3")] +position = Vector2(1028, 525) diff --git a/UI/joystick.gd b/UI/joystick.gd new file mode 100644 index 0000000..fa9eb12 --- /dev/null +++ b/UI/joystick.gd @@ -0,0 +1,55 @@ +extends Node2D + +@onready var knob = $Knob + +var pressing := false +var posVector : Vector2 +var show_debug := false + +@export var maxLength = 64 +@export var deadzone = 5 + +# Called when the node enters the scene tree for the first time. +func _ready(): + maxLength *= scale.x + visible = OS.has_feature("mobile") or show_debug + set_process(visible) + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + + if pressing: + if get_global_mouse_position().distance_to(global_position) <= maxLength: + knob.global_position = get_global_mouse_position() + else: + var angle = global_position.angle_to_point(get_global_mouse_position()) + knob.global_position.x = global_position.x + cos(angle)*maxLength + knob.global_position.y = global_position.y + sin(angle)*maxLength + calculateVector() + else: + knob.global_position = lerp(knob.global_position, global_position, delta*10) + posVector = Vector2.ZERO + GameManager.game_state["joystick"] = posVector + +func calculateVector(): + if abs((knob.global_position.x - global_position.x)) - deadzone: + posVector.x = (knob.global_position.x - global_position.x)/maxLength + if abs((knob.global_position.y - global_position.y)) - deadzone: + posVector.y = (knob.global_position.y - global_position.y)/maxLength + +func _on_button_button_down(): + pressing = true + +func _on_button_button_up(): + pressing = false + + +func _input(event): + if event.is_action_pressed("terminal"): + show_debug = not show_debug; + if show_debug: + visible = true + set_process(true) + else: + posVector = Vector2.ZERO + GameManager.game_state.erase("joystick")