From 4b689e23fb3ef1d12c175de9aa4998f933d94b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=A8=E8=90=BD=E5=9F=BA=E5=9B=B4=E8=99=BE?= <3161880837@qq.com> Date: Thu, 28 Aug 2025 14:16:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=89=A9=E5=93=81=E6=94=B6=E9=9B=86):=20?= =?UTF-8?q?=E4=B8=BA=E7=89=A9=E5=93=81=E6=8E=89=E8=90=BD=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=94=B6=E9=9B=86=E5=8A=A8=E7=94=BB=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加动画播放器组件并实现收集时的缩放淡出动画效果,提升物品收集时的视觉反馈 --- components/UI/ItemDropped.tscn | 87 ++++++++++++++++++++++++++++- scripts/Statemachine/ItemDropped.gd | 7 ++- 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/components/UI/ItemDropped.tscn b/components/UI/ItemDropped.tscn index 5b5e6dc..74e91a5 100644 --- a/components/UI/ItemDropped.tscn +++ b/components/UI/ItemDropped.tscn @@ -1,8 +1,87 @@ -[gd_scene load_steps=13 format=3 uid="uid://cxcvc1rjvm8i2"] +[gd_scene load_steps=16 format=3 uid="uid://cxcvc1rjvm8i2"] [ext_resource type="Script" path="res://scripts/Statemachine/ItemDropped.gd" id="1_v2djl"] [ext_resource type="Texture2D" uid="uid://bks8jmctleina" path="res://resources/items/baseball.svg" id="2_4hl42"] +[sub_resource type="Animation" id="Animation_l0b83"] +resource_name = "collect" +length = 0.3 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.5, -0.15, 0, 0.15, 0, 2, -0.15, 0, 0.15, 0), +"times": PackedFloat32Array(0, 0.3) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:scale:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.5, -0.15, 0, 0.15, 0, 2, -0.15, 0, 0.15, 0), +"times": PackedFloat32Array(0, 0.3) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".:modulate:a") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(1, -0.15, 0, 0.15, 0, 0, -0.15, 0, 0.15, 0), +"times": PackedFloat32Array(0, 0.3) +} + +[sub_resource type="Animation" id="Animation_5i70v"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.5, -0.15, 0, 0.15, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:scale:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.5, -0.15, 0, 0.15, 0), +"times": PackedFloat32Array(0) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".:modulate:a") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.15, 0, 0.15, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_2q7p1"] +_data = { +"RESET": SubResource("Animation_5i70v"), +"collect": SubResource("Animation_l0b83") +} + [sub_resource type="CircleShape2D" id="CircleShape2D_7lt1c"] radius = 2.0 @@ -57,6 +136,12 @@ unique_name_in_owner = true scale = Vector2(0.5, 0.5) texture = ExtResource("2_4hl42") +[node name="animator" type="AnimationPlayer" parent="texture"] +unique_name_in_owner = true +libraries = { +"": SubResource("AnimationLibrary_2q7p1") +} + [node name="hitbox" type="CollisionShape2D" parent="."] shape = SubResource("CircleShape2D_7lt1c") diff --git a/scripts/Statemachine/ItemDropped.gd b/scripts/Statemachine/ItemDropped.gd index e4821e8..a94bd1c 100644 --- a/scripts/Statemachine/ItemDropped.gd +++ b/scripts/Statemachine/ItemDropped.gd @@ -6,6 +6,7 @@ var stackCount: int = 1 var targetPlayer: EntityBase = null @onready var texture: Sprite2D = $"%texture" +@onready var animator: AnimationPlayer = $"%animator" func _ready(): apply_force(MathTool.randv2_range(30000), MathTool.randv2_range(10)) @@ -18,7 +19,7 @@ func _physics_process(_delta): apply_central_force((targetPlayer.position - position).normalized() * 1000) if position.distance_to(targetPlayer.position) < 60: targetPlayer.collectItem(item, stackCount) - queue_free() + collect() func findPlayer() -> EntityBase: var result = null @@ -29,6 +30,10 @@ func findPlayer() -> EntityBase: lastDistance = position.distance_to(player.position) result = player return result +func collect(): + animator.play("collect") + await animator.animation_finished + queue_free() static func generate( itemType: ItemStore.ItemType,