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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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,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()) # 生成的乾坤剑面向敌人
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user