胖子游戏怪物砍刀

This commit is contained in:
cakipaul 2025-08-01 02:18:51 +08:00
parent 3bed2fc3a4
commit e36c8671e2
9 changed files with 303 additions and 191 deletions

View File

@ -4827,7 +4827,7 @@ animations = [{
"duration": 1.0,
"texture": ExtResource("1043_e3b0h")
}],
"loop": true,
"loop": false,
"name": &"c03_胖子游戏_胖子对半砍",
"speed": 5.0
}]

View File

@ -58,6 +58,8 @@ const CANVAS_LAYER_SHADING = 10
const CANVAS_LAYER_LITTLE_GAME = 5
# 前景层
const CANVAS_LAYER_FG = 2
# 背景兜底层
const CANVAS_LAYER_BG_BOTTOM = -100
const DIALOG_IGNORE_INPUT = "ignore_input"
# memory layer: 30

View File

@ -23,7 +23,7 @@ signal animation_finished
@export var lock_move_right := false
@export var reenter_lock: PlayerReenterLock
@export var camera_marker: CameraFocusMarker
@export_enum("吕萍", "吕萍爬行", "吕萍带小猫", "吕萍推柜子", "吕萍拉大柜子", "小小蝶", "盒子猫", "小小小蝶") var character := "吕萍":
@export_enum("吕萍", "吕萍爬行", "吕萍带小猫", "吕萍推柜子", "吕萍拉大柜子", "小小蝶", "盒子猫", "胖子游戏", "小小小蝶") var character := "吕萍":
set(val):
character = val
if is_node_ready():

View File

