diff --git a/components/Bullets/Parrier.tscn b/components/Bullets/Parrier.tscn index 706c2e2..90a7417 100644 --- a/components/Bullets/Parrier.tscn +++ b/components/Bullets/Parrier.tscn @@ -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 diff --git a/components/Bullets/ParryBall.tscn b/components/Bullets/ParryBall.tscn index 4c16bd7..16a6f3f 100644 --- a/components/Bullets/ParryBall.tscn +++ b/components/Bullets/ParryBall.tscn @@ -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) diff --git a/components/Bullets/QKSword.tscn b/components/Bullets/QKSword.tscn index aacd244..a9eccc1 100644 --- a/components/Bullets/QKSword.tscn +++ b/components/Bullets/QKSword.tscn @@ -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"] diff --git a/scripts/Contents/Bullets/Parrier.gd b/scripts/Contents/Bullets/Parrier.gd index 957e151..7036c7c 100644 --- a/scripts/Contents/Bullets/Parrier.gd +++ b/scripts/Contents/Bullets/Parrier.gd @@ -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 diff --git a/scripts/Contents/Bullets/ParryBall.gd b/scripts/Contents/Bullets/ParryBall.gd index 443b498..1597938 100644 --- a/scripts/Contents/Bullets/ParryBall.gd +++ b/scripts/Contents/Bullets/ParryBall.gd @@ -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()) # 生成的乾坤剑面向敌人 diff --git a/scripts/Contents/Bullets/QKSword.gd b/scripts/Contents/Bullets/QKSword.gd index bf65edb..4a7da49 100644 --- a/scripts/Contents/Bullets/QKSword.gd +++ b/scripts/Contents/Bullets/QKSword.gd @@ -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()