added controller support and attack

This commit is contained in:
2025-06-25 21:47:22 -05:00
parent 60432795f2
commit 36cde498e0
8 changed files with 103 additions and 20 deletions

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=14 format=3 uid="uid://bacgd5lmvaxea"] [gd_scene load_steps=15 format=3 uid="uid://bacgd5lmvaxea"]
[ext_resource type="Script" uid="uid://bcgt64gerg8pv" path="res://Scripts/player.gd" id="1_5wxv7"] [ext_resource type="Script" uid="uid://bcgt64gerg8pv" path="res://Scripts/player.gd" id="1_5wxv7"]
[ext_resource type="Material" uid="uid://b4rpp31c0dx2m" path="res://Assets/Materials/BasicMat.tres" id="1_y6xdh"] [ext_resource type="Material" uid="uid://b4rpp31c0dx2m" path="res://Assets/Materials/BasicMat.tres" id="1_y6xdh"]
@@ -28,6 +28,13 @@ tracks/0/keys = {
"update": 0, "update": 0,
"values": [Vector3(0, 0, 0)] "values": [Vector3(0, 0, 0)]
} }
tracks/1/type = "position_3d"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Body/ShittySword")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 0.652269, 0.475497, -0.696594)
[sub_resource type="Animation" id="Animation_hck1p"] [sub_resource type="Animation" id="Animation_hck1p"]
resource_name = "dodge" resource_name = "dodge"
@@ -45,9 +52,28 @@ tracks/0/keys = {
"values": [Vector3(0, 0, 0), Vector3(0, 0, 6.28319)] "values": [Vector3(0, 0, 0), Vector3(0, 0, 6.28319)]
} }
[sub_resource type="Animation" id="Animation_4qbli"]
resource_name = "attack"
length = 0.5
tracks/0/type = "position_3d"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Body/ShittySword")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, 0.652269, 0.475497, -0.696594, 0.166667, 1, 0.870782, 0.475497, -0.508641, 0.193146, 1, 0.870782, 0.475497, -0.508641, 0.3, 1, -0.309897, 0.475497, -0.720175, 0.433352, 1, 0.652269, 0.475497, -0.696594)
tracks/1/type = "rotation_3d"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Body/ShittySword")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 0, -0.86255, 0, 0.505973, 0.166667, 1, 0, 0.949105, 0, -0.314961, 0.193146, 1, 0, 0.949105, 0, -0.314961, 0.3, 1, 0, -0.371061, 0, 0.928609, 0.433352, 1, 0, -0.86255, 0, 0.505973)
[sub_resource type="AnimationLibrary" id="AnimationLibrary_4qbli"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_4qbli"]
_data = { _data = {
&"RESET": SubResource("Animation_juxdh"), &"RESET": SubResource("Animation_juxdh"),
&"attack": SubResource("Animation_4qbli"),
&"dodge": SubResource("Animation_hck1p") &"dodge": SubResource("Animation_hck1p")
} }
@@ -88,8 +114,8 @@ metadata/extras = {
[node name="Character1" parent="Body" instance=ExtResource("7_juxdh")] [node name="Character1" parent="Body" instance=ExtResource("7_juxdh")]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, -0.5, 0.0393383) transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, -0.5, 0.0393383)
[node name="MeshInstance3D" type="MeshInstance3D" parent="Body"] [node name="ShittySword" type="MeshInstance3D" parent="Body"]
transform = Transform3D(-0.487982, 0, -0.872854, 0, 1, 0, 0.872854, 0, -0.487982, 0.652269, 0.475497, -0.696594) transform = Transform3D(-0.487984, 0, -0.872853, 0, 1, 0, 0.872853, 0, -0.487984, 0.652269, 0.475497, -0.696594)
mesh = SubResource("BoxMesh_5wxv7") mesh = SubResource("BoxMesh_5wxv7")
skeleton = NodePath("../..") skeleton = NodePath("../..")

View File

@@ -0,0 +1,8 @@
extends Node
class_name ControlMapping
## GAMEPAD
const JOYSTICK_SENSITIVITY = .06
const R_JOYSTICK_DEADZONE = 0.1
const L_JOYSTICK_DEADZONE = .2
const L_JOYSTICK_SENSITIVITY = .1

View File

@@ -0,0 +1 @@
uid://dgdo7g1x7sk4b

View File

@@ -14,10 +14,11 @@ var health = MAX_HEALTH
const MAX_STAMINA : float = 100 const MAX_STAMINA : float = 100
var stamina = MAX_STAMINA var stamina = MAX_STAMINA
const STAMINA_REGEN_RATE = 10.0
## Gameplay Settings ## Gameplay Settings
const STAMINA_REGEN_RATE = 10.0
const DODGE_STAMINA_COST = 30.0 const DODGE_STAMINA_COST = 30.0
const ATTACK_STAMINA_COST = 10.0
func _physics_process(delta: float) -> void: func _physics_process(delta: float) -> void:
stamina_regen(delta) stamina_regen(delta)

View File

