Basic player controls and aiming

This commit is contained in:
Haze Weathers 2024-08-21 21:02:35 -04:00
parent 56695d303e
commit f5999da412
114 changed files with 6611 additions and 2 deletions

17
objects/interactable.gd Normal file
View file

@ -0,0 +1,17 @@
@tool
class_name Interactable
extends Area2D
signal interacted(user: Node)
func _init() -> void:
collision_layer = 0b0100_0000 # Layer 7 (interactable)
collision_mask = 0
input_pickable = false
monitoring = false
func interact(user: Node) -> void:
interacted.emit(user)

119
objects/player/player.gd Normal file
View file

@ -0,0 +1,119 @@
class_name Player
extends CharacterBody2D
@export_group("Grounded Movement")
@export var walk_speed: float = 120.0
@export var acceleration: float = 120.0
@export var stopping_force: float = 320.0
@export var stop_threshold: float = 4.0
@export var turning_force: float = 450.0
@onready var state_chart: StateChart = %StateChart
@onready var graphics: Node2D = %Graphics
@onready var animation_player: AnimationPlayer = %AnimationPlayer
@onready var front_arm_pivot: Node2D = %FrontArmPivot
@onready var back_arm_pivot: Node2D = %BackArmPivot
var input_dir: float = 0.0
var aim_back_arm: bool = false
var _was_on_floor: bool = true
func _ready() -> void:
state_chart.set_expression_property(&"player", self)
func _physics_process(delta: float) -> void:
_face_body_to_mouse()
if is_on_floor():
state_chart.send_event(&"landed")
else:
state_chart.send_event(&"left_ground")
var old_input_dir = input_dir
input_dir = signf(Input.get_axis(&"move_left", &"move_right"))
if input_dir != old_input_dir:
state_chart.send_event(&"input_dir_changed")
func _input(event: InputEvent) -> void:
if event.is_action_pressed(&"aim"):
state_chart.send_event(&"aim_pressed")
elif event.is_action_released(&"aim"):
state_chart.send_event(&"aim_released")
func toss_held_object() -> void:
pass
func _face_body_to_mouse() -> void:
if get_local_mouse_position().x < 0.0:
graphics.scale.x = -1.0
else:
graphics.scale.x = 1.0
func _face_arm_to_mouse(pivot: Node2D) -> void:
var mouse_pos = graphics.get_local_mouse_position()
var pivot_xform = pivot.get_relative_transform_to_parent(graphics)
pivot.rotation = pivot_xform.origin.angle_to_point(mouse_pos)
#region Movement States
func _active_physics_process(delta: float) -> void:
move_and_slide()
#region Grounded States
func _grounded_child_state_entered() -> void:
state_chart.send_event(&"input_dir_changed")
func _standing_entered() -> void:
velocity.x = 0.0
func _walking_process(delta: float) -> void:
velocity.x += acceleration * input_dir * delta
velocity.x = clampf(velocity.x, -walk_speed, walk_speed)
animation_player.speed_scale = inverse_lerp(0, walk_speed, velocity.x) * graphics.scale.x
func _stopping_physics_process(delta: float) -> void:
velocity.x -= stopping_force * signf(velocity.x) * delta
if absf(velocity.x) <= stop_threshold:
velocity.x = 0.0
state_chart.send_event(&"stopped")
func _turning_physics_process(delta: float) -> void:
velocity.x += turning_force * input_dir * delta
if signf(velocity.x) != -input_dir:
state_chart.send_event(&"turn_finished")
func _aiming_physics_process(delta: float) -> void:
_face_arm_to_mouse(front_arm_pivot)
if aim_back_arm:
_face_arm_to_mouse(back_arm_pivot)
func _aiming_exited() -> void:
front_arm_pivot.rotation = PI * 0.5
back_arm_pivot.rotation = PI * 0.5
#endregion
#region Airborn States
func _airborn_physics_process(delta: float) -> void:
velocity += get_gravity() * delta
#endregion
#endregion

889
objects/player/player.tscn Normal file
View file

@ -0,0 +1,889 @@
[gd_scene load_steps=34 format=3 uid="uid://dfx8h6eplcm6t"]
[ext_resource type="Script" path="res://objects/player/player.gd" id="1_0jtcw"]
[ext_resource type="Texture2D" uid="uid://cm07m02mxkaah" path="res://textures/player/arm_back.png" id="2_ux0fy"]
[ext_resource type="Script" path="res://addons/godot_state_charts/state_chart.gd" id="2_wtq62"]
[ext_resource type="Texture2D" uid="uid://c5mdfp0haxjhw" path="res://textures/player/arm_back_hand.png" id="3_7fclw"]
[ext_resource type="Script" path="res://addons/godot_state_charts/parallel_state.gd" id="3_h5pyx"]
[ext_resource type="Texture2D" uid="uid://qfsmi63hvbwj" path="res://textures/player/arm_front.png" id="3_jvia3"]
[ext_resource type="Texture2D" uid="uid://b8mjub1y54bsp" path="res://textures/player/arm_front_hand.png" id="4_kyw60"]
[ext_resource type="Script" path="res://addons/godot_state_charts/compound_state.gd" id="4_le3t4"]
[ext_resource type="Script" path="res://addons/godot_state_charts/atomic_state.gd" id="5_8e8ei"]
[ext_resource type="Script" path="res://addons/godot_state_charts/transition.gd" id="6_d3xxl"]
[ext_resource type="Script" path="res://addons/godot_state_charts/expression_guard.gd" id="7_yp0np"]
[ext_resource type="Texture2D" uid="uid://x3q6bebo0qwg" path="res://textures/player/leg_back.png" id="8_kdi1l"]
[ext_resource type="Script" path="res://addons/godot_state_charts/not_guard.gd" id="8_qwrs2"]
[ext_resource type="Script" path="res://addons/godot_state_charts/guard.gd" id="9_0g7ju"]
[ext_resource type="Texture2D" uid="uid://dd6x23rk0jkhv" path="res://textures/player/foot_back.png" id="9_2a4p0"]
[ext_resource type="Script" path="res://scripts/debug_visualization/draw_basis.gd" id="9_x2hvg"]
[ext_resource type="Texture2D" uid="uid://damqh4mqwpv4b" path="res://textures/player/torso.png" id="10_2vegm"]
[ext_resource type="Script" path="res://addons/godot_state_charts/all_of_guard.gd" id="10_lprgf"]
[ext_resource type="Texture2D" uid="uid://cp7sodu1rhdje" path="res://textures/player/leg_front.png" id="11_6xvc8"]
[ext_resource type="Texture2D" uid="uid://c4odsqtqmj8g" path="res://textures/player/head.png" id="11_nngs1"]
[ext_resource type="Texture2D" uid="uid://d1qyuom3pxifj" path="res://textures/player/foot_front.png" id="12_dda5a"]
[ext_resource type="Texture2D" uid="uid://cssnogcrn57xv" path="res://textures/player/skirt.png" id="13_qgkik"]
[sub_resource type="Animation" id="Animation_6roai"]
resource_name = "stand"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Graphics/Hip:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(0, -14)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Graphics/Hip:rotation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Graphics/Hip/BackLeg:rotation")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Graphics/Hip/BackLeg/BackFoot:rotation")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Graphics/Hip/BackArmPivot/BackArm:rotation")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [-1.57079]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Graphics/Hip/BackArmPivot/BackArm/BackHand:rotation")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Graphics/Hip/Torso:rotation")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Graphics/Hip/Torso/Head:rotation")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Graphics/Hip/FrontArmPivot/FrontArm:rotation")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [-1.5708]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("Graphics/Hip/FrontArmPivot/FrontArm/FrontHand:rotation")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/10/type = "value"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("Graphics/Hip/FrontLeg:rotation")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/11/type = "value"
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/path = NodePath("Graphics/Hip/FrontLeg/FrontFoot:rotation")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/12/type = "value"
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/path = NodePath("Graphics/Hip/Skirt:rotation")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/13/type = "value"
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/path = NodePath("Graphics/Hip/FrontLeg:position")
tracks/13/interp = 1
tracks/13/loop_wrap = true
tracks/13/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(-2, 6)]
}
tracks/14/type = "value"
tracks/14/imported = false
tracks/14/enabled = true
tracks/14/path = NodePath("Graphics/Hip/BackLeg:position")
tracks/14/interp = 1
tracks/14/loop_wrap = true
tracks/14/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(1, 6)]
}
[sub_resource type="Animation" id="Animation_7ampj"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Graphics/Hip:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(0, -14)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Graphics/Hip:rotation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Graphics/Hip/BackLeg:rotation")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Graphics/Hip/BackLeg/BackFoot:rotation")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Graphics/Hip/BackArmPivot/BackArm:rotation")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [-1.57079]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Graphics/Hip/BackArmPivot/BackArm/BackHand:rotation")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Graphics/Hip/Torso:rotation")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Graphics/Hip/Torso/Head:rotation")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Graphics/Hip/FrontArmPivot/FrontArm:rotation")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [-1.5708]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("Graphics/Hip/FrontArmPivot/FrontArm/FrontHand:rotation")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/10/type = "value"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("Graphics/Hip/FrontLeg:rotation")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/11/type = "value"
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/path = NodePath("Graphics/Hip/FrontLeg/FrontFoot:rotation")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/12/type = "value"
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/path = NodePath("Graphics/Hip/Skirt:rotation")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/13/type = "value"
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/path = NodePath("Graphics/Hip/FrontLeg:position")
tracks/13/interp = 1
tracks/13/loop_wrap = true
tracks/13/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(-2, 6)]
}
tracks/14/type = "value"
tracks/14/imported = false
tracks/14/enabled = true
tracks/14/path = NodePath("Graphics/Hip/BackLeg:position")
tracks/14/interp = 1
tracks/14/loop_wrap = true
tracks/14/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(1, 6)]
}
[sub_resource type="Animation" id="Animation_eoejb"]
resource_name = "walk"
length = 0.960004
loop_mode = 1
step = 0.04
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Graphics/Hip:position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.12, 0.24, 0.36, 0.48, 0.6, 0.72, 0.84),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [Vector2(0, -13), Vector2(0, -12), Vector2(0, -14), Vector2(0, -15), Vector2(0, -13), Vector2(0, -12), Vector2(0, -14), Vector2(0, -15)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Graphics/Hip:rotation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Graphics/Hip/BackLeg:rotation")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.12, 0.24, 0.36, 0.48, 0.6, 0.72, 0.84),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [0.595709, 0.637986, -0.261799, -0.648994, -0.629291, -0.971209, 0.0, 0.430862]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Graphics/Hip/BackLeg/BackFoot:rotation")
tracks/3/interp = 2
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.12, 0.24, 0.36, 0.48, 0.6, 0.72),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [0.364786, 0.570075, 1.309, 0.98228, 0.0486702, 0.958074, 0.0]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Graphics/Hip/BackArmPivot/BackArm:rotation")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [-1.57079]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Graphics/Hip/BackArmPivot/BackArm/BackHand:rotation")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Graphics/Hip/Torso:rotation")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Graphics/Hip/Torso/Head:rotation")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Graphics/Hip/FrontArmPivot/FrontArm:rotation")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [-1.5708]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("Graphics/Hip/FrontArmPivot/FrontArm/FrontHand:rotation")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/10/type = "value"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("Graphics/Hip/FrontLeg:rotation")
tracks/10/interp = 2
tracks/10/loop_wrap = true
tracks/10/keys = {
"times": PackedFloat32Array(0, 0.12, 0.24, 0.36, 0.48, 0.6, 0.72, 0.84),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [-0.633345, -1.02087, 0.0, 0.376222, 0.593412, 0.681726, -0.399987, -0.691819]
}
tracks/11/type = "value"
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/path = NodePath("Graphics/Hip/FrontLeg/FrontFoot:rotation")
tracks/11/interp = 2
tracks/11/loop_wrap = true
tracks/11/keys = {
"times": PackedFloat32Array(0, 0.12, 0.24, 0.48, 0.6, 0.72, 0.84),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [0.023663, 1.03073, 0.0, 0.349066, 0.618152, 1.4997, 0.971881]
}
tracks/12/type = "value"
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/path = NodePath("Graphics/Hip/Skirt:rotation")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/13/type = "value"
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/path = NodePath("Graphics/Hip/FrontLeg:position")
tracks/13/interp = 2
tracks/13/loop_wrap = true
tracks/13/keys = {
"times": PackedFloat32Array(0, 0.12, 0.24, 0.36, 0.48, 0.6, 0.72),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [Vector2(-1, 6), Vector2(-1, 6), Vector2(-1, 6), Vector2(-1, 7), Vector2(-1, 6), Vector2(0, 6), Vector2(-1, 6)]
}
tracks/14/type = "value"
tracks/14/imported = false
tracks/14/enabled = true
tracks/14/path = NodePath("Graphics/Hip/BackLeg:position")
tracks/14/interp = 2
tracks/14/loop_wrap = true
tracks/14/keys = {
"times": PackedFloat32Array(0, 0.12, 0.36, 0.48, 0.84),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 0,
"values": [Vector2(-2.38419e-07, 6), Vector2(-2.38419e-07, 6), Vector2(-2.38419e-07, 6), Vector2(2.38419e-07, 6), Vector2(-1, 7)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_claqb"]
_data = {
"RESET": SubResource("Animation_7ampj"),
"stand": SubResource("Animation_6roai"),
"walk": SubResource("Animation_eoejb")
}
[sub_resource type="RectangleShape2D" id="RectangleShape2D_wydm2"]
size = Vector2(7, 32)
[sub_resource type="Resource" id="Resource_hwvj2"]
resource_name = "HoldingDirection"
script = ExtResource("7_yp0np")
expression = "player.input_dir != 0.0"
[sub_resource type="Resource" id="Resource_h756l"]
resource_name = "NotHoldingDirection"
script = ExtResource("8_qwrs2")
guard = SubResource("Resource_hwvj2")
[sub_resource type="Resource" id="Resource_42obj"]
resource_name = "HoldingSameDirection"
script = ExtResource("7_yp0np")
expression = "player.input_dir == signf(player.velocity.x)"
[sub_resource type="Resource" id="Resource_hbuhf"]
resource_name = "NotHoldingSame"
script = ExtResource("8_qwrs2")
guard = SubResource("Resource_42obj")
[sub_resource type="Resource" id="Resource_7h7ld"]
script = ExtResource("10_lprgf")
guards = Array[ExtResource("9_0g7ju")]([SubResource("Resource_hwvj2"), SubResource("Resource_hbuhf")])
[sub_resource type="Resource" id="Resource_5aa0s"]
resource_name = "HoldingTowardsVelocity"
script = ExtResource("10_lprgf")
guards = Array[ExtResource("9_0g7ju")]([SubResource("Resource_hwvj2"), SubResource("Resource_42obj")])
[node name="Player" type="CharacterBody2D"]
process_physics_priority = -100
editor_description = "Has lower physics processing priority so that state events happen first."
collision_layer = 2
floor_snap_length = 4.0
script = ExtResource("1_0jtcw")
walk_speed = 50.0
acceleration = 100.0
stopping_force = 100.0
turning_force = 200.0
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
unique_name_in_owner = true
libraries = {
"": SubResource("AnimationLibrary_claqb")
}
playback_default_blend_time = 0.25
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(-0.5, -16)
shape = SubResource("RectangleShape2D_wydm2")
debug_color = Color(0.720957, 0.248475, 1, 0.42)
[node name="Graphics" type="Node2D" parent="."]
unique_name_in_owner = true
[node name="Hip" type="Node2D" parent="Graphics"]
position = Vector2(0, -14)
[node name="BackLeg" type="Sprite2D" parent="Graphics/Hip"]
position = Vector2(1, 6)
texture = ExtResource("8_kdi1l")
offset = Vector2(0, 2)
[node name="BackFoot" type="Sprite2D" parent="Graphics/Hip/BackLeg"]
position = Vector2(0, 4)
texture = ExtResource("9_2a4p0")
offset = Vector2(0, 1)
[node name="BackArmPivot" type="Node2D" parent="Graphics/Hip"]
unique_name_in_owner = true
position = Vector2(1, -9)
rotation = 1.57079
[node name="DirectionVisualizer" type="Node2D" parent="Graphics/Hip/BackArmPivot"]
z_index = 1
script = ExtResource("9_x2hvg")
x_length = 12.0
y_length = 2.0
metadata/_edit_lock_ = true
[node name="BackArm" type="Sprite2D" parent="Graphics/Hip/BackArmPivot"]
rotation = -1.57079
texture = ExtResource("2_ux0fy")
offset = Vector2(0, 2)
[node name="BackHand" type="Sprite2D" parent="Graphics/Hip/BackArmPivot/BackArm"]
position = Vector2(0, 5)
texture = ExtResource("3_7fclw")
offset = Vector2(0, 2)
[node name="Torso" type="Sprite2D" parent="Graphics/Hip"]
texture = ExtResource("10_2vegm")
offset = Vector2(-1, -4)
[node name="Head" type="Sprite2D" parent="Graphics/Hip/Torso"]
position = Vector2(0, -10)
texture = ExtResource("11_nngs1")
offset = Vector2(-1, -4)
[node name="FrontArmPivot" type="Node2D" parent="Graphics/Hip"]
unique_name_in_owner = true
z_index = 1
position = Vector2(-3, -9)
rotation = 1.57079
[node name="DirectionVisualizer" type="Node2D" parent="Graphics/Hip/FrontArmPivot"]
z_index = 1
script = ExtResource("9_x2hvg")
x_length = 12.0
y_length = 2.0
metadata/_edit_lock_ = true
[node name="FrontArm" type="Sprite2D" parent="Graphics/Hip/FrontArmPivot"]
rotation = -1.5708
texture = ExtResource("3_jvia3")
offset = Vector2(0, 2)
[node name="FrontHand" type="Sprite2D" parent="Graphics/Hip/FrontArmPivot/FrontArm"]
position = Vector2(0, 5)
texture = ExtResource("4_kyw60")
offset = Vector2(0, 2)
[node name="HeldItemSlot" type="Node2D" parent="Graphics/Hip/FrontArmPivot/FrontArm/FrontHand"]
unique_name_in_owner = true
position = Vector2(0.999977, 5)
[node name="FrontLeg" type="Sprite2D" parent="Graphics/Hip"]
position = Vector2(-2, 6)
texture = ExtResource("11_6xvc8")
offset = Vector2(0, 2)
[node name="FrontFoot" type="Sprite2D" parent="Graphics/Hip/FrontLeg"]
position = Vector2(0, 4)
texture = ExtResource("12_dda5a")
offset = Vector2(0, 1)
[node name="Skirt" type="Sprite2D" parent="Graphics/Hip"]
texture = ExtResource("13_qgkik")
offset = Vector2(-1, 3)
[node name="StateChart" type="Node" parent="."]
unique_name_in_owner = true
script = ExtResource("2_wtq62")
[node name="Root" type="Node" parent="StateChart"]
script = ExtResource("3_h5pyx")
[node name="Movement" type="Node" parent="StateChart/Root"]
editor_description = "State of character movement."
script = ExtResource("4_le3t4")
initial_state = NodePath("Active")
[node name="Active" type="Node" parent="StateChart/Root/Movement"]
process_physics_priority = 100
editor_description = "Performs movement. Has higher physics processing priority so that move_and_slide happens last."
script = ExtResource("4_le3t4")
initial_state = NodePath("Grounded")
[node name="Grounded" type="Node" parent="StateChart/Root/Movement/Active"]
script = ExtResource("4_le3t4")
initial_state = NodePath("Standing")
[node name="OnLeftGround" type="Node" parent="StateChart/Root/Movement/Active/Grounded"]
script = ExtResource("6_d3xxl")
to = NodePath("../../Airborn")
event = &"left_ground"
delay_in_seconds = "0.0"
[node name="OnAimPressed" type="Node" parent="StateChart/Root/Movement/Active/Grounded"]
script = ExtResource("6_d3xxl")
to = NodePath("../Aiming")
event = &"aim_pressed"
delay_in_seconds = "0.0"
[node name="Standing" type="Node" parent="StateChart/Root/Movement/Active/Grounded"]
editor_description = "Character is standing still."
script = ExtResource("5_8e8ei")
[node name="OnWalkStart" type="Node" parent="StateChart/Root/Movement/Active/Grounded/Standing"]
editor_description = "A direction starts being held."
script = ExtResource("6_d3xxl")
to = NodePath("../../Walking")
event = &"input_dir_changed"
guard = SubResource("Resource_hwvj2")
delay_in_seconds = "0.0"
[node name="Walking" type="Node" parent="StateChart/Root/Movement/Active/Grounded"]
editor_description = "Character is walking in the direction being pressed."
script = ExtResource("5_8e8ei")
[node name="OnWalkStop" type="Node" parent="StateChart/Root/Movement/Active/Grounded/Walking"]
editor_description = "A direction stops being held."
script = ExtResource("6_d3xxl")
to = NodePath("../../Stopping")
event = &"input_dir_changed"
guard = SubResource("Resource_h756l")
delay_in_seconds = "0.0"
[node name="OnTurnAround" type="Node" parent="StateChart/Root/Movement/Active/Grounded/Walking"]
editor_description = "The opposite direction from movement is held."
script = ExtResource("6_d3xxl")
to = NodePath("../../Turning")
event = &"input_dir_changed"
guard = SubResource("Resource_7h7ld")
delay_in_seconds = "0.0"
[node name="Stopping" type="Node" parent="StateChart/Root/Movement/Active/Grounded"]
editor_description = "Player is holding no direction, character slows to stop."
script = ExtResource("5_8e8ei")
[node name="OnWalkStart" type="Node" parent="StateChart/Root/Movement/Active/Grounded/Stopping"]
editor_description = "The original"
script = ExtResource("6_d3xxl")
to = NodePath("../../Walking")
event = &"input_dir_changed"
guard = SubResource("Resource_5aa0s")
delay_in_seconds = "0.0"
[node name="OnTurnAround" type="Node" parent="StateChart/Root/Movement/Active/Grounded/Stopping"]
editor_description = "The opposite direction from movement is held."
script = ExtResource("6_d3xxl")
to = NodePath("../../Turning")
event = &"input_dir_changed"
guard = SubResource("Resource_7h7ld")
delay_in_seconds = "0.0"
[node name="OnStopped" type="Node" parent="StateChart/Root/Movement/Active/Grounded/Stopping"]
editor_description = "The character has come to a stop.
(velocity.x < stop_threshold)"
script = ExtResource("6_d3xxl")
to = NodePath("../../Standing")
event = &"stopped"
delay_in_seconds = "0.0"
[node name="Turning" type="Node" parent="StateChart/Root/Movement/Active/Grounded"]
editor_description = "Character is holding opposite direction of horizontal velocity, character will more quickly turn around."
script = ExtResource("5_8e8ei")
[node name="OnWalkStart" type="Node" parent="StateChart/Root/Movement/Active/Grounded/Turning"]
editor_description = "The player cancels turning and starts walking in the same direction again."
script = ExtResource("6_d3xxl")
to = NodePath("../../Walking")
event = &"input_dir_changed"
guard = SubResource("Resource_5aa0s")
delay_in_seconds = "0.0"
[node name="OnWalkStop" type="Node" parent="StateChart/Root/Movement/Active/Grounded/Turning"]
editor_description = "The player cancels turning and just comes to a stop."
script = ExtResource("6_d3xxl")
to = NodePath("../../Stopping")
event = &"input_dir_changed"
guard = SubResource("Resource_h756l")
delay_in_seconds = "0.0"
[node name="OnTurnFinished" type="Node" parent="StateChart/Root/Movement/Active/Grounded/Turning"]
editor_description = "The character has crossed the 0 velocity boundary and is facing the other direction now."
script = ExtResource("6_d3xxl")
to = NodePath("../../Walking")
event = &"turn_finished"
delay_in_seconds = "0.0"
[node name="Aiming" type="Node" parent="StateChart/Root/Movement/Active/Grounded"]
script = ExtResource("5_8e8ei")
[node name="OnAimReleased" type="Node" parent="StateChart/Root/Movement/Active/Grounded/Aiming"]
script = ExtResource("6_d3xxl")
to = NodePath("../../Standing")
event = &"aim_released"
delay_in_seconds = "0.0"
[node name="Airborn" type="Node" parent="StateChart/Root/Movement/Active"]
script = ExtResource("4_le3t4")
initial_state = NodePath("Falling")
[node name="Falling" type="Node" parent="StateChart/Root/Movement/Active/Airborn"]
script = ExtResource("5_8e8ei")
[node name="OnLanded" type="Node" parent="StateChart/Root/Movement/Active/Airborn"]
script = ExtResource("6_d3xxl")
to = NodePath("../../Grounded")
event = &"landed"
delay_in_seconds = "0.0"
[node name="Inactive" type="Node" parent="StateChart/Root/Movement"]
editor_description = "Performs no movement."
script = ExtResource("5_8e8ei")
[node name="Camera2D" type="Camera2D" parent="."]
[connection signal="state_physics_processing" from="StateChart/Root/Movement/Active" to="." method="_active_physics_process"]
[connection signal="child_state_entered" from="StateChart/Root/Movement/Active/Grounded" to="." method="_grounded_child_state_entered"]
[connection signal="state_entered" from="StateChart/Root/Movement/Active/Grounded/Standing" to="." method="_standing_entered"]
[connection signal="state_entered" from="StateChart/Root/Movement/Active/Grounded/Walking" to="AnimationPlayer" method="play" binds= [&"walk"]]
[connection signal="state_exited" from="StateChart/Root/Movement/Active/Grounded/Walking" to="AnimationPlayer" method="play" binds= [&"stand"]]
[connection signal="state_exited" from="StateChart/Root/Movement/Active/Grounded/Walking" to="AnimationPlayer" method="set_speed_scale" binds= [1.0]]
[connection signal="state_physics_processing" from="StateChart/Root/Movement/Active/Grounded/Walking" to="." method="_walking_process"]
[connection signal="state_physics_processing" from="StateChart/Root/Movement/Active/Grounded/Stopping" to="." method="_stopping_physics_process"]
[connection signal="state_physics_processing" from="StateChart/Root/Movement/Active/Grounded/Turning" to="." method="_turning_physics_process"]
[connection signal="state_exited" from="StateChart/Root/Movement/Active/Grounded/Aiming" to="." method="_aiming_exited"]
[connection signal="state_physics_processing" from="StateChart/Root/Movement/Active/Grounded/Aiming" to="." method="_stopping_physics_process"]
[connection signal="state_physics_processing" from="StateChart/Root/Movement/Active/Grounded/Aiming" to="." method="_aiming_physics_process"]
[connection signal="state_physics_processing" from="StateChart/Root/Movement/Active/Airborn" to="." method="_airborn_physics_process"]

View file

@ -0,0 +1,18 @@
[gd_scene load_steps=4 format=3 uid="uid://dlnu4b8eydxui"]
[ext_resource type="PackedScene" uid="uid://ccyfbp8cypnyy" path="res://objects/weapons/projectiles/throwable.tscn" id="1_4sas3"]
[ext_resource type="Texture2D" uid="uid://bd3mcp3gds2vg" path="res://textures/projectiles/brick.png" id="2_evkjl"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_7kw5j"]
size = Vector2(6, 4)
[node name="Brick" instance=ExtResource("1_4sas3")]
[node name="Sprite2D" type="Sprite2D" parent="." index="0"]
texture = ExtResource("2_evkjl")
[node name="CollisionShape2D" type="CollisionShape2D" parent="." index="1"]
shape = SubResource("RectangleShape2D_7kw5j")
[node name="CollisionShape2D" type="CollisionShape2D" parent="Interactable" index="0"]
shape = SubResource("RectangleShape2D_7kw5j")

View file

@ -0,0 +1,9 @@
extends Node2D
var speed: float = 500.0
var direction := Vector2.ZERO
func _physics_process(delta: float) -> void:
global_position += direction * speed * delta

View file

@ -0,0 +1,22 @@
[gd_scene load_steps=4 format=3 uid="uid://cntjtrjp4uisn"]
[ext_resource type="Texture2D" uid="uid://e6ubhnakxe0i" path="res://icon.svg" id="1_lvyed"]
[ext_resource type="Script" path="res://objects/weapons/projectiles/bullet.gd" id="1_xwbst"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_kf3mx"]
size = Vector2(4, 4)
[node name="Bullet" type="Node2D"]
script = ExtResource("1_xwbst")
[node name="Sprite2D" type="Sprite2D" parent="."]
position = Vector2(-2.38419e-07, 0)
scale = Vector2(0.03125, 0.03125)
texture = ExtResource("1_lvyed")
[node name="Area2D" type="Area2D" parent="."]
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
shape = SubResource("RectangleShape2D_kf3mx")
[connection signal="body_entered" from="Area2D" to="." method="queue_free" unbinds=1]

View file

@ -0,0 +1,12 @@
class_name Throwable
extends RigidBody2D
func _ready() -> void:
pass
func _on_interacted(user: Node) -> void:
var player = user as Player
if player:
player.pick_up(self)

View file

@ -0,0 +1,16 @@
[gd_scene load_steps=3 format=3 uid="uid://ccyfbp8cypnyy"]
[ext_resource type="Script" path="res://objects/weapons/projectiles/throwable.gd" id="1_dsh6j"]
[ext_resource type="Script" path="res://objects/interactable.gd" id="2_b3de0"]
[node name="Throwable" type="RigidBody2D"]
script = ExtResource("1_dsh6j")
[node name="Interactable" type="Area2D" parent="."]
collision_layer = 64
collision_mask = 0
input_pickable = false
monitoring = false
script = ExtResource("2_b3de0")
[connection signal="interacted" from="Interactable" to="." method="_on_interacted"]