mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-06-29 15:02:29 +08:00
feat(子弹): 添加紫色水晶子弹的爆炸效果和销毁逻辑
refactor(子弹基类): 重构销毁逻辑防止重复调用 fix(敌人): 调整小鸡boss的出现波次和激光音效 style(场景文件): 整理动画资源顺序
This commit is contained in:
@@ -4,6 +4,11 @@
|
|||||||
|
|
||||||
[sub_resource type="SpriteFrames" id="SpriteFrames_vypy3"]
|
[sub_resource type="SpriteFrames" id="SpriteFrames_vypy3"]
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_oinqg"]
|
||||||
|
resource_name = "destroy"
|
||||||
|
length = 0.5
|
||||||
|
step = 0.1
|
||||||
|
|
||||||
[sub_resource type="Animation" id="Animation_ynxlt"]
|
[sub_resource type="Animation" id="Animation_ynxlt"]
|
||||||
resource_name = "loop"
|
resource_name = "loop"
|
||||||
loop_mode = 1
|
loop_mode = 1
|
||||||
@@ -24,11 +29,6 @@ tracks/0/keys = {
|
|||||||
[sub_resource type="Animation" id="Animation_kmogx"]
|
[sub_resource type="Animation" id="Animation_kmogx"]
|
||||||
resource_name = "spawn"
|
resource_name = "spawn"
|
||||||
|
|
||||||
[sub_resource type="Animation" id="Animation_oinqg"]
|
|
||||||
resource_name = "destroy"
|
|
||||||
length = 0.5
|
|
||||||
step = 0.1
|
|
||||||
|
|
||||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_dxweq"]
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_dxweq"]
|
||||||
_data = {
|
_data = {
|
||||||
"destroy": SubResource("Animation_oinqg"),
|
"destroy": SubResource("Animation_oinqg"),
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[gd_scene load_steps=15 format=3 uid="uid://bvri0nv1jrigf"]
|
[gd_scene load_steps=16 format=3 uid="uid://bvri0nv1jrigf"]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://8gjjfju6p3fh" path="res://components/Bullets/Common/LaserSummoner.tscn" id="1_eb54j"]
|
[ext_resource type="PackedScene" uid="uid://8gjjfju6p3fh" path="res://components/Bullets/Common/LaserSummoner.tscn" id="1_eb54j"]
|
||||||
[ext_resource type="Script" path="res://scripts/Contents/Bullets/ChickLaser.gd" id="2_7g0f0"]
|
[ext_resource type="Script" path="res://scripts/Contents/Bullets/ChickLaser.gd" id="2_7g0f0"]
|
||||||
@@ -198,6 +198,10 @@ _data = {
|
|||||||
"spawn": SubResource("Animation_ep0ow")
|
"spawn": SubResource("Animation_ep0ow")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_sg52j"]
|
||||||
|
radius = 20.0
|
||||||
|
height = 500.0
|
||||||
|
|
||||||
[node name="ChickLaser" instance=ExtResource("1_eb54j")]
|
[node name="ChickLaser" instance=ExtResource("1_eb54j")]
|
||||||
script = ExtResource("2_7g0f0")
|
script = ExtResource("2_7g0f0")
|
||||||
metadata/_edit_vertical_guides_ = [705.0]
|
metadata/_edit_vertical_guides_ = [705.0]
|
||||||
@@ -224,3 +228,8 @@ scale = Vector2(0.525, 0.525)
|
|||||||
libraries = {
|
libraries = {
|
||||||
"": SubResource("AnimationLibrary_7qqtc")
|
"": SubResource("AnimationLibrary_7qqtc")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[node name="hitbox" parent="." index="1"]
|
||||||
|
visible = true
|
||||||
|
position = Vector2(454, 0)
|
||||||
|
shape = SubResource("CapsuleShape2D_sg52j")
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
[ext_resource type="Script" path="res://scripts/Contents/Bullets/FireScan.gd" id="2_qprdp"]
|
[ext_resource type="Script" path="res://scripts/Contents/Bullets/FireScan.gd" id="2_qprdp"]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_4qcsn"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_4qcsn"]
|
||||||
|
size = Vector2(50, 50)
|
||||||
|
|
||||||
[node name="FireScan" instance=ExtResource("1_cqre5")]
|
[node name="FireScan" instance=ExtResource("1_cqre5")]
|
||||||
script = ExtResource("2_qprdp")
|
script = ExtResource("2_qprdp")
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
[ext_resource type="Texture2D" uid="uid://7pkplcqqxvnp" path="res://resources/characters/chick/chick-a.svg" id="2_syddq"]
|
[ext_resource type="Texture2D" uid="uid://7pkplcqqxvnp" path="res://resources/characters/chick/chick-a.svg" id="2_syddq"]
|
||||||
[ext_resource type="Texture2D" uid="uid://dj5dvqb8gsedr" path="res://resources/characters/chick/chick-b.svg" id="3_064jv"]
|
[ext_resource type="Texture2D" uid="uid://dj5dvqb8gsedr" path="res://resources/characters/chick/chick-b.svg" id="3_064jv"]
|
||||||
[ext_resource type="AudioStream" uid="uid://b7pxuov1id0ho" path="res://resources/sounds/effect/Pew.mp3" id="3_ik1xf"]
|
[ext_resource type="AudioStream" uid="uid://b7pxuov1id0ho" path="res://resources/sounds/effect/Pew.mp3" id="3_ik1xf"]
|
||||||
[ext_resource type="AudioStream" uid="uid://bx3n11awokuyd" path="res://resources/sounds/effect/Rip.wav" id="4_oyq2p"]
|
[ext_resource type="AudioStream" uid="uid://b10u6iir6uvqn" path="res://resources/sounds/effect/BigLaser.wav" id="4_mrsne"]
|
||||||
[ext_resource type="PackedScene" uid="uid://dny25qkcvtaa2" path="res://components/Effects/FirePot.tscn" id="6_kvx3n"]
|
[ext_resource type="PackedScene" uid="uid://dny25qkcvtaa2" path="res://components/Effects/FirePot.tscn" id="6_kvx3n"]
|
||||||
|
|
||||||
[sub_resource type="SpriteFrames" id="SpriteFrames_xji3d"]
|
[sub_resource type="SpriteFrames" id="SpriteFrames_xji3d"]
|
||||||
@@ -42,7 +42,8 @@ appleCount = Vector2i(2, 4)
|
|||||||
stream = ExtResource("3_ik1xf")
|
stream = ExtResource("3_ik1xf")
|
||||||
|
|
||||||
[node name="attack1" type="AudioStreamPlayer2D" parent="sounds" index="6"]
|
[node name="attack1" type="AudioStreamPlayer2D" parent="sounds" index="6"]
|
||||||
stream = ExtResource("4_oyq2p")
|
stream = ExtResource("4_mrsne")
|
||||||
|
volume_db = -10.0
|
||||||
|
|
||||||
[node name="texture" parent="." index="1"]
|
[node name="texture" parent="." index="1"]
|
||||||
position = Vector2(0, -37)
|
position = Vector2(0, -37)
|
||||||
|
|||||||
+21
-20
@@ -1,6 +1,6 @@
|
|||||||
[gd_scene load_steps=14 format=3 uid="uid://dn0iwwnq3n8e2"]
|
[gd_scene load_steps=14 format=3 uid="uid://dn0iwwnq3n8e2"]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://bcvuuy2m0pke0" path="res://components/Abstracts/EffectBase.tscn" id="1_1mab3"]
|
[ext_resource type="PackedScene" uid="uid://bcvuuy2m0pke0" path="res://components/Abstracts/EffectBase.tscn" id="1_sqdwd"]
|
||||||
|
|
||||||
[sub_resource type="Curve" id="Curve_jf41v"]
|
[sub_resource type="Curve" id="Curve_jf41v"]
|
||||||
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
|
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
|
||||||
@@ -17,7 +17,7 @@ point_count = 2
|
|||||||
curve = SubResource("Curve_cxxkf")
|
curve = SubResource("Curve_cxxkf")
|
||||||
|
|
||||||
[sub_resource type="Gradient" id="Gradient_v1v0w"]
|
[sub_resource type="Gradient" id="Gradient_v1v0w"]
|
||||||
colors = PackedColorArray(1, 0, 0, 1, 1, 0.796875, 0, 1)
|
colors = PackedColorArray(0.3125, 0, 1, 1, 1, 0, 0.867188, 1)
|
||||||
|
|
||||||
[sub_resource type="GradientTexture1D" id="GradientTexture1D_7jhwh"]
|
[sub_resource type="GradientTexture1D" id="GradientTexture1D_7jhwh"]
|
||||||
gradient = SubResource("Gradient_v1v0w")
|
gradient = SubResource("Gradient_v1v0w")
|
||||||
@@ -35,14 +35,28 @@ angle_max = 360.0
|
|||||||
angle_curve = SubResource("CurveTexture_fp3qe")
|
angle_curve = SubResource("CurveTexture_fp3qe")
|
||||||
direction = Vector3(0, -1, 0)
|
direction = Vector3(0, -1, 0)
|
||||||
spread = 180.0
|
spread = 180.0
|
||||||
initial_velocity_max = 200.0
|
initial_velocity_max = 150.0
|
||||||
gravity = Vector3(0, 300, 0)
|
gravity = Vector3(0, 0, 0)
|
||||||
scale_min = 3.0
|
scale_min = 3.0
|
||||||
scale_max = 8.0
|
scale_max = 8.0
|
||||||
color_ramp = SubResource("GradientTexture1D_30y3h")
|
color_ramp = SubResource("GradientTexture1D_30y3h")
|
||||||
color_initial_ramp = SubResource("GradientTexture1D_7jhwh")
|
color_initial_ramp = SubResource("GradientTexture1D_7jhwh")
|
||||||
alpha_curve = SubResource("CurveTexture_8rfho")
|
alpha_curve = SubResource("CurveTexture_8rfho")
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_rcc6g"]
|
||||||
|
length = 0.001
|
||||||
|
tracks/0/type = "bezier"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath(".:material:shader_parameter/explosion_radius")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"handle_modes": PackedInt32Array(0),
|
||||||
|
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0),
|
||||||
|
"times": PackedFloat32Array(0)
|
||||||
|
}
|
||||||
|
|
||||||
[sub_resource type="Animation" id="Animation_pa4et"]
|
[sub_resource type="Animation" id="Animation_pa4et"]
|
||||||
resource_name = "explosion"
|
resource_name = "explosion"
|
||||||
length = 2.0
|
length = 2.0
|
||||||
@@ -59,31 +73,18 @@ tracks/0/keys = {
|
|||||||
"times": PackedFloat32Array(0, 1, 2)
|
"times": PackedFloat32Array(0, 1, 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
[sub_resource type="Animation" id="Animation_rcc6g"]
|
|
||||||
length = 0.001
|
|
||||||
tracks/0/type = "bezier"
|
|
||||||
tracks/0/imported = false
|
|
||||||
tracks/0/enabled = true
|
|
||||||
tracks/0/path = NodePath(".:material:shader_parameter/explosion_radius")
|
|
||||||
tracks/0/interp = 1
|
|
||||||
tracks/0/loop_wrap = true
|
|
||||||
tracks/0/keys = {
|
|
||||||
"handle_modes": PackedInt32Array(0),
|
|
||||||
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0),
|
|
||||||
"times": PackedFloat32Array(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_n7i5u"]
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_n7i5u"]
|
||||||
_data = {
|
_data = {
|
||||||
"RESET": SubResource("Animation_rcc6g"),
|
"RESET": SubResource("Animation_rcc6g"),
|
||||||
"explosion": SubResource("Animation_pa4et")
|
"explosion": SubResource("Animation_pa4et")
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="Explosion" instance=ExtResource("1_1mab3")]
|
[node name="Explosion" instance=ExtResource("1_sqdwd")]
|
||||||
|
|
||||||
[node name="particles" parent="." index="0"]
|
[node name="particles" parent="." index="0"]
|
||||||
amount = 200
|
amount = 20
|
||||||
process_material = SubResource("ParticleProcessMaterial_w52ko")
|
process_material = SubResource("ParticleProcessMaterial_w52ko")
|
||||||
|
lifetime = 0.5
|
||||||
|
|
||||||
[node name="animator" parent="stage" index="0"]
|
[node name="animator" parent="stage" index="0"]
|
||||||
libraries = {
|
libraries = {
|
||||||
@@ -3,3 +3,5 @@ class_name PurpleCrystal
|
|||||||
|
|
||||||
func ai():
|
func ai():
|
||||||
PresetsAI.forward(self, rotation)
|
PresetsAI.forward(self, rotation)
|
||||||
|
func destroy():
|
||||||
|
EffectController.create(preload("res://components/Effects/PurpleCrystalExplosion.tscn"), global_position).shot()
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ static var current: int = 0
|
|||||||
static var data: Array[Wave] = [
|
static var data: Array[Wave] = [
|
||||||
# entity, minCount, maxCount, isBoss, from, to, per
|
# entity, minCount, maxCount, isBoss, from, to, per
|
||||||
create(preload("res://components/Characters/Hen.tscn"), 1, 5, false, 0, INF, 1),
|
create(preload("res://components/Characters/Hen.tscn"), 1, 5, false, 0, INF, 1),
|
||||||
create(preload("res://components/Characters/Chick.tscn"), 0, 0, true, 0, INF, 5),
|
create(preload("res://components/Characters/Chick.tscn"), 0, 0, true, 8, INF, 6),
|
||||||
]
|
]
|
||||||
|
|
||||||
static func create(
|
static func create(
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ class_name BulletBase
|
|||||||
var launcher: EntityBase = null
|
var launcher: EntityBase = null
|
||||||
var spawnInWhen: float = 0
|
var spawnInWhen: float = 0
|
||||||
var spawnInWhere: Vector2 = Vector2.ZERO
|
var spawnInWhere: Vector2 = Vector2.ZERO
|
||||||
|
var destroying: bool = false
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
register()
|
register()
|
||||||
@@ -35,17 +36,19 @@ func _ready():
|
|||||||
animator.play("spawn")
|
animator.play("spawn")
|
||||||
await animator.animation_finished
|
await animator.animation_finished
|
||||||
if freeAfterSpawn:
|
if freeAfterSpawn:
|
||||||
destroy()
|
tryDestroy()
|
||||||
if autoLoopAnimation:
|
if autoLoopAnimation:
|
||||||
animator.play("loop")
|
animator.play("loop")
|
||||||
func _process(_delta: float) -> void:
|
func _process(_delta: float) -> void:
|
||||||
|
if destroying: return
|
||||||
if lifeTime > 0:
|
if lifeTime > 0:
|
||||||
if WorldManager.getTime() - spawnInWhen >= lifeTime:
|
if WorldManager.getTime() - spawnInWhen >= lifeTime:
|
||||||
destroy()
|
tryDestroy()
|
||||||
if lifeDistance > 0:
|
if lifeDistance > 0:
|
||||||
if position.distance_to(spawnInWhere) >= lifeDistance:
|
if position.distance_to(spawnInWhere) >= lifeDistance:
|
||||||
destroy()
|
tryDestroy()
|
||||||
func _physics_process(_delta: float) -> void:
|
func _physics_process(_delta: float) -> void:
|
||||||
|
if destroying: return
|
||||||
if is_instance_valid(launcher) and (launcher.isPlayer() or is_instance_valid(launcher.currentFocusedBoss)):
|
if is_instance_valid(launcher) and (launcher.isPlayer() or is_instance_valid(launcher.currentFocusedBoss)):
|
||||||
launcher.position -= Vector2.from_angle(rotation) * recoil
|
launcher.position -= Vector2.from_angle(rotation) * recoil
|
||||||
ai()
|
ai()
|
||||||
@@ -61,7 +64,7 @@ func hit(target: Node):
|
|||||||
if MathTool.rate(fullPenerate()):
|
if MathTool.rate(fullPenerate()):
|
||||||
penerate -= entity.fields[FieldStore.Entity.PENARATION_RESISTANCE]
|
penerate -= entity.fields[FieldStore.Entity.PENARATION_RESISTANCE]
|
||||||
else:
|
else:
|
||||||
destroy()
|
tryDestroy()
|
||||||
func forward(direction: Vector2):
|
func forward(direction: Vector2):
|
||||||
position += direction.normalized() * speed * GameRule.bulletSpeedMultiplier
|
position += direction.normalized() * speed * GameRule.bulletSpeedMultiplier
|
||||||
func fullPenerate():
|
func fullPenerate():
|
||||||
@@ -71,15 +74,20 @@ func timeLived():
|
|||||||
func dotLoop():
|
func dotLoop():
|
||||||
if await applyDot():
|
if await applyDot():
|
||||||
await dotLoop()
|
await dotLoop()
|
||||||
|
func tryDestroy():
|
||||||
|
if destroying: return
|
||||||
|
destroying = true
|
||||||
|
await destroy()
|
||||||
|
if autoDestroyAnimation:
|
||||||
|
animator.play("destroy")
|
||||||
|
await animator.animation_finished
|
||||||
|
queue_free()
|
||||||
|
|
||||||
# 抽象方法
|
# 抽象方法
|
||||||
func ai():
|
func ai():
|
||||||
pass
|
pass
|
||||||
func destroy():
|
func destroy():
|
||||||
if autoDestroyAnimation:
|
pass
|
||||||
animator.play("destroy")
|
|
||||||
await animator.animation_finished
|
|
||||||
queue_free()
|
|
||||||
func spawn():
|
func spawn():
|
||||||
pass
|
pass
|
||||||
func applyDot():
|
func applyDot():
|
||||||
|
|||||||
@@ -15,3 +15,12 @@ func shot():
|
|||||||
if oneShot:
|
if oneShot:
|
||||||
await cloned.finished
|
await cloned.finished
|
||||||
cloned.queue_free()
|
cloned.queue_free()
|
||||||
|
|
||||||
|
static func create(scene: PackedScene, spawnPosition: Vector2, parent: Node2D = null) -> EffectController:
|
||||||
|
var cloned = scene.instantiate() as EffectController
|
||||||
|
cloned.global_position = spawnPosition
|
||||||
|
if parent:
|
||||||
|
parent.add_child(cloned)
|
||||||
|
else:
|
||||||
|
WorldManager.rootNode.add_child(cloned)
|
||||||
|
return cloned
|
||||||
|
|||||||
Reference in New Issue
Block a user