@@ -1,2 +1,11 @@
extends State extends PlayerState
class_name PlayerAttack class_name PlayerAttack
func Enter():
character.anim_player.play("attack")
character.velocity.x = 0
character.velocity.z = 0
func Update(delta):
if !character.anim_player.is_playing():
Transitioned.emit(self,"on floor")

View File

@@ -7,13 +7,4 @@ func Physics_Update(delta):
body_look_at_mouse() body_look_at_mouse()
apply_gravity(delta) apply_gravity(delta)
respawn_on_fall(delta) respawn_on_fall(delta)
attack()
func dodge_roll():
if character.is_on_floor():
if character.stamina > character.DODGE_STAMINA_COST:
if Input.is_action_just_pressed("dodge"):
var dodge_direction = Input.get_vector("move_left", "move_right", "move_forward", "move_backward")
if dodge_direction:
character.stamina -= character.DODGE_STAMINA_COST
character.dodge_direction = dodge_direction
Transitioned.emit(self,"dodge roll")

View File

@@ -45,13 +45,50 @@ func body_look_at_mouse():
func standard_movement(delta): func standard_movement(delta):
if character.is_on_floor(): if character.is_on_floor():
var input_dir = Input.get_vector("move_left", "move_right", "move_forward", "move_backward") # Get KB Input
var current_movement = movement_input()
if input_dir != null: if current_movement != null:
character.velocity.x = lerp(character.velocity.x, input_dir.x * move_speed, delta * move_transition_speed) character.velocity.x = lerp(character.velocity.x, current_movement.x * move_speed, delta * move_transition_speed)
character.velocity.z = lerp(character.velocity.z, input_dir.y * move_speed,delta * move_transition_speed) character.velocity.z = lerp(character.velocity.z, current_movement.y * move_speed,delta * move_transition_speed)
else: else:
if character.velocity: if character.velocity:
const MOMENTUM = 2.0 const MOMENTUM = 2.0
character.velocity.x = lerp(character.velocity.x, 0.0,delta * MOMENTUM) character.velocity.x = lerp(character.velocity.x, 0.0,delta * MOMENTUM)
character.velocity.z = lerp(character.velocity.z, 0.0,delta * MOMENTUM) character.velocity.z = lerp(character.velocity.z, 0.0,delta * MOMENTUM)
func movement_input():
# Get KB Input
var input_dir = Input.get_vector("move_left", "move_right", "move_forward", "move_backward")
# Add Controller Input
if abs(Input.get_joy_axis(0,JOY_AXIS_LEFT_X)) > ControlMapping.L_JOYSTICK_SENSITIVITY or abs(Input.get_joy_axis(0,JOY_AXIS_LEFT_Y)) > ControlMapping.L_JOYSTICK_SENSITIVITY:
input_dir += joypad_walk()
return input_dir
func joypad_walk():
# Joypad right stick look control
var dir_out = Vector2(0,0)
var xAxis = Input.get_joy_axis(0,JOY_AXIS_LEFT_X)
var yAxis = Input.get_joy_axis(0,JOY_AXIS_LEFT_Y)
if abs(xAxis) > ControlMapping.L_JOYSTICK_DEADZONE:
dir_out.x = xAxis
if abs(yAxis) > ControlMapping.L_JOYSTICK_DEADZONE:
dir_out.y = yAxis
return dir_out
func dodge_roll():
if character.is_on_floor():
if Input.is_action_just_pressed("dodge"):
if character.stamina > character.DODGE_STAMINA_COST:
var dodge_direction = movement_input()
if dodge_direction:
character.stamina -= character.DODGE_STAMINA_COST
character.dodge_direction = dodge_direction
Transitioned.emit(self,"dodge roll")
func attack():
if Input.is_action_just_pressed("attack"):
if character.stamina > character.ATTACK_STAMINA_COST:
character.stamina -= character.ATTACK_STAMINA_COST
Transitioned.emit(self,"attack")

View File

@@ -18,6 +18,7 @@ config/icon="res://icon.svg"
[autoload] [autoload]
MousePos="*res://Scripts/mouse_pos.gd" MousePos="*res://Scripts/mouse_pos.gd"
ControlMappings="*res://Scripts/control_mappings.gd"
[display] [display]
@@ -48,16 +49,25 @@ move_backward={
dodge={ dodge={
"deadzone": 0.2, "deadzone": 0.2,
"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":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) "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":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":true,"script":null)
] ]
} }
scroll_up={ scroll_up={
"deadzone": 0.2, "deadzone": 0.2,
"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":4,"canceled":false,"pressed":false,"double_click":false,"script":null) "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":4,"canceled":false,"pressed":false,"double_click":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":11,"pressure":0.0,"pressed":true,"script":null)
] ]
} }
scroll_down={ scroll_down={
"deadzone": 0.2, "deadzone": 0.2,
"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":5,"canceled":false,"pressed":false,"double_click":false,"script":null) "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":5,"canceled":false,"pressed":false,"double_click":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":12,"pressure":0.0,"pressed":true,"script":null)
]
}
attack={
"deadzone": 0.2,
"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)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":10,"pressure":0.0,"pressed":true,"script":null)
] ]
} }