@ -206,7 +206,7 @@ var ANIMATION_CONFIG = {
MOVEMENT_RUNNING: [&"", &"c03_胖子游戏_瘦子跑"],
5: [&"c03_胖子游戏_掉下来", Vector2.ONE, Vector2(0, -51.0)],
6: [&"c03_胖子游戏_洞里爬出来", Vector2.ONE, Vector2(-70, -44.5)],
7: [&"c03_胖子游戏_胖子对半砍", Vector2.ONE, Vector2(-70, -44.5)],
7: [&"c03_胖子游戏_胖子对半砍", Vector2.ONE, Vector2(0, -51.0)],
},
"小小小蝶":
{

View File

@ -63,6 +63,7 @@ const GROUND_SCENE_PATH_DICT: Dictionary[String, Dictionary] = {
@export var force_archive_portal := ""
# Nodes
@onready var bg_layer := $BGLayer as CanvasLayer
@onready var mask_layer := %MaskLayer as CanvasLayer
@onready var mask := %Mask as ColorRect
@ -89,7 +90,7 @@ var last_modify_time := 0
func _ready() -> void:
_setup_mask_layer()
_setup_layer()
if not ignore_archive:
_load_save()
if current_scene and entrance_portal:
@ -97,10 +98,11 @@ func _ready() -> void:
transition_to_scene(current_scene, entrance_portal)
func _setup_mask_layer() -> void:
func _setup_layer() -> void:
mask.visible = true
mask.color.a = 0.0
mask_layer.layer = GlobalConfig.CANVAS_LAYER_GROUND_MASK
bg_layer.layer = GlobalConfig.CANVAS_LAYER_BG_BOTTOM
func _load_save() -> void:

View File

@ -7,7 +7,7 @@ script = ExtResource("1_6mjre")
current_scene = "c01_s05"
[node name="BGLayer" type="CanvasLayer" parent="."]
layer = -1
layer = -100
[node name="BGColorRect" type="ColorRect" parent="BGLayer"]
z_index = -10

View File

@ -14,19 +14,31 @@ func _ready() -> void:
#region node_reference
var monster: Node2D
var monster_target: Node2D
#endregion
# 读取设置变量名
func _setup_node_reference() -> void:
pass
monster = $"../CanvasLayer/胖子游戏棺材怪"
monster_target = $"../DeployLayer/MonsterMoveTarget"
func _on_ground_ready() -> void:
_check_first_enter()
var right_x = SceneManager.get_player().player_movement_rect.size.x
var right_x = SceneManager.get_player().player_movement_rect.size.x
SceneManager.get_camera_marker().limit_right = int(right_x) + 50
await Util.wait(2.0)
monster.chop_left(1.0)
await Util.wait(4.0)
monster.chop_left(1.0)
await Util.wait(4.0)
monster.chop_left(1.0)
await Util.wait(4.0)
monster.chop_right(1.0)
func _check_first_enter() -> void:
if not data["has_entered"]:
@ -36,6 +48,6 @@ func _check_first_enter() -> void:
await SceneManager.get_player().animation_finished
SceneManager.unlock_player()
# 0:初始化; 1:砍字; 2:隐藏_定点砍; 3:显现_动态砍; 4:隐藏_追踪砍;
var current_stage := 0

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=29 format=3 uid="uid://clgwc3jcqarpe"]
[gd_scene load_steps=30 format=3 uid="uid://clgwc3jcqarpe"]
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_0c2p2"]
[ext_resource type="Script" uid="uid://cs4ddcjq81c1d" path="res://scene/ground/scene/c03/s10_胖子游戏1.gd" id="2_tthij"]
@ -28,6 +28,14 @@
[sub_resource type="AnimationLibrary" id="AnimationLibrary_k01ve"]
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_2wy2j"]
radius = 20.0
height = 300.0
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_whxhi"]
radius = 15.0
height = 293.0
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_f57cq"]
playback_mode = 1
random_pitch = 1.1
@ -38,9 +46,6 @@ stream_1/stream = ExtResource("10_js8ld")
stream_2/stream = ExtResource("10_js8ld")
stream_3/stream = ExtResource("10_js8ld")
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_2wy2j"]
height = 300.0
[node name="S10" type="Node2D"]
metadata/_edit_horizontal_guides_ = [98.0, 120.0]
@ -71,126 +76,11 @@ metadata/_custom_type_script = "uid://rq6w1vuhuq1m"
light_mask = 5
offset = Vector2(0, -158)
[node name="ParallaxBackground" type="ParallaxBackground" parent="Ground/BGSprite2D" index="0"]
layer = -1
[node name="底图" type="ParallaxLayer" parent="Ground/BGSprite2D/ParallaxBackground"]
z_index = -10
motion_scale = Vector2(0.3, 1)
motion_mirroring = Vector2(1200, 0)
[node name="Sprite2D" type="Sprite2D" parent="Ground/BGSprite2D/ParallaxBackground/底图"]
texture = ExtResource("5_a608f")
[node name="后山" type="ParallaxLayer" parent="Ground/BGSprite2D/ParallaxBackground"]
z_index = -10
motion_scale = Vector2(0.5, 1)
motion_mirroring = Vector2(1134, 0)
[node name="Sprite2D" type="Sprite2D" parent="Ground/BGSprite2D/ParallaxBackground/后山"]
texture = ExtResource("6_x0t6p")
[node name="前山" type="ParallaxLayer" parent="Ground/BGSprite2D/ParallaxBackground"]
z_index = -10
position = Vector2(0, 16)
motion_scale = Vector2(0.8, 1)
motion_mirroring = Vector2(1200, 0)
[node name="Sprite2D" type="Sprite2D" parent="Ground/BGSprite2D/ParallaxBackground/前山"]
texture = ExtResource("7_8s7iq")
[node name="地面" type="ParallaxLayer" parent="Ground/BGSprite2D/ParallaxBackground"]
position = Vector2(0, 101)
motion_mirroring = Vector2(1200, 0)
[node name="地面" type="Sprite2D" parent="Ground/BGSprite2D/ParallaxBackground/地面"]
texture = ExtResource("8_2van8")
[node name="遮罩" type="Sprite2D" parent="Ground/BGSprite2D/ParallaxBackground/地面"]
modulate = Color(0.14902, 0.14902, 0.14902, 0.533333)
position = Vector2(0, -101)
texture = ExtResource("9_podki")
[node name="肉1" type="Sprite2D" parent="Ground/BGSprite2D/ParallaxBackground/地面"]
position = Vector2(-143, -48)
texture = ExtResource("10_pr5np")
[node name="肉2" type="Sprite2D" parent="Ground/BGSprite2D/ParallaxBackground/地面"]
position = Vector2(0, -49)
texture = ExtResource("11_3wrhx")
[node name="肉3" type="Sprite2D" parent="Ground/BGSprite2D/ParallaxBackground/地面"]
position = Vector2(449, -57)
texture = ExtResource("12_jcaoy")
[node name="肉4" type="Sprite2D" parent="Ground/BGSprite2D/ParallaxBackground/地面"]
position = Vector2(153, -46)
texture = ExtResource("13_8ancs")
[node name="肉5" type="Sprite2D" parent="Ground/BGSprite2D/ParallaxBackground/地面"]
position = Vector2(724, -47)
texture = ExtResource("14_bm1fy")
[node name="胖子游戏棺材怪" type="AnimatedSprite2D" parent="Ground/BGSprite2D/ParallaxBackground/地面" node_paths=PackedStringArray("move_target", "left_side_sprite", "right_side_sprite", "left_area", "right_area")]
z_index = 10
position = Vector2(1015, -138)
sprite_frames = ExtResource("16_f57cq")
animation = &"棺材怪移动"
script = ExtResource("9_js8ld")
move_target = NodePath("../../../../DeployLayer/MonsterMoveTarget")
left_side_sprite = NodePath("../../../../DeployLayer/左侧")
right_side_sprite = NodePath("../../../../DeployLayer/右侧")
left_area = NodePath("../../../../DeployLayer/左侧/手拿刀")
right_area = NodePath("../../../../DeployLayer/右侧/手拿刀2")
[node name="Sfx2D棺材怪脚步声" type="AudioStreamPlayer2D" parent="Ground/BGSprite2D/ParallaxBackground/地面/胖子游戏棺材怪"]
stream = SubResource("AudioStreamRandomizer_f57cq")
max_distance = 500.0
bus = &"game_sfx"
script = ExtResource("10_f57cq")
loop = true
loop_round_time = 0.4
metadata/_custom_type_script = "uid://wapo47a1oddf"
[node name="Sfx2D棺材怪切刀" type="AudioStreamPlayer2D" parent="Ground/BGSprite2D/ParallaxBackground/地面/胖子游戏棺材怪"]
stream = ExtResource("12_whxhi")
max_distance = 1000.0
bus = &"game_sfx"
script = ExtResource("10_f57cq")
metadata/_custom_type_script = "uid://wapo47a1oddf"
[node name="身子" type="RemoteTransform2D" parent="Ground/BGSprite2D/ParallaxBackground/地面/胖子游戏棺材怪"]
position = Vector2(-22, -49)
remote_path = NodePath("../../../../../DeployLayer/左侧/手拿刀")
update_rotation = false
[node name="左侧" type="RemoteTransform2D" parent="Ground/BGSprite2D/ParallaxBackground/地面/胖子游戏棺材怪"]
position = Vector2(-308, -300)
remote_path = NodePath("../../../../../DeployLayer/左侧")
update_rotation = false
[node name="右侧" type="RemoteTransform2D" parent="Ground/BGSprite2D/ParallaxBackground/地面/胖子游戏棺材怪"]
position = Vector2(268, -300)
remote_path = NodePath("../../../../../DeployLayer/右侧")
update_rotation = false
[node name="左落点" type="RemoteTransform2D" parent="Ground/BGSprite2D/ParallaxBackground/地面/胖子游戏棺材怪"]
position = Vector2(-308, 128)
scale = Vector2(1e-05, 1e-05)
remote_path = NodePath("../../../../../DeployLayer/落点左")
update_rotation = false
[node name="右落点" type="RemoteTransform2D" parent="Ground/BGSprite2D/ParallaxBackground/地面/胖子游戏棺材怪"]
position = Vector2(268, 128)
scale = Vector2(1e-05, 1e-05)
remote_path = NodePath("../../../../../DeployLayer/落点右")
update_rotation = false
[node name="装饰手" type="Sprite2D" parent="Ground/BGSprite2D" index="1"]
[node name="装饰手" type="Sprite2D" parent="Ground/BGSprite2D" index="0"]
position = Vector2(935, 60)
texture = ExtResource("16_bm1fy")
[node name="装饰手2" type="Sprite2D" parent="Ground/BGSprite2D" index="2"]
[node name="装饰手2" type="Sprite2D" parent="Ground/BGSprite2D" index="1"]
position = Vector2(1318, 58)
texture = ExtResource("17_f57cq")
@ -208,46 +98,68 @@ sprite_frames = ExtResource("18_f57cq")
animation = &"胖子的母亲"
autoplay = "胖子的母亲"
[node name="左侧" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="3"]
position = Vector2(707, -337)
sprite_frames = ExtResource("16_f57cq")
animation = &"左手砍"
offset = Vector2(-11, 0)
[node name="手拿刀" type="Area2D" parent="Ground/DeployLayer/左侧"]
z_index = 10
position = Vector2(-11, 0)
[node name="CollisionShape2D" type="CollisionShape2D" parent="Ground/DeployLayer/左侧/手拿刀"]
position = Vector2(8, -24)
shape = SubResource("CapsuleShape2D_2wy2j")
[node name="落点左" type="Sprite2D" parent="Ground/DeployLayer" index="4"]
position = Vector2(707, 91)
[node name="落点左" type="Sprite2D" parent="Ground/DeployLayer" index="3"]
position = Vector2(501, 98)
scale = Vector2(1e-05, 1e-05)
texture = ExtResource("18_js8ld")
[node name="右侧" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="5"]
position = Vector2(1283, -337)
[node name="左侧手" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="4"]
position = Vector2(501, -317)
sprite_frames = ExtResource("16_f57cq")
animation = &"手砍"
offset = Vector2(9, 0)
animation = &"左手砍"
offset = Vector2(-11, -13)
[node name="手拿刀2" type="Area2D" parent="Ground/DeployLayer/右侧"]
[node name="左侧碰撞" type="Area2D" parent="Ground/DeployLayer/左侧手"]
visible = false
z_index = 10
position = Vector2(-7, 0)
position = Vector2(-11, -11)
[node name="CollisionShape2D" type="CollisionShape2D" parent="Ground/DeployLayer/右侧/手拿刀2"]
[node name="CollisionShape2D" type="CollisionShape2D" parent="Ground/DeployLayer/左侧手/左侧碰撞"]
position = Vector2(8, -24)
shape = SubResource("CapsuleShape2D_2wy2j")
[node name="落点右" type="Sprite2D" parent="Ground/DeployLayer" index="6"]
position = Vector2(1283, 91)
[node name="AnimatableBody2D" type="AnimatableBody2D" parent="Ground/DeployLayer/左侧手"]
position = Vector2(-4, -1)
collision_layer = 3
collision_mask = 3
[node name="CollisionShape2D" type="CollisionShape2D" parent="Ground/DeployLayer/左侧手/AnimatableBody2D"]
position = Vector2(1, -24)
shape = SubResource("CapsuleShape2D_whxhi")
disabled = true
[node name="落点右" type="Sprite2D" parent="Ground/DeployLayer" index="5"]
position = Vector2(1077, 98)
scale = Vector2(1e-05, 1e-05)
texture = ExtResource("20_whxhi")
[node name="右侧手" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="6"]
position = Vector2(1077, -317)
sprite_frames = ExtResource("16_f57cq")
animation = &"右手砍"
offset = Vector2(9, -12)
[node name="右侧碰撞" type="Area2D" parent="Ground/DeployLayer/右侧手"]
visible = false
z_index = 10
position = Vector2(-7, -11)
[node name="CollisionShape2D" type="CollisionShape2D" parent="Ground/DeployLayer/右侧手/右侧碰撞"]
position = Vector2(8, -24)
shape = SubResource("CapsuleShape2D_2wy2j")
[node name="AnimatableBody2D" type="AnimatableBody2D" parent="Ground/DeployLayer/右侧手"]
position = Vector2(0, -12)
collision_layer = 3
collision_mask = 3
[node name="CollisionShape2D" type="CollisionShape2D" parent="Ground/DeployLayer/右侧手/AnimatableBody2D"]
position = Vector2(1, -24)
shape = SubResource("CapsuleShape2D_whxhi")
disabled = true
[node name="MonsterMoveTarget" type="Marker2D" parent="Ground/DeployLayer" index="7"]
position = Vector2(775, 3)
position = Vector2(395, 50)
[node name="MainPlayer" parent="Ground" index="5"]
position = Vector2(396, 98)
@ -255,11 +167,19 @@ character = "胖子游戏"
player_movement_rect = Rect2(30, -158, 8170, 316)
facing_direction = Vector2(1, 0)
[node name="RemoteTransform2D" type="RemoteTransform2D" parent="Ground/MainPlayer" index="6"]
position = Vector2(-1, -48)
remote_path = NodePath("../../DeployLayer/MonsterMoveTarget")
update_position = false
update_rotation = false
update_scale = false
[node name="BGParallaxLayer" parent="Ground/ParallaxForeground" index="0"]
motion_scale = Vector2(0.9, 1)
[node name="FGParallaxLayer" parent="Ground/ParallaxForeground" index="1"]
position = Vector2(0, -7)
position = Vector2(-19, 38)
motion_scale = Vector2(1.5, 1)
motion_mirroring = Vector2(1200, 0)
[node name="FGSprite2D" parent="Ground/ParallaxForeground/FGParallaxLayer" index="0"]
@ -272,6 +192,139 @@ points = PackedVector2Array(30, 150, 8200, 151)
[node name="DirectionalLight2D" parent="Ground" index="8"]
energy = 0.4
blend_mode = 1
range_layer_min = -1
range_layer_min = -10
[node name="ParallaxBackground" type="ParallaxBackground" parent="Ground"]
layer = -3
[node name="底图" type="ParallaxLayer" parent="Ground/ParallaxBackground"]
z_index = -10
motion_scale = Vector2(0.3, 1)
motion_mirroring = Vector2(1200, 0)
[node name="Sprite2D" type="Sprite2D" parent="Ground/ParallaxBackground/底图"]
texture = ExtResource("5_a608f")
[node name="后山" type="ParallaxLayer" parent="Ground/ParallaxBackground"]
z_index = -10
motion_scale = Vector2(0.5, 1)
motion_mirroring = Vector2(1134, 0)
[node name="Sprite2D" type="Sprite2D" parent="Ground/ParallaxBackground/后山"]
texture = ExtResource("6_x0t6p")
[node name="前山" type="ParallaxLayer" parent="Ground/ParallaxBackground"]
z_index = -10
position = Vector2(0, 16)
motion_scale = Vector2(0.8, 1)
motion_mirroring = Vector2(1200, 0)
[node name="Sprite2D" type="Sprite2D" parent="Ground/ParallaxBackground/前山"]
texture = ExtResource("7_8s7iq")
[node name="CanvasLayer" type="CanvasLayer" parent="Ground"]
layer = -2
follow_viewport_enabled = true
[node name="胖子游戏棺材怪" type="AnimatedSprite2D" parent="Ground/CanvasLayer" node_paths=PackedStringArray("move_target", "left_side_sprite", "right_side_sprite", "left_area", "right_area", "left_static_collision", "right_static_collision")]
z_index = -1
position = Vector2(809, -17)
sprite_frames = ExtResource("16_f57cq")
animation = &"棺材怪右砍"
script = ExtResource("9_js8ld")
move_target = NodePath("../../DeployLayer/MonsterMoveTarget")
left_side_sprite = NodePath("../../DeployLayer/左侧手")
right_side_sprite = NodePath("../../DeployLayer/右侧手")
left_area = NodePath("../../DeployLayer/左侧手/左侧碰撞")
right_area = NodePath("../../DeployLayer/右侧手/右侧碰撞")
left_static_collision = NodePath("../../DeployLayer/左侧手/AnimatableBody2D/CollisionShape2D")
right_static_collision = NodePath("../../DeployLayer/右侧手/AnimatableBody2D/CollisionShape2D")
[node name="Sfx2D棺材怪脚步声" type="AudioStreamPlayer2D" parent="Ground/CanvasLayer/胖子游戏棺材怪"]
stream = SubResource("AudioStreamRandomizer_f57cq")
max_distance = 1000.0
bus = &"game_sfx"
script = ExtResource("10_f57cq")
loop = true
loop_round_time = 0.4
metadata/_custom_type_script = "uid://wapo47a1oddf"
[node name="Sfx2D棺材怪切刀" type="AudioStreamPlayer2D" parent="Ground/CanvasLayer/胖子游戏棺材怪"]
stream = ExtResource("12_whxhi")
max_distance = 1000.0
bus = &"game_sfx"
script = ExtResource("10_f57cq")
metadata/_custom_type_script = "uid://wapo47a1oddf"
[node name="左侧" type="RemoteTransform2D" parent="Ground/CanvasLayer/胖子游戏棺材怪"]
position = Vector2(-308, -300)
remote_path = NodePath("../../../DeployLayer/左侧手")
update_rotation = false
update_scale = false
[node name="左侧static_body" type="RemoteTransform2D" parent="Ground/CanvasLayer/胖子游戏棺材怪/左侧"]
position = Vector2(-4, -1)
remote_path = NodePath("../../../../DeployLayer/左侧手/AnimatableBody2D")
update_rotation = false
update_scale = false
[node name="右侧" type="RemoteTransform2D" parent="Ground/CanvasLayer/胖子游戏棺材怪"]
position = Vector2(268, -300)
remote_path = NodePath("../../../DeployLayer/右侧手")
update_rotation = false
update_scale = false
[node name="右侧static_body" type="RemoteTransform2D" parent="Ground/CanvasLayer/胖子游戏棺材怪/右侧"]
position = Vector2(0, -12)
remote_path = NodePath("../../../../DeployLayer/右侧手/AnimatableBody2D")
update_rotation = false
update_scale = false
[node name="左落点" type="RemoteTransform2D" parent="Ground/CanvasLayer/胖子游戏棺材怪"]
position = Vector2(-308, 115)
scale = Vector2(1e-05, 1e-05)
remote_path = NodePath("../../../DeployLayer/落点左")
update_rotation = false
[node name="右落点" type="RemoteTransform2D" parent="Ground/CanvasLayer/胖子游戏棺材怪"]
position = Vector2(268, 115)
scale = Vector2(1e-05, 1e-05)
remote_path = NodePath("../../../DeployLayer/落点右")
update_rotation = false
[node name="ParallaxBackground2" type="ParallaxBackground" parent="Ground"]
layer = -1
[node name="地面" type="ParallaxLayer" parent="Ground/ParallaxBackground2"]
position = Vector2(0, 101)
motion_mirroring = Vector2(1200, 0)
[node name="地面" type="Sprite2D" parent="Ground/ParallaxBackground2/地面"]
texture = ExtResource("8_2van8")
[node name="遮罩" type="Sprite2D" parent="Ground/ParallaxBackground2/地面"]
modulate = Color(0.14902, 0.14902, 0.14902, 0.533333)
position = Vector2(0, -101)
texture = ExtResource("9_podki")
[node name="肉1" type="Sprite2D" parent="Ground/ParallaxBackground2/地面"]
position = Vector2(-143, -48)
texture = ExtResource("10_pr5np")
[node name="肉2" type="Sprite2D" parent="Ground/ParallaxBackground2/地面"]
position = Vector2(0, -49)
texture = ExtResource("11_3wrhx")
[node name="肉3" type="Sprite2D" parent="Ground/ParallaxBackground2/地面"]
position = Vector2(449, -57)
texture = ExtResource("12_jcaoy")
[node name="肉4" type="Sprite2D" parent="Ground/ParallaxBackground2/地面"]
position = Vector2(153, -46)
texture = ExtResource("13_8ancs")
[node name="肉5" type="Sprite2D" parent="Ground/ParallaxBackground2/地面"]
position = Vector2(724, -47)
texture = ExtResource("14_bm1fy")
[editable path="Ground"]

View File

@ -1,28 +1,24 @@
extends AnimatedSprite2D
const MOVE_SPEED := 120.0
const RESET_Y := 300.0
const RESET_Y := -300.0
@export var mute := true:
@export var mute := false:
set(val):
mute = val
if not is_node_ready():
return
if mute:
footstep_sfx.volume_db = -100
else:
footstep_sfx.reset_volumn_to_default()
_on_mute_updated()
@export var move_target: Node2D
@export_enum("left", "right") var hand_mode := 0
@export var left_side_sprite: AnimatedSprite2D
@export var right_side_sprite: AnimatedSprite2D
@export var left_area: Area2D
@export var right_area: Area2D
@export var left_static_collision: CollisionShape2D
@export var right_static_collision: CollisionShape2D
@onready var footstep_sfx = $"Sfx2D棺材怪脚步声" as Sfx2D
@onready var chop_sfx = $"Sfx2D棺材怪切刀" as Sfx2D
@onready var remote_body = $"身子" as RemoteTransform2D
@onready var remote_left_side = $"左侧" as RemoteTransform2D
@onready var remote_right_side = $"右侧" as RemoteTransform2D
@onready var remote_left_shadow = $"左落点" as RemoteTransform2D
@ -30,13 +26,23 @@ const RESET_Y := 300.0
var left_hand_x_offset: float
var right_hand_x_offset: float
var chopped_safe_period := false
func _ready() -> void:
left_hand_x_offset = remote_left_shadow.position.x
right_hand_x_offset = remote_right_shadow.position.x
left_area.body_entered.connect(_on_player_chopped)
right_area.body_entered.connect(_on_player_chopped)
_on_mute_updated()
func _on_mute_updated() -> void:
if not is_node_ready():
return
if mute:
footstep_sfx.volume_db = -100
else:
footstep_sfx.reset_volumn_to_default()
# 停止切肉动作, x 对齐到 move_target
@ -47,42 +53,62 @@ func refresh_monster() -> void:
remote_left_shadow.scale = Vector2.ZERO
remote_right_shadow.scale = Vector2.ZERO
var aiming := false
func aim_left() -> void:
var tween = create_tween()
tween.tween_property(remote_left_shadow, "scale", Vector2.ONE, 1.0)
func aim_right() -> void:
var tween = create_tween()
tween.tween_property(remote_right_shadow, "scale", Vector2.ONE, 1.0)
func chop_left() -> void:
left_side_sprite.play()
func chop_left(aiming_duration := 3.0) -> void:
hand_mode = 0
aiming = true
_checkout_hand_animation(false)
var tween = create_tween()
if aiming_duration > 0.0:
tween.tween_property(remote_left_shadow, "scale", Vector2.ONE, aiming_duration)
tween.tween_callback(left_side_sprite.play)
tween.tween_property(remote_left_side, "position:y", 0.0, 0.2)
if aiming_duration <= 0.0:
tween.parallel().tween_property(remote_left_shadow, "scale", Vector2.ONE, 0.2)
tween.tween_callback(chop_sfx.play)
tween.tween_callback(toggle_safe_period.bind(true))
tween.tween_callback(shake)
tween.tween_interval(1.0)
tween.tween_property(remote_left_side, "position:y", RESET_Y, 1.0)
tween.parallel().tween_property(remote_left_shadow, "scale", Vector2.ZERO, 0.8)
tween.tween_callback(toggle_safe_period.bind(false))
tween.tween_callback(func(): aiming = false)
func chop_right() -> void:
right_side_sprite.play()
func chop_right(aiming_duration := 3.0) -> void:
hand_mode = 1
aiming = true
_checkout_hand_animation(false)
var tween = create_tween()
if aiming_duration > 0.0:
tween.tween_property(remote_right_shadow, "scale", Vector2.ONE, aiming_duration)
tween.tween_callback(right_side_sprite.play)
tween.tween_property(remote_right_side, "position:y", 0.0, 0.2)
if aiming_duration <= 0.0:
tween.parallel().tween_property(remote_right_shadow, "scale", Vector2.ONE, 0.2)
tween.tween_callback(chop_sfx.play)
tween.tween_callback(toggle_safe_period.bind(true))
tween.tween_callback(shake)
tween.tween_interval(1.0)
tween.tween_property(remote_right_side, "position:y", RESET_Y, 1.0)
tween.parallel().tween_property(remote_right_shadow, "scale", Vector2.ZERO, 0.8)
tween.tween_callback(toggle_safe_period.bind(false))
tween.tween_callback(func(): aiming = false)
func toggle_safe_period(safe: bool) -> void:
chopped_safe_period = safe
left_static_collision.disabled = not safe
right_static_collision.disabled = not safe
func shake() -> void:
SceneManager.get_camera_marker().shake_camera(4.0)
SceneManager.get_camera_marker().shake_camera(6.0)
func _on_player_chopped(_body) -> void:
if chopped_safe_period:
return
SceneManager.lock_player()
await SceneManager.player_action(7)
await Util.wait(1.0)
@ -93,17 +119,34 @@ func _on_player_chopped(_body) -> void:
func _physics_process(delta: float) -> void:
var target_x = move_target.global_position.x
if hand_mode == 0:
target_x -= left_hand_x_offset
else:
target_x -= right_hand_x_offset
var x = global_position.x
if target_x == x:
if chopped_safe_period or abs(target_x - x) < 0.1:
stop()
if footstep_sfx.playing:
footstep_sfx.stop()
else:
global_position.x = move_toward(x, target_x, delta * MOVE_SPEED)
var speed = MOVE_SPEED
if aiming:
speed *= 0.3
global_position.x = move_toward(x, target_x, delta * speed)
# if Time.get_ticks_msec() % 100 == 0:
# prints(x, target_x)
if not footstep_sfx.playing:
footstep_sfx.play()
if not is_playing():
if hand_mode == 0:
play("棺材怪移动")
else:
play("棺材怪移动右")
_checkout_hand_animation()
func _checkout_hand_animation(is_move := true) -> void:
var target_animation = ""
if is_move:
target_animation = "棺材怪移动" if hand_mode == 0 else "棺材怪移动右"
else:
target_animation = "棺材怪左砍" if hand_mode == 0 else "棺材怪右砍"
if not is_playing() or animation != target_animation:
if hand_mode == 0:
play(target_animation)
else:
play(target_animation)