1
1
mirror of https://github.com/Rundll86/Dog-Lynx-And-HCN.git synced 2026-05-28 06:51:54 +08:00

feat(子弹系统): 完善乾坤剑和格挡子弹的逻辑

添加乾坤剑的追踪和攻击逻辑,包括命中目标后的效果
调整格挡子弹的伤害值和生成气的逻辑
优化子弹动画和碰撞箱设置
为乾坤剑添加基础伤害和穿透属性
This commit is contained in:
2026-03-19 22:58:50 +08:00
parent cc4b91797d
commit 97ac580347
6 changed files with 82 additions and 62 deletions
+1 -1
View File
@@ -113,7 +113,7 @@ size = Vector2(54, 204)
[node name="Parrier" instance=ExtResource("1_57y3f")]
script = ExtResource("2_li4th")
parryRate = 0.0
baseDamage = 0.0
baseDamage = 1.0
penerate = 1.0
autoSpawnAnimation = true
freeAfterSpawn = true
+1
View File
@@ -44,6 +44,7 @@ radius = 100.0
[node name="ParryBall" instance=ExtResource("1_xeuh5")]
script = ExtResource("2_cc0al")
baseDamage = 0.0
[node name="texture" parent="." index="0"]
scale = Vector2(0.5, 0.5)
+53 -50
View File
@@ -15,54 +15,6 @@ animations = [{
"speed": 5.0
}]
[sub_resource type="Animation" id="Animation_q2yg1"]
resource_name = "spawn"
step = 0.1
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, 2),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 1, -0.16666667, 0, 0, 0),
"times": PackedFloat32Array(0, 1)
}
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(2, 2),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 1, -0.16666667, 0, 0, 0),
"times": PackedFloat32Array(0, 1)
}
tracks/2/type = "bezier"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath(".:rotation")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"handle_modes": PackedInt32Array(2, 0),
"points": PackedFloat32Array(-4.71, -0.25, 0, 0.25, 0, 0.78, -0.15, 0, 0, 0),
"times": PackedFloat32Array(0, 1)
}
tracks/3/type = "bezier"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:modulate:a")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"handle_modes": PackedInt32Array(2, 2),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 1, -0.16666667, 0, 0, 0),
"times": PackedFloat32Array(0, 1)
}
[sub_resource type="Animation" id="Animation_x26jp"]
length = 0.001
tracks/0/type = "bezier"
@@ -110,6 +62,54 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
[sub_resource type="Animation" id="Animation_q2yg1"]
resource_name = "spawn"
step = 0.1
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, 2),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 1.5, -0.16666667, 0, 0, 0),
"times": PackedFloat32Array(0, 1)
}
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(2, 2),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 1.5, -0.16666667, 0, 0, 0),
"times": PackedFloat32Array(0, 1)
}
tracks/2/type = "bezier"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath(".:rotation")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"handle_modes": PackedInt32Array(2, 0),
"points": PackedFloat32Array(-4.71, -0.25, 0, 0.25, 0, 0.78, -0.15, 0, 0, 0),
"times": PackedFloat32Array(0, 1)
}
tracks/3/type = "bezier"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:modulate:a")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"handle_modes": PackedInt32Array(2, 2),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 1, -0.16666667, 0, 0, 0),
"times": PackedFloat32Array(0, 1)
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_evtlt"]
_data = {
&"RESET": SubResource("Animation_x26jp"),
@@ -117,12 +117,15 @@ _data = {
}
[sub_resource type="RectangleShape2D" id="RectangleShape2D_q2yg1"]
size = Vector2(94, 12)
size = Vector2(146, 26)
[node name="QKSword" instance=ExtResource("1_1ke2b")]
script = ExtResource("2_x26jp")
speed = 20.0
lifeTime = 2000.0
baseDamage = 20.0
penerate = 1.0
penerateDamageReduction = 0.2
lifeTime = 3000.0
autoSpawnAnimation = true
[node name="texture" parent="." index="0"]
+7 -5
View File
@@ -3,17 +3,19 @@ class_name ParrierBullet
@export var parryRate: float = 1
func hitBullet(bullet: BulletBase):
if BulletTool.canDamage(bullet, launcher):
func hitBullet(bullet: BulletBase): # 当前子弹与其他子弹相撞
if BulletTool.canDamage(bullet, launcher): # 其他子弹可以使当前子弹的发射者受伤吗?
if MathTool.rate(parryRate):
var eff = EffectController.create(ComponentManager.getEffect("Parry"), position + (bullet.position - position).normalized() * 150)
# 生成格挡特效
var eff = EffectController.create(ComponentManager.getEffect("Parry"), position + (bullet.position - position).normalized() * 150) # 从子弹位置,面向其他子弹的方向前进150
eff.modulate = bullet.modulate.blend(bullet.texture.modulate)
eff.shot()
# 摧毁其他子弹
bullet.tryDestroy()
var cycler = launcher.getOrCreateCycleTimer("parry", 2000, 100)
if len(cycler.bullets) < 5:
if len(cycler.bullets) < 5: # 玩家最多只能拥有5点气
for b in BulletBase.generate(
ComponentManager.getBullet("ParryBall"),
ComponentManager.getBullet("ParryBall"), # 生成气的子弹
launcher,
position,
0
+6 -3
View File
@@ -6,10 +6,13 @@ var cycler: CycleTimer
func spawn():
cycler = launcher.getOrCreateCycleTimer("parry")
cycler.host(self )
launcher.sprintMultiplier += 1
func destroy(_beacuseMap: bool):
launcher.sprintMultiplier -= 1
func ai():
PresetBulletAI.selfRotate(self , 5)
hitbox.disabled = !launcher.sprinting
func succeedToHit(_dmg: float, entity: EntityBase):
hitbox.disabled = !launcher.sprinting # 玩家在冲刺时气的碰撞箱才生效
func succeedToHit(_dmg: float, entity: EntityBase): # 当撞到敌人时
for bullet in BulletBase.generate(
ComponentManager.getBullet("QKSword"),
launcher,
@@ -19,4 +22,4 @@ func succeedToHit(_dmg: float, entity: EntityBase):
if bullet is QKSwordBullet:
bullet.position = entity.texture.global_position + MathTool.sampleInRing(50, 200)
bullet.tracer = entity
bullet.look_at(entity.position)
bullet.look_at(entity.getTrackingAnchor()) # 生成的乾坤剑面向敌人
+14 -3
View File
@@ -2,9 +2,20 @@ extends BulletBase
class_name QKSwordBullet
var tracer: EntityBase
var attackedTracer: bool = false
func ai():
if is_instance_valid(tracer):
look_at(tracer.position)
if is_instance_valid(tracer) && !attackedTracer:
look_at(tracer.getTrackingAnchor())
if timeLived() > 1000:
PresetBulletAI.forward(self , rotation)
PresetBulletAI.forward(self , rotation) # 前进
hitbox.disabled = false
else:
hitbox.disabled = true
func succeedToHit(_dmg: float, entity: EntityBase):
if entity == tracer:
attackedTracer = true # 只需要命中一次目标就不需要继续前进了
EffectController.create(
ComponentManager.getEffect("CatBoom"),
entity.texture.global_position
).shot()