working on aiming
This commit is contained in:
parent
20c15953af
commit
c9cc6173f0
10 changed files with 446 additions and 248 deletions
|
@ -1,7 +1,7 @@
|
|||
[gd_scene load_steps=4 format=3 uid="uid://b8xytvsmqsf55"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/dev_console/dev_console.ts" id="1_3ukun"]
|
||||
[ext_resource type="Theme" uid="uid://cj1yqavvbe331" path="res://addons/dev_console/monospace.tres" id="2_0wrae"]
|
||||
[ext_resource type="Theme" uid="uid://p5gitjrllq0a" path="res://addons/dev_console/monospace.tres" id="2_0wrae"]
|
||||
[ext_resource type="Script" path="res://addons/dev_console/autocomplete_line.ts" id="2_fq41p"]
|
||||
|
||||
[node name="CanvasLayer" type="CanvasLayer"]
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
[gd_resource type="Theme" load_steps=2 format=3 uid="uid://cj1yqavvbe331"]
|
||||
[gd_resource type="Theme" load_steps=2 format=3 uid="uid://p5gitjrllq0a"]
|
||||
|
||||
[sub_resource type="SystemFont" id="SystemFont_2h66v"]
|
||||
font_names = PackedStringArray("Monospace")
|
||||
|
|
|
@ -78,6 +78,26 @@ fire={
|
|||
"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)
|
||||
]
|
||||
}
|
||||
look_left={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":-1.0,"script":null)
|
||||
]
|
||||
}
|
||||
look_right={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":1.0,"script":null)
|
||||
]
|
||||
}
|
||||
look_up={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":-1.0,"script":null)
|
||||
]
|
||||
}
|
||||
look_down={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null)
|
||||
]
|
||||
}
|
||||
|
||||
[layer_names]
|
||||
|
||||
|
|
|
@ -74,6 +74,8 @@ mesh = SubResource("SphereMesh_bketi")
|
|||
surface_material_override/0 = SubResource("StandardMaterial3D_odc30")
|
||||
|
||||
[node name="Area3D" type="Area3D" parent="Node3D"]
|
||||
input_ray_pickable = false
|
||||
monitoring = false
|
||||
script = ExtResource("3_dt0nx")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D/Area3D"]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[gd_scene load_steps=24 format=3 uid="uid://cersx8w4ps2sr"]
|
||||
|
||||
[ext_resource type="Script" path="res://src/player.ts" id="2_pdrhn"]
|
||||
[ext_resource type="PackedScene" uid="uid://b1vb3py5av0e3" path="res://scenes/player_mesh2.tscn" id="2_rje1f"]
|
||||
[ext_resource type="PackedScene" path="res://scenes/player_mesh2.tscn" id="2_rje1f"]
|
||||
[ext_resource type="Script" path="res://src/player_animation.ts" id="3_26yay"]
|
||||
[ext_resource type="Script" path="res://src/player_input.ts" id="3_x6527"]
|
||||
[ext_resource type="Script" path="res://src/interactor.ts" id="5_uk7c1"]
|
||||
|
@ -28,46 +28,44 @@ animation = &"Walking"
|
|||
advance_mode = 2
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_p6dv3"]
|
||||
xfade_time = 0.25
|
||||
xfade_time = 0.1
|
||||
reset = false
|
||||
switch_mode = 1
|
||||
advance_mode = 2
|
||||
advance_expression = "velocity"
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_xh0w6"]
|
||||
xfade_time = 0.25
|
||||
xfade_time = 0.1
|
||||
reset = false
|
||||
switch_mode = 1
|
||||
advance_mode = 2
|
||||
advance_expression = "is_running()"
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_vse2m"]
|
||||
xfade_time = 0.25
|
||||
xfade_time = 0.1
|
||||
reset = false
|
||||
switch_mode = 1
|
||||
advance_mode = 2
|
||||
advance_expression = "not is_running()"
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_yh7m2"]
|
||||
xfade_time = 0.25
|
||||
xfade_time = 0.1
|
||||
reset = false
|
||||
switch_mode = 1
|
||||
advance_mode = 2
|
||||
advance_expression = "not velocity"
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_h1vpo"]
|
||||
xfade_time = 0.3
|
||||
xfade_time = 0.05
|
||||
advance_mode = 2
|
||||
advance_expression = "is_aiming()"
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_wqng5"]
|
||||
xfade_time = 0.3
|
||||
xfade_time = 0.1
|
||||
advance_mode = 2
|
||||
advance_expression = "not is_aiming()"
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_n5lxw"]
|
||||
advance_mode = 2
|
||||
advance_expression = "is_shooting()"
|
||||
advance_expression = "is_firing()"
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_3tstq"]
|
||||
switch_mode = 2
|
||||
|
@ -85,7 +83,7 @@ states/SlowRun/position = Vector2(572, 100)
|
|||
states/Walking/node = SubResource("AnimationNodeAnimation_w5ck1")
|
||||
states/Walking/position = Vector2(434, 100)
|
||||
transitions = ["Start", "Idle", SubResource("AnimationNodeStateMachineTransition_twhp3"), "Idle", "Walking", SubResource("AnimationNodeStateMachineTransition_p6dv3"), "Walking", "SlowRun", SubResource("AnimationNodeStateMachineTransition_xh0w6"), "SlowRun", "Walking", SubResource("AnimationNodeStateMachineTransition_vse2m"), "Walking", "Idle", SubResource("AnimationNodeStateMachineTransition_yh7m2"), "Idle", "PistolIdle", SubResource("AnimationNodeStateMachineTransition_h1vpo"), "PistolIdle", "Idle", SubResource("AnimationNodeStateMachineTransition_wqng5"), "PistolIdle", "Shooting", SubResource("AnimationNodeStateMachineTransition_n5lxw"), "Shooting", "PistolIdle", SubResource("AnimationNodeStateMachineTransition_3tstq")]
|
||||
graph_offset = Vector2(155, -1)
|
||||
graph_offset = Vector2(-79, 53)
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_64co4"]
|
||||
|
||||
|
@ -99,134 +97,134 @@ shape = SubResource("CapsuleShape3D_1kx10")
|
|||
[node name="PlayerMesh" parent="." instance=ExtResource("2_rje1f")]
|
||||
|
||||
[node name="Skeleton3D" parent="PlayerMesh/Scene/Armature" index="0"]
|
||||
bones/0/position = Vector3(0.17945, 104.41, 0.110052)
|
||||
bones/0/rotation = Quaternion(-0.0406521, -0.0416971, -0.0129259, 0.998219)
|
||||
bones/1/position = Vector3(5.96109e-08, -7.79423e-06, 8.06525e-07)
|
||||
bones/2/rotation = Quaternion(-0.0597369, 0.00111039, 0.00642272, 0.998193)
|
||||
bones/3/position = Vector3(-2.98023e-07, -1.34446e-05, 2.14577e-06)
|
||||
bones/4/rotation = Quaternion(0.0409263, 0.00151155, 0.0114956, 0.999095)
|
||||
bones/5/position = Vector3(1.63912e-07, 2.08151e-07, 3.01749e-07)
|
||||
bones/6/rotation = Quaternion(0.0537973, 0.00165954, 0.0114752, 0.998485)
|
||||
bones/7/position = Vector3(-5.96042e-07, -2.79844e-05, -6.33299e-07)
|
||||
bones/8/rotation = Quaternion(0.561827, -0.587188, 0.4308, 0.392392)
|
||||
bones/9/position = Vector3(1.63913e-06, -1.72853e-06, 2.13917e-05)
|
||||
bones/10/position = Vector3(2.77566e-06, 10.8382, 6.21936e-05)
|
||||
bones/10/rotation = Quaternion(0.546062, -0.128743, -0.247847, 0.789819)
|
||||
bones/11/position = Vector3(-3.33721e-06, -2.59971e-05, -4.23144e-07)
|
||||
bones/12/rotation = Quaternion(-1.44821e-07, 1.29284e-07, -0.269901, 0.962888)
|
||||
bones/13/position = Vector3(4.32435e-07, 3.89919e-06, 7.05178e-07)
|
||||
bones/14/position = Vector3(7.82341e-06, 28.3288, -1.32138e-06)
|
||||
bones/14/rotation = Quaternion(-0.111071, -0.0606597, 0.117823, 0.984937)
|
||||
bones/15/position = Vector3(1.78986e-06, 7.87047e-06, 1.65885e-06)
|
||||
bones/16/rotation = Quaternion(0.410799, 0.0410545, -0.0191872, 0.910599)
|
||||
bones/17/position = Vector3(5.01544e-07, -6.299e-06, 3.963e-07)
|
||||
bones/18/position = Vector3(-4.8526e-07, 3.60001, -4.86888e-05)
|
||||
bones/18/rotation = Quaternion(0.53131, 0.0228324, -0.106782, 0.840111)
|
||||
bones/19/position = Vector3(3.32548e-07, -8.41357e-06, -2.27747e-05)
|
||||
bones/20/rotation = Quaternion(-4.9514e-08, 5.57123e-08, -1.76427e-07, 1)
|
||||
bones/21/position = Vector3(-1.54454e-06, -7.68341e-06, -8.74918e-06)
|
||||
bones/22/position = Vector3(-8.60441e-07, 2.11579, -1.07681e-05)
|
||||
bones/23/position = Vector3(-2.92063e-06, 7.30623e-07, -3.37238e-06)
|
||||
bones/24/position = Vector3(-2.72793e-05, 9.53252, 4.71968e-05)
|
||||
bones/24/rotation = Quaternion(0.339952, 0.0300464, 0.0273285, 0.939565)
|
||||
bones/25/position = Vector3(-9.73276e-07, 9.30667e-06, 1.7444e-05)
|
||||
bones/26/position = Vector3(-2.40773e-06, 3.70001, -1.51598e-05)
|
||||
bones/26/rotation = Quaternion(0.430758, 0.165335, 0.0714135, 0.884314)
|
||||
bones/27/position = Vector3(2.42792e-06, -5.07634e-06, -1.79432e-05)
|
||||
bones/28/position = Vector3(5.23295e-07, 2.95001, -1.36814e-05)
|
||||
bones/28/rotation = Quaternion(3.76456e-09, -9.34081e-09, -3.22034e-08, 1)
|
||||
bones/31/position = Vector3(6.74278e-07, 1.0987e-05, -1.06914e-05)
|
||||
bones/32/rotation = Quaternion(0.367356, 0.012829, -0.0137641, 0.92989)
|
||||
bones/33/position = Vector3(-2.16168e-06, -9.28698e-06, 1.61968e-05)
|
||||
bones/34/position = Vector3(-2.08148e-06, 3.37928, -2.75762e-06)
|
||||
bones/34/rotation = Quaternion(0.435237, 0.0202325, -0.0616527, 0.897975)
|
||||
bones/36/position = Vector3(5.32687e-06, 2.88968, 1.89373e-05)
|
||||
bones/36/rotation = Quaternion(6.7077e-08, 6.14505e-08, -1.0756e-07, 1)
|
||||
bones/37/position = Vector3(1.10354e-06, -4.4019e-06, 1.37493e-05)
|
||||
bones/38/position = Vector3(-1.83442e-06, 2.63883, -1.48906e-05)
|
||||
bones/39/position = Vector3(-4.24683e-07, 1.03333e-05, -2.27057e-05)
|
||||
bones/40/position = Vector3(2.25983, 9.1083, 0.517871)
|
||||
bones/40/rotation = Quaternion(0.230758, 0.0232, 0.0553016, 0.971161)
|
||||
bones/41/position = Vector3(-1.50283e-06, -3.18235e-06, 1.64979e-05)
|
||||
bones/42/rotation = Quaternion(0.345931, -0.0275399, 0.00615904, 0.937835)
|
||||
bones/43/position = Vector3(2.44329e-07, 8.88386e-06, -6.62667e-06)
|
||||
bones/44/rotation = Quaternion(7.46085e-09, -1.39777e-08, -2.75613e-08, 1)
|
||||
bones/45/position = Vector3(-4.96307e-07, 1.11183e-05, 2.6697e-06)
|
||||
bones/0/position = Vector3(-0.00156784, 100.856, 1.24733)
|
||||
bones/0/rotation = Quaternion(-0.0241959, -0.0266158, -0.087857, 0.995484)
|
||||
bones/1/position = Vector3(-1.08778e-06, 8.00974e-08, -5.45755e-07)
|
||||
bones/2/rotation = Quaternion(-0.109554, -0.0139843, 0.0897288, 0.989824)
|
||||
bones/3/position = Vector3(1.2666e-07, 1.38208e-06, 4.63426e-06)
|
||||
bones/4/rotation = Quaternion(0.018472, -0.00360436, 0.0223806, 0.999572)
|
||||
bones/5/position = Vector3(-8.19564e-07, -1.46851e-05, 4.30644e-06)
|
||||
bones/6/rotation = Quaternion(0.0316743, -0.00504806, 0.0216011, 0.999252)
|
||||
bones/7/position = Vector3(3.57632e-07, -2.42144e-05, -3.53158e-06)
|
||||
bones/8/rotation = Quaternion(0.580046, -0.492109, 0.548672, 0.346892)
|
||||
bones/9/position = Vector3(1.93715e-07, -8.76188e-06, -1.82156e-05)
|
||||
bones/10/position = Vector3(-2.22259e-06, 10.8382, 6.657e-05)
|
||||
bones/10/rotation = Quaternion(0.459096, -0.121495, -0.0810144, 0.876303)
|
||||
bones/11/position = Vector3(1.66958e-06, -2.30764e-05, 5.90135e-07)
|
||||
bones/12/rotation = Quaternion(8.73115e-08, -7.06018e-09, -0.24541, 0.96942)
|
||||
bones/13/position = Vector3(7.10815e-06, 2.49848e-06, -3.67706e-07)
|
||||
bones/14/position = Vector3(1.00884e-05, 28.3289, 1.42043e-06)
|
||||
bones/14/rotation = Quaternion(0.0143011, -0.137731, -0.00664099, 0.990344)
|
||||
bones/15/position = Vector3(1.43223e-06, -9.47448e-06, -3.04991e-06)
|
||||
bones/16/rotation = Quaternion(0.162122, 0.00019677, 0.0185594, 0.986596)
|
||||
bones/17/position = Vector3(2.78027e-07, -1.63051e-05, 2.7709e-07)
|
||||
bones/18/position = Vector3(-7.17311e-07, 3.6, -4.46059e-05)
|
||||
bones/18/rotation = Quaternion(0.156883, 1.49012e-08, 0.0191203, 0.987432)
|
||||
bones/19/position = Vector3(-1.09796e-06, -1.6639e-05, -1.30592e-05)
|
||||
bones/20/rotation = Quaternion(0.222645, -1.765e-09, 0.0271343, 0.974522)
|
||||
bones/21/position = Vector3(-3.42208e-06, -3.57069e-06, -7.88492e-06)
|
||||
bones/22/position = Vector3(-2.66578e-06, 2.11579, -6.80612e-06)
|
||||
bones/23/position = Vector3(1.99676e-06, 2.3176e-06, 1.13522e-06)
|
||||
bones/24/position = Vector3(-2.81929e-05, 9.5325, 4.46934e-05)
|
||||
bones/24/rotation = Quaternion(0.144465, 0.0016678, 0.00607341, 0.98949)
|
||||
bones/25/position = Vector3(-2.64221e-06, 1.33002e-05, 9.27813e-06)
|
||||
bones/26/position = Vector3(-3.12982e-06, 3.70001, -1.88553e-05)
|
||||
bones/26/rotation = Quaternion(0.159018, -4.47035e-08, 0.0193803, 0.987086)
|
||||
bones/27/position = Vector3(4.8121e-06, -1.06792e-05, -1.50226e-05)
|
||||
bones/28/position = Vector3(3.86115e-06, 2.95001, -1.38305e-05)
|
||||
bones/28/rotation = Quaternion(0.274908, 0.0232031, 0.040264, 0.960347)
|
||||
bones/31/position = Vector3(1.86637e-06, 5.9802e-06, -1.467e-05)
|
||||
bones/32/rotation = Quaternion(0.205882, 0.00125593, 0.0191031, 0.97839)
|
||||
bones/33/position = Vector3(-2.25109e-06, -9.16777e-06, 1.35742e-05)
|
||||
bones/34/position = Vector3(-1.61634e-06, 3.37927, -2.16157e-06)
|
||||
bones/34/rotation = Quaternion(0.124678, 3.72529e-09, 0.0151949, 0.992081)
|
||||
bones/36/position = Vector3(-1.34902e-06, 2.88968, 1.45266e-05)
|
||||
bones/36/rotation = Quaternion(0.194697, 0.101037, 0.0444738, 0.974632)
|
||||
bones/37/position = Vector3(7.45909e-07, -8.48482e-06, 1.51202e-05)
|
||||
bones/38/position = Vector3(-7.0702e-07, 2.63882, -1.46823e-05)
|
||||
bones/39/position = Vector3(-4.24683e-07, -3.16713e-06, -1.23643e-05)
|
||||
bones/40/position = Vector3(2.25983, 9.10828, 0.517866)
|
||||
bones/40/rotation = Quaternion(0.209959, -0.00162836, 0.0331345, 0.977147)
|
||||
bones/41/position = Vector3(5.8333e-07, 6.3235e-07, 1.57826e-05)
|
||||
bones/42/rotation = Quaternion(0.107792, -3.57104e-08, 0.0131371, 0.994087)
|
||||
bones/43/position = Vector3(-1.30539e-06, 1.28774e-05, 4.90486e-08)
|
||||
bones/44/rotation = Quaternion(0.184101, -6.2101e-09, 0.022437, 0.982651)
|
||||
bones/45/position = Vector3(-2.28086e-07, -1.45823e-06, -4.29744e-07)
|
||||
bones/48/position = Vector3(2.68185, 2.4648, 1.57399)
|
||||
bones/48/rotation = Quaternion(0.253233, 0.0269746, -0.19885, 0.946364)
|
||||
bones/49/position = Vector3(-4.76836e-07, -4.29153e-06, 8.58607e-06)
|
||||
bones/50/position = Vector3(-5.36506e-06, 4.18898, 1.80082e-06)
|
||||
bones/50/rotation = Quaternion(-0.0236439, 0.0331235, 0.0393129, 0.998398)
|
||||
bones/52/position = Vector3(-8.58953e-06, 3.41627, -3.79061e-06)
|
||||
bones/52/rotation = Quaternion(1.62159e-06, -0.000806941, 3.60843e-07, 1)
|
||||
bones/53/position = Vector3(-7.33137e-06, 1.96993e-05, -3.36238e-06)
|
||||
bones/56/rotation = Quaternion(-0.168671, 0.00146631, -0.00322634, 0.985666)
|
||||
bones/57/position = Vector3(-1.48998e-08, -1.55101e-05, -2.81259e-07)
|
||||
bones/58/rotation = Quaternion(0.116994, 0.0330545, -0.00432665, 0.992573)
|
||||
bones/59/position = Vector3(4.47016e-08, -3.2247e-05, -2.96597e-06)
|
||||
bones/61/rotation = Quaternion(0.506672, 0.632248, -0.512417, 0.28456)
|
||||
bones/62/position = Vector3(-2.02656e-06, -3.57628e-07, -4.18441e-05)
|
||||
bones/63/position = Vector3(7.15469e-08, 10.8377, 1.51746e-05)
|
||||
bones/63/rotation = Quaternion(0.502967, 0.244286, 0.329048, 0.76097)
|
||||
bones/64/position = Vector3(3.60969e-06, 1.52503e-05, 4.33931e-06)
|
||||
bones/65/position = Vector3(6.08624e-06, 27.8415, 3.61837e-05)
|
||||
bones/65/rotation = Quaternion(1.00117e-07, -9.33561e-08, 0.240972, 0.970532)
|
||||
bones/66/position = Vector3(1.5152e-06, 5.09353e-07, 1.06806e-07)
|
||||
bones/67/rotation = Quaternion(-0.124955, -0.15428, -0.118697, 0.97288)
|
||||
bones/68/position = Vector3(-1.47492e-06, 9.18099e-07, 8.22066e-07)
|
||||
bones/69/rotation = Quaternion(0.223335, 0.00464231, 0.100994, 0.969485)
|
||||
bones/70/position = Vector3(3.93391e-06, -3.12924e-06, 1.2352e-05)
|
||||
bones/71/position = Vector3(-7.3569e-06, 4.18708, 3.80831e-06)
|
||||
bones/71/rotation = Quaternion(-0.017028, -0.0337403, -0.0322282, 0.998766)
|
||||
bones/72/position = Vector3(5.96047e-08, -1.01924e-05, -1.82316e-05)
|
||||
bones/73/position = Vector3(-7.20031e-06, 3.41838, -3.40019e-05)
|
||||
bones/73/rotation = Quaternion(-2.43768e-06, 0.000745857, 5.4902e-07, 1)
|
||||
bones/74/position = Vector3(-3.96371e-06, -8.34465e-06, 1.30411e-07)
|
||||
bones/75/position = Vector3(-3.2532e-06, 2.58059, 3.56767e-06)
|
||||
bones/77/rotation = Quaternion(0.329022, -0.00440169, -0.0369186, 0.94359)
|
||||
bones/78/position = Vector3(4.72453e-07, -1.04497e-06, 3.59342e-07)
|
||||
bones/79/position = Vector3(-2.66038e-07, 3.7, 8.95903e-07)
|
||||
bones/79/rotation = Quaternion(0.28229, 0.0283846, 0.000264906, 0.958909)
|
||||
bones/80/position = Vector3(-1.96994e-06, 1.6327e-06, -1.63261e-05)
|
||||
bones/81/rotation = Quaternion(-3.65055e-07, -4.16772e-09, -6.83649e-08, 1)
|
||||
bones/84/position = Vector3(-4.94532e-07, -1.87893e-05, 1.52819e-05)
|
||||
bones/85/rotation = Quaternion(0.331909, -0.019802, -0.0105555, 0.943044)
|
||||
bones/86/position = Vector3(-2.09158e-07, -2.31277e-06, -1.46174e-05)
|
||||
bones/87/rotation = Quaternion(0.403889, -0.00181236, 0.0290873, 0.914344)
|
||||
bones/88/position = Vector3(2.26344e-07, -5.1729e-06, -4.39392e-06)
|
||||
bones/89/rotation = Quaternion(4.04652e-07, 8.72496e-12, 6.58802e-08, 1)
|
||||
bones/90/position = Vector3(-2.41998e-07, -4.32138e-06, -4.24358e-06)
|
||||
bones/92/position = Vector3(3.67407e-07, 1.44696e-06, -5.79837e-06)
|
||||
bones/93/rotation = Quaternion(0.331827, -0.0487858, 0.034802, 0.941435)
|
||||
bones/94/position = Vector3(1.83496e-07, -1.69704e-05, -3.62689e-06)
|
||||
bones/95/rotation = Quaternion(0.547972, -0.0207689, 0.058348, 0.834201)
|
||||
bones/96/position = Vector3(-6.40724e-07, 1.08097e-06, 1.03508e-05)
|
||||
bones/97/position = Vector3(1.86266e-06, 2.95, 2.9305e-05)
|
||||
bones/97/rotation = Quaternion(-1.44502e-15, 1.80445e-09, -3.60028e-08, 1)
|
||||
bones/98/position = Vector3(7.57416e-07, -2.73586e-06, -1.18274e-06)
|
||||
bones/99/position = Vector3(-2.38102e-05, 2.64431, -7.72471e-06)
|
||||
bones/100/position = Vector3(-1.36858e-06, -8.86206e-06, 9.053e-06)
|
||||
bones/101/position = Vector3(3.80626, 8.0778, 0.486895)
|
||||
bones/101/rotation = Quaternion(0.379958, -0.0550092, 0.0382487, 0.922574)
|
||||
bones/102/position = Vector3(-1.08492e-06, 2.92186e-05, 1.50487e-05)
|
||||
bones/103/rotation = Quaternion(0.582059, -0.0103286, 0.0735094, 0.809751)
|
||||
bones/104/position = Vector3(-1.73342e-06, -1.47918e-06, -2.0886e-05)
|
||||
bones/105/rotation = Quaternion(-5.4723e-08, -3.14058e-09, 1.77999e-07, 1)
|
||||
bones/106/position = Vector3(8.89177e-07, -7.90852e-06, 1.76198e-05)
|
||||
bones/107/position = Vector3(2.5899e-06, 2.12554, 9.70504e-08)
|
||||
bones/108/position = Vector3(8.49366e-07, 5.665e-06, 3.62648e-06)
|
||||
bones/109/rotation = Quaternion(-0.036333, 0.0217706, 0.999101, 0.00199951)
|
||||
bones/110/position = Vector3(-1.3528e-06, 3.43757e-05, -4.54129e-08)
|
||||
bones/111/rotation = Quaternion(-0.143928, 0.000177422, 0.00374932, 0.989581)
|
||||
bones/112/position = Vector3(-4.23869e-07, 1.24792e-07, 6.58015e-07)
|
||||
bones/113/rotation = Quaternion(0.495013, 0.131615, -0.0439782, 0.857732)
|
||||
bones/115/rotation = Quaternion(0.335413, 0.00425432, -0.000217396, 0.942062)
|
||||
bones/119/rotation = Quaternion(0.119179, 0.0314785, 0.992322, -0.0101509)
|
||||
bones/120/position = Vector3(8.86776e-07, -4.30776e-06, 1.57868e-06)
|
||||
bones/121/rotation = Quaternion(-0.0940526, 0.000144511, -0.0022175, 0.995565)
|
||||
bones/122/position = Vector3(-8.41099e-07, -1.2368e-06, 3.5533e-07)
|
||||
bones/123/rotation = Quaternion(0.451014, 0.00101661, 0.0176655, 0.892342)
|
||||
bones/125/rotation = Quaternion(0.335216, 0.000625836, -1.98777e-05, 0.942141)
|
||||
bones/48/rotation = Quaternion(0.123863, 0.0615859, -0.157938, 0.977712)
|
||||
bones/49/position = Vector3(-3.57628e-06, -1.16825e-05, 6.73833e-06)
|
||||
bones/50/position = Vector3(-7.17277e-06, 4.18897, 1.07578e-06)
|
||||
bones/50/rotation = Quaternion(-0.065908, 0.0353134, 0.205088, 0.975883)
|
||||
bones/52/position = Vector3(-8.77766e-06, 3.41628, -4.79003e-06)
|
||||
bones/52/rotation = Quaternion(0.0198537, -0.00208779, -0.030255, 0.999343)
|
||||
bones/53/position = Vector3(-3.03984e-06, 2.01762e-05, -1.93187e-06)
|
||||
bones/56/rotation = Quaternion(0.0428424, 0.00373018, -0.0514745, 0.997748)
|
||||
bones/57/position = Vector3(1.19211e-07, -2.28947e-05, -3.36394e-06)
|
||||
bones/58/rotation = Quaternion(-0.09518, -0.0152199, 0.00725781, 0.995317)
|
||||
bones/59/position = Vector3(-1.0431e-07, -1.54506e-05, -1.49384e-06)
|
||||
bones/61/rotation = Quaternion(0.579899, 0.493993, -0.538761, 0.359757)
|
||||
bones/62/position = Vector3(5.96046e-08, -6.10948e-07, -7.88433e-06)
|
||||
bones/63/position = Vector3(3.42725e-07, 10.8377, 3.26269e-05)
|
||||
bones/63/rotation = Quaternion(0.575826, 0.0678332, 0.0593197, 0.812591)
|
||||
bones/64/position = Vector3(2.4772e-06, 1.24322e-06, 3.17702e-06)
|
||||
bones/65/position = Vector3(7.81477e-06, 27.8415, 3.26074e-05)
|
||||
bones/65/rotation = Quaternion(1.42027e-07, -1.46212e-07, 0.187139, 0.982333)
|
||||
bones/66/position = Vector3(-3.25318e-06, -4.67625e-06, -1.50252e-06)
|
||||
bones/67/rotation = Quaternion(0.0628093, 0.167989, 0.0452412, 0.982745)
|
||||
bones/68/position = Vector3(7.47968e-08, -6.91227e-07, -2.51579e-06)
|
||||
bones/69/rotation = Quaternion(0.124703, -0.0703717, 0.120712, 0.982306)
|
||||
bones/70/position = Vector3(1.18017e-05, 1.18017e-05, 1.03254e-05)
|
||||
bones/71/position = Vector3(-7.12144e-07, 4.18709, 2.40078e-06)
|
||||
bones/71/rotation = Quaternion(-0.0114256, 0.00320561, -0.0964902, 0.995263)
|
||||
bones/72/position = Vector3(5.48363e-06, -9.44734e-06, -1.48937e-05)
|
||||
bones/73/position = Vector3(-6.19066e-06, 3.41839, -3.25305e-05)
|
||||
bones/73/rotation = Quaternion(-0.0574109, -0.0921314, -0.0335194, 0.993525)
|
||||
bones/74/position = Vector3(3.75509e-06, 1.69277e-05, 9.12723e-07)
|
||||
bones/75/position = Vector3(2.59013e-06, 2.5806, 1.43079e-06)
|
||||
bones/77/rotation = Quaternion(0.139461, -0.00192688, -0.00298727, 0.990221)
|
||||
bones/78/position = Vector3(2.34035e-07, 6.61208e-07, -1.22018e-06)
|
||||
bones/79/position = Vector3(-2.66701e-07, 3.7, -4.303e-07)
|
||||
bones/79/rotation = Quaternion(0.169768, -2.14204e-07, -0.0204877, 0.985271)
|
||||
bones/80/position = Vector3(-3.04282e-06, -2.24161e-06, -1.52532e-05)
|
||||
bones/81/rotation = Quaternion(0.225351, -3.97203e-07, -0.0271954, 0.973898)
|
||||
bones/84/position = Vector3(-1.56742e-06, -5.37828e-06, 1.60567e-05)
|
||||
bones/85/rotation = Quaternion(0.0880754, -0.000857467, -0.000835853, 0.996113)
|
||||
bones/86/position = Vector3(-2.09158e-07, 7.10476e-06, -1.37234e-05)
|
||||
bones/87/rotation = Quaternion(0.177624, -2.45869e-07, -0.0214357, 0.983865)
|
||||
bones/88/position = Vector3(-1.44259e-06, -2.81852e-06, -1.08586e-06)
|
||||
bones/89/rotation = Quaternion(0.221521, -2.89766e-07, -0.0267331, 0.974789)
|
||||
bones/90/position = Vector3(-1.67251e-06, -5.69229e-06, 4.16067e-06)
|
||||
bones/92/position = Vector3(-2.07638e-06, -8.50701e-06, 1.83102e-06)
|
||||
bones/93/rotation = Quaternion(0.146033, -0.000818407, -0.0120549, 0.989206)
|
||||
bones/94/position = Vector3(-1.24702e-06, -4.42364e-06, 5.52884e-07)
|
||||
bones/95/rotation = Quaternion(0.172628, -2.70084e-07, -0.0208327, 0.984767)
|
||||
bones/96/position = Vector3(-2.19045e-06, -7.68091e-06, -2.55365e-06)
|
||||
bones/97/position = Vector3(1.62425e-06, 2.95, 1.38972e-05)
|
||||
bones/97/rotation = Quaternion(0.262432, -4.03317e-07, -0.0316705, 0.964431)
|
||||
bones/98/position = Vector3(-2.69965e-06, -1.43062e-07, 1.26105e-06)
|
||||
bones/99/position = Vector3(-2.845e-05, 2.64431, 1.98053e-06)
|
||||
bones/100/position = Vector3(6.57979e-07, -4.74934e-06, 1.44472e-05)
|
||||
bones/101/position = Vector3(3.80627, 8.07779, 0.486894)
|
||||
bones/101/rotation = Quaternion(0.151669, 0.0047456, -0.0484545, 0.987232)
|
||||
bones/102/position = Vector3(-2.33662e-06, 1.08604e-05, 1.6658e-05)
|
||||
bones/103/rotation = Quaternion(0.188861, 0.00662838, 0.0124932, 0.981902)
|
||||
bones/104/position = Vector3(1.84285e-06, 5.76279e-06, -1.71906e-05)
|
||||
bones/105/rotation = Quaternion(0.197459, -2.64662e-07, -0.0238293, 0.980021)
|
||||
bones/106/position = Vector3(1.48522e-06, -3.60209e-06, 1.44012e-05)
|
||||
bones/107/position = Vector3(4.3816e-06, 2.12554, -2.07618e-05)
|
||||
bones/108/position = Vector3(-4.91738e-07, 8.79425e-06, -1.38031e-06)
|
||||
bones/109/rotation = Quaternion(-0.0738262, 0.049394, 0.991854, -0.0912968)
|
||||
bones/110/position = Vector3(-1.06222e-06, 3.19319e-05, -1.56533e-06)
|
||||
bones/111/rotation = Quaternion(-0.20816, 0.0478937, 0.00235816, 0.976919)
|
||||
bones/112/position = Vector3(2.91388e-07, 4.25241e-06, -2.20301e-06)
|
||||
bones/113/rotation = Quaternion(0.540309, -0.0295822, -0.00332286, 0.84094)
|
||||
bones/115/rotation = Quaternion(0.340128, 3.45669e-05, 1.22083e-05, 0.940379)
|
||||
bones/119/rotation = Quaternion(0.0578879, 0.138588, 0.982719, -0.10819)
|
||||
bones/120/position = Vector3(-8.23132e-07, -4.34501e-06, -1.59527e-06)
|
||||
bones/121/rotation = Quaternion(-0.32988, -0.0696334, 0.0128686, 0.941363)
|
||||
bones/122/position = Vector3(-6.62286e-07, 6.482e-06, 2.36121e-07)
|
||||
bones/123/rotation = Quaternion(0.582159, -0.01921, -0.0181531, 0.812645)
|
||||
bones/125/rotation = Quaternion(0.323963, 3.82889e-05, 1.40474e-05, 0.94607)
|
||||
|
||||
[node name="Input" type="Node3D" parent="."]
|
||||
script = ExtResource("3_x6527")
|
||||
|
@ -241,6 +239,7 @@ script = ExtResource("3_26yay")
|
|||
|
||||
[node name="Interactor" type="Area3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 1)
|
||||
input_ray_pickable = false
|
||||
script = ExtResource("5_uk7c1")
|
||||
_root_node = NodePath("..")
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { int32, int64, PackedVector2Array, Vector2 } from 'godot'
|
||||
import { int32, int64 } from 'godot'
|
||||
|
||||
export class InputBufferError extends Error {
|
||||
constructor(message: string) {
|
||||
|
@ -14,18 +14,20 @@ export class InputBufferError extends Error {
|
|||
}
|
||||
}
|
||||
|
||||
export default class InputBuffer {
|
||||
export default class InputBuffer<T> {
|
||||
readonly capacity: int32
|
||||
private _buffer: PackedVector2Array
|
||||
private _buffer: T[]
|
||||
private _head: int32 = 0
|
||||
private _tail: int32 = 0
|
||||
private _size: int32 = 0
|
||||
|
||||
constructor(capacity: int32) {
|
||||
constructor(capacity: int32, defaultValue?: T) {
|
||||
this.capacity = capacity
|
||||
this._buffer = new PackedVector2Array()
|
||||
this._buffer.resize(capacity)
|
||||
this._buffer.fill(Vector2.ZERO)
|
||||
this._buffer = Array.from<T>({ length: capacity })
|
||||
|
||||
if (defaultValue != null) {
|
||||
this._buffer = this._buffer.fill(defaultValue)
|
||||
}
|
||||
}
|
||||
|
||||
is_empty() {
|
||||
|
@ -36,8 +38,8 @@ export default class InputBuffer {
|
|||
return this._size === this.capacity
|
||||
}
|
||||
|
||||
push(value: Vector2) {
|
||||
this._buffer.set_indexed(this._head, value)
|
||||
push(value: T) {
|
||||
this._buffer[this._head] = value
|
||||
this._head = (this._head + 1) % this.capacity
|
||||
|
||||
if (this.is_full()) {
|
||||
|
@ -47,14 +49,14 @@ export default class InputBuffer {
|
|||
}
|
||||
}
|
||||
|
||||
pop(): Vector2 {
|
||||
pop(): T {
|
||||
if (this.is_empty()) {
|
||||
throw InputBufferError.empty()
|
||||
}
|
||||
|
||||
const value = this.tail()
|
||||
this._tail = (this._tail + 1) % this.capacity
|
||||
this._size += 1
|
||||
this._size -= 1
|
||||
return value
|
||||
}
|
||||
|
||||
|
@ -65,7 +67,7 @@ export default class InputBuffer {
|
|||
|
||||
const n = index < 0 ? this._head - index : this._tail + index
|
||||
const idx = n % this.capacity
|
||||
return this._buffer.get_indexed(idx)
|
||||
return this._buffer[idx]
|
||||
}
|
||||
|
||||
size() {
|
||||
|
@ -73,11 +75,11 @@ export default class InputBuffer {
|
|||
}
|
||||
|
||||
head() {
|
||||
return this._buffer.get_indexed(this._head)
|
||||
return this._buffer[this._head]
|
||||
}
|
||||
|
||||
tail() {
|
||||
return this._buffer.get_indexed(this._tail)
|
||||
return this._buffer[this._tail]
|
||||
}
|
||||
|
||||
slice(begin: int64, end?: int64) {
|
||||
|
|
|
@ -74,7 +74,6 @@ export default class Inventory extends Node {
|
|||
}
|
||||
|
||||
has(item: ItemData): boolean {
|
||||
console.log('checking for', item.name)
|
||||
return this.items.has(item.name)
|
||||
}
|
||||
}
|
||||
|
|
105
src/player.ts
105
src/player.ts
|
@ -1,15 +1,23 @@
|
|||
import { Callable, CharacterBody3D, Color, float64, ProjectSettings, Variant, Vector2, Vector3 } from 'godot'
|
||||
import { Callable, Callable0, Callable1, Camera3D, CharacterBody3D, Color, float64, NodePath, ProjectSettings, Variant, Vector2, Vector3 } from 'godot'
|
||||
import { export_, help, onready } from 'godot.annotations'
|
||||
import PlayerInput from './player_input'
|
||||
import DebugDraw from './debug_draw'
|
||||
import Interactor from './interactor'
|
||||
import PlayerAnimation, { PlayerAnimationName } from './player_animation'
|
||||
|
||||
export default class Player extends CharacterBody3D {
|
||||
gravity = ProjectSettings.get_setting('physics/3d/default_gravity')
|
||||
|
||||
@export_(Variant.Type.TYPE_NODE_PATH)
|
||||
camera!: NodePath
|
||||
private _camera!: Camera3D
|
||||
|
||||
@onready("Input")
|
||||
player_input!: PlayerInput
|
||||
|
||||
@onready("AnimationTree")
|
||||
player_animation!: PlayerAnimation
|
||||
|
||||
@onready("Interactor")
|
||||
interactor!: Interactor
|
||||
|
||||
|
@ -39,25 +47,74 @@ export default class Player extends CharacterBody3D {
|
|||
}
|
||||
|
||||
is_firing() {
|
||||
return this.player_input.is_firing && this.is_aiming()
|
||||
return this._wants_to_fire
|
||||
}
|
||||
|
||||
private _can_act: boolean = true
|
||||
private _wants_to_fire: boolean = false
|
||||
|
||||
private _try_interact_callable!: Callable0
|
||||
private _queue_fire_callable!: Callable0
|
||||
private _disable_action_callable!: Callable1<string>
|
||||
private _enable_action_callable!: Callable1<string>
|
||||
|
||||
_ready(): void {
|
||||
this._camera = this.get_node(this.camera) as Camera3D
|
||||
|
||||
this._rotation_speed = this.turn_speed * 2 * Math.PI
|
||||
|
||||
this.player_input.interact.connect(
|
||||
Callable.create(
|
||||
this,
|
||||
this.try_interact
|
||||
)
|
||||
this._try_interact_callable = Callable.create(
|
||||
this,
|
||||
this._try_interact
|
||||
)
|
||||
|
||||
this._queue_fire_callable = Callable.create(
|
||||
this,
|
||||
this._queue_fire
|
||||
)
|
||||
|
||||
this.player_input.interact.connect(this._try_interact_callable)
|
||||
this.player_input.fire.connect(this._queue_fire_callable)
|
||||
|
||||
this._disable_action_callable = Callable.create(
|
||||
this,
|
||||
this._disable_action
|
||||
)
|
||||
|
||||
this._enable_action_callable = Callable.create(
|
||||
this,
|
||||
this._enable_action
|
||||
)
|
||||
|
||||
this.player_animation.animation_started.connect(this._disable_action_callable)
|
||||
this.player_animation.animation_finished.connect(this._enable_action_callable)
|
||||
}
|
||||
|
||||
try_interact() {
|
||||
private _disable_action(value: string) {
|
||||
if (PlayerAnimationName.Fire === value) {
|
||||
this._can_act = false
|
||||
}
|
||||
}
|
||||
|
||||
private _enable_action(value: string) {
|
||||
if (PlayerAnimationName.Fire === value) {
|
||||
this._can_act = true
|
||||
}
|
||||
}
|
||||
|
||||
private _try_interact() {
|
||||
this.interactor.try_interact_nearest()
|
||||
}
|
||||
|
||||
get_movement(input: Vector2): Vector3 {
|
||||
private async _queue_fire() {
|
||||
if (this.is_aiming()) {
|
||||
this._wants_to_fire = true
|
||||
await this.get_tree().process_frame.as_promise()
|
||||
this._wants_to_fire = false
|
||||
}
|
||||
}
|
||||
|
||||
private _get_movement(input: Vector2): Vector3 {
|
||||
let speed = this.walk_speed
|
||||
|
||||
if (this.is_running()) {
|
||||
|
@ -72,15 +129,11 @@ export default class Player extends CharacterBody3D {
|
|||
))
|
||||
}
|
||||
|
||||
get_gravitational_force(delta: float64): float64 {
|
||||
private _get_gravitational_force(delta: float64): float64 {
|
||||
return -this.gravity * delta
|
||||
}
|
||||
|
||||
is_kinda_equal(a: Vector2, b: Vector2, e: float64 = 0.1) {
|
||||
return a.distance_to(b) <= e
|
||||
}
|
||||
|
||||
_draw_movement(movement: Vector3) {
|
||||
private _draw_movement(movement: Vector3) {
|
||||
DebugDraw.draw_line(
|
||||
Vector3.ADD(
|
||||
Vector3.UP,
|
||||
|
@ -94,7 +147,7 @@ export default class Player extends CharacterBody3D {
|
|||
)
|
||||
}
|
||||
|
||||
rotate_toward(direction: Vector3, _delta: float64) {
|
||||
private _rotate_toward(direction: Vector3, _delta: float64) {
|
||||
if (!direction.is_zero_approx()) {
|
||||
this.look_at(
|
||||
Vector3.ADD(this.global_position, direction),
|
||||
|
@ -104,33 +157,41 @@ export default class Player extends CharacterBody3D {
|
|||
}
|
||||
}
|
||||
|
||||
move_toward(movement: Vector3, delta: float64) {
|
||||
private _move_toward(movement: Vector3, delta: float64) {
|
||||
this.velocity = new Vector3(
|
||||
movement.x,
|
||||
this.velocity.y + this.get_gravitational_force(delta),
|
||||
this.velocity.y + this._get_gravitational_force(delta),
|
||||
movement.z
|
||||
)
|
||||
|
||||
this.move_and_slide()
|
||||
}
|
||||
|
||||
_aim_at_direction() {
|
||||
private _aim_at_direction() {
|
||||
this._rotate_toward
|
||||
}
|
||||
|
||||
_physics_process(delta: float64): void {
|
||||
this.player_input.process_queue()
|
||||
|
||||
if (!this._can_act) {
|
||||
return
|
||||
}
|
||||
|
||||
if (this.player_input.is_aiming) {
|
||||
this.velocity = Vector3.ZERO
|
||||
this._aim_at_direction()
|
||||
return
|
||||
}
|
||||
|
||||
const input = this.player_input.movement_input
|
||||
|
||||
const movement = this.get_movement(input)
|
||||
const movement = this._get_movement(input)
|
||||
|
||||
this._draw_movement(movement)
|
||||
|
||||
this.rotate_toward(movement, delta)
|
||||
this.move_toward(movement, delta)
|
||||
this._rotate_toward(movement, delta)
|
||||
this._move_toward(movement, delta)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,16 +3,26 @@ import Player from './player'
|
|||
import PlayerInput from './player_input'
|
||||
import { onready } from 'godot.annotations'
|
||||
|
||||
export const PlayerAnimationName = Object.freeze({
|
||||
Idle: 'Idle',
|
||||
Walk: 'Walking',
|
||||
Run: 'SlowRun',
|
||||
Interact: 'Interact',
|
||||
Aim: 'PistolIdle',
|
||||
Fire: 'Shooting'
|
||||
} as const)
|
||||
|
||||
export default class PlayerAnimation extends AnimationTree {
|
||||
private static Interact = 'parameters/conditions/interact'
|
||||
//private static Interact = 'parameters/conditions/interact'
|
||||
private static Movement = 'parameters/Movement/blend_position'
|
||||
|
||||
@onready("../")
|
||||
@onready('../')
|
||||
player!: Player
|
||||
@onready("../Input")
|
||||
player_input!: PlayerInput
|
||||
|
||||
_process(delta: float64): void {
|
||||
@onready('../Input')
|
||||
readonly player_input!: PlayerInput
|
||||
|
||||
_process(_delta: float64): void {
|
||||
this.set(PlayerAnimation.Movement, this.player.velocity.length_squared())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,24 +1,61 @@
|
|||
import { float64, Input, InputEvent, InputEventJoypadButton, InputEventJoypadMotion, InputEventKey, InputEventMouse, int32, Node3D, Signal0, Signal1, Variant, Vector2 } from 'godot'
|
||||
import { float64, Input, InputEvent, InputEventJoypadButton, InputEventJoypadMotion, InputEventKey, InputEventMouse, InputEventMouseMotion, int32, Node3D, Signal0, Signal1, Variant, Vector2 } from 'godot'
|
||||
import { export_, signal } from 'godot.annotations'
|
||||
import InputBuffer from './input_buffer'
|
||||
|
||||
export const PlayerAction = {
|
||||
export const PlayerMovement = Object.freeze({
|
||||
MoveLeft: 'move_left',
|
||||
MoveRight: 'move_right',
|
||||
MoveUp: 'move_up',
|
||||
MoveDown: 'move_down',
|
||||
} as const)
|
||||
|
||||
export const PlayerLook = Object.freeze({
|
||||
LookLeft: 'look_left',
|
||||
LookRight: 'look_right',
|
||||
LookUp: 'look_up',
|
||||
LookDown: 'look_down',
|
||||
} as const)
|
||||
|
||||
class LookDirection {
|
||||
static Empty = new LookDirection(Vector2.ZERO, false)
|
||||
|
||||
readonly value: Vector2
|
||||
readonly needs_projection: boolean
|
||||
|
||||
constructor(value: Vector2, needs_projection: boolean) {
|
||||
this.value = value
|
||||
this.needs_projection = needs_projection
|
||||
}
|
||||
}
|
||||
|
||||
export const PlayerAction = Object.freeze({
|
||||
Run: 'run',
|
||||
Interact: 'interact',
|
||||
Aim: 'aim',
|
||||
Fire: 'fire'
|
||||
} as const
|
||||
} as const)
|
||||
|
||||
enum Device {
|
||||
KeyboardMouse = 0,
|
||||
Gamepad = 1
|
||||
export const Device = Object.freeze({
|
||||
KeyboardMouse: 0,
|
||||
Gamepad: 1
|
||||
} as const)
|
||||
|
||||
type PlayerActionType = typeof PlayerAction[keyof typeof PlayerAction]
|
||||
|
||||
class InputDesc {
|
||||
readonly type: PlayerActionType
|
||||
readonly value: boolean
|
||||
|
||||
constructor(type: PlayerActionType, value: boolean) {
|
||||
this.type = type
|
||||
this.value = value
|
||||
}
|
||||
}
|
||||
|
||||
export default class PlayerInput extends Node3D {
|
||||
@export_(Variant.Type.TYPE_INT)
|
||||
private movement_buffer_size: int32 = 4
|
||||
|
||||
@export_(Variant.Type.TYPE_INT)
|
||||
private input_buffer_size: int32 = 8
|
||||
|
||||
|
@ -30,18 +67,18 @@ export default class PlayerInput extends Node3D {
|
|||
private max_range: float64 = 1
|
||||
private _max_range_sqr: float64 = 1
|
||||
|
||||
private _last_known_device = Device.KeyboardMouse
|
||||
private _last_known_device: typeof Device[keyof typeof Device] = Device.KeyboardMouse
|
||||
|
||||
get last_known_device() { return this._last_known_device }
|
||||
|
||||
private _input_buffer!: InputBuffer
|
||||
private _movement_buffer!: InputBuffer<Vector2>
|
||||
|
||||
get input_buffer() {
|
||||
return this._input_buffer
|
||||
get movement_buffer() {
|
||||
return this._movement_buffer
|
||||
}
|
||||
|
||||
get movement_input() {
|
||||
const dir = this._input_buffer.head()
|
||||
const dir = this._movement_buffer.head()
|
||||
if (dir.is_zero_approx()) {
|
||||
return Vector2.ZERO
|
||||
} else {
|
||||
|
@ -57,49 +94,90 @@ export default class PlayerInput extends Node3D {
|
|||
}
|
||||
}
|
||||
|
||||
_running: boolean = false
|
||||
private _look_direction: LookDirection = LookDirection.Empty
|
||||
|
||||
get is_running() {
|
||||
return this._running
|
||||
get look_direction() {
|
||||
return this._look_direction
|
||||
}
|
||||
|
||||
@signal()
|
||||
readonly run!: Signal1<boolean>
|
||||
private _input_buffer!: InputBuffer<InputDesc>
|
||||
|
||||
_interacting: boolean = false
|
||||
|
||||
get is_interacting() {
|
||||
return this._interacting
|
||||
get input_buffer() {
|
||||
return this._input_buffer
|
||||
}
|
||||
|
||||
@signal()
|
||||
readonly interact!: Signal0
|
||||
|
||||
_aiming: boolean = false
|
||||
|
||||
get is_aiming() {
|
||||
return this._aiming
|
||||
}
|
||||
|
||||
@signal()
|
||||
readonly aim!: Signal1<boolean>
|
||||
|
||||
_firing: boolean = false
|
||||
|
||||
get is_firing() {
|
||||
return this._firing
|
||||
}
|
||||
|
||||
@signal()
|
||||
readonly fire!: Signal1<boolean>
|
||||
|
||||
private _changed_since_last_frame = false
|
||||
|
||||
get changed_since_last_frame() {
|
||||
return this._changed_since_last_frame
|
||||
}
|
||||
|
||||
_sqr(n: number) {
|
||||
private _running: boolean = false
|
||||
private _interacting: boolean = false
|
||||
private _aiming: boolean = false
|
||||
private _firing: boolean = false
|
||||
|
||||
get is_running() {
|
||||
return this._running
|
||||
}
|
||||
|
||||
private set is_running(value: boolean) {
|
||||
if (value !== this._running) {
|
||||
this._running = value
|
||||
this.run.emit(value)
|
||||
}
|
||||
}
|
||||
|
||||
get is_interacting() {
|
||||
return this._interacting
|
||||
}
|
||||
|
||||
private set is_interacting(value) {
|
||||
if (value !== this._interacting) {
|
||||
this._interacting = value
|
||||
if (value) {
|
||||
this.interact.emit()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
get is_aiming() {
|
||||
return this._aiming
|
||||
}
|
||||
|
||||
private set is_aiming(value) {
|
||||
if (value !== this._aiming) {
|
||||
this._aiming = value
|
||||
this.aim.emit(value)
|
||||
}
|
||||
}
|
||||
|
||||
get is_firing() {
|
||||
return this._firing
|
||||
}
|
||||
|
||||
private set is_firing(value) {
|
||||
if (value !== this._firing) {
|
||||
this._firing = value
|
||||
if (value) {
|
||||
this.fire.emit()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@signal()
|
||||
readonly run!: Signal1<boolean>
|
||||
|
||||
@signal()
|
||||
readonly interact!: Signal0
|
||||
|
||||
@signal()
|
||||
readonly aim!: Signal1<boolean>
|
||||
|
||||
@signal()
|
||||
readonly fire!: Signal0
|
||||
|
||||
private _sqr(n: number) {
|
||||
return n * n
|
||||
}
|
||||
|
||||
|
@ -107,49 +185,76 @@ export default class PlayerInput extends Node3D {
|
|||
this._min_range_sqr = this._sqr(this.min_range)
|
||||
this._max_range_sqr = this._sqr(this.max_range)
|
||||
|
||||
this._movement_buffer = new InputBuffer(this.movement_buffer_size, Vector2.ZERO)
|
||||
this._input_buffer = new InputBuffer(this.input_buffer_size)
|
||||
}
|
||||
|
||||
_process(_delta: float64): void {
|
||||
const next_movement = Input.get_vector(PlayerAction.MoveLeft, PlayerAction.MoveRight, PlayerAction.MoveUp, PlayerAction.MoveDown)
|
||||
const next_movement = Input.get_vector(
|
||||
PlayerMovement.MoveLeft,
|
||||
PlayerMovement.MoveRight,
|
||||
PlayerMovement.MoveUp,
|
||||
PlayerMovement.MoveDown
|
||||
)
|
||||
|
||||
let dir = Vector2.ZERO
|
||||
|
||||
switch (this._last_known_device) {
|
||||
case Device.Gamepad:
|
||||
dir = Input.get_vector(
|
||||
PlayerLook.LookLeft,
|
||||
PlayerLook.LookRight,
|
||||
PlayerLook.LookUp,
|
||||
PlayerLook.LookDown
|
||||
)
|
||||
this._look_direction = new LookDirection(dir, false)
|
||||
break
|
||||
case Device.KeyboardMouse:
|
||||
dir = this.get_viewport().get_mouse_position()
|
||||
this._look_direction = new LookDirection(dir, true)
|
||||
break
|
||||
}
|
||||
|
||||
this._changed_since_last_frame = !next_movement.is_equal_approx(this.movement_input)
|
||||
|
||||
this._input_buffer.push(next_movement)
|
||||
this._movement_buffer.push(next_movement)
|
||||
}
|
||||
|
||||
_input(event: InputEvent): void {
|
||||
if (event instanceof InputEventKey || event instanceof InputEventMouse) {
|
||||
if (event instanceof InputEventKey || event instanceof InputEventMouse || event instanceof InputEventMouseMotion) {
|
||||
this._last_known_device = Device.KeyboardMouse
|
||||
} else if (event instanceof InputEventJoypadButton || event instanceof InputEventJoypadMotion) {
|
||||
this._last_known_device = Device.Gamepad
|
||||
}
|
||||
|
||||
const running = event.is_action_pressed(PlayerAction.Run)
|
||||
if (running !== this._running) {
|
||||
this._running = running
|
||||
this.run.emit(running)
|
||||
}
|
||||
for (const action of Object.values(PlayerAction)) {
|
||||
if (event.is_action_released(action)) {
|
||||
this._input_buffer.push(new InputDesc(action, false))
|
||||
}
|
||||
|
||||
const interacting = event.is_action_pressed(PlayerAction.Interact)
|
||||
|
||||
if (interacting !== this._interacting) {
|
||||
this._interacting = interacting
|
||||
if (interacting) {
|
||||
this.interact.emit()
|
||||
if (event.is_action_pressed(action)) {
|
||||
this._input_buffer.push(new InputDesc(action, true))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const aiming = event.is_action_pressed(PlayerAction.Aim)
|
||||
if (aiming !== this._aiming) {
|
||||
this._aiming = aiming
|
||||
this.aim.emit(aiming)
|
||||
}
|
||||
|
||||
const firing = event.is_action_pressed(PlayerAction.Fire)
|
||||
if (firing !== this._firing) {
|
||||
this._firing = firing
|
||||
this.fire.emit(firing)
|
||||
process_queue() {
|
||||
while (!this.input_buffer.is_empty()) {
|
||||
const input = this.input_buffer.pop()
|
||||
switch (input.type) {
|
||||
case PlayerAction.Run:
|
||||
this.is_running = input.value
|
||||
break
|
||||
case PlayerAction.Interact:
|
||||
this.is_interacting = input.value
|
||||
break
|
||||
case PlayerAction.Aim:
|
||||
this.is_aiming = input.value
|
||||
break
|
||||
case PlayerAction.Fire:
|
||||
this.is_firing = input.value
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue