From 3dd5f06bbe8cacca48ed6a34aa088b7e7c4e3da0 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: Sun, 7 Dec 2025 17:04:47 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=A7=92=E8=89=B2):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=8C=AB=E5=A4=B4=E9=B9=B0=E8=A7=92=E8=89=B2MTY=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=86=B2=E5=88=BA=E6=94=BB=E5=87=BB=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加新角色MTY(猫头鹰)及其专属子弹MTYSprint - 实现MTY角色的基本属性和AI行为 - 添加MTYSprint子弹类型及碰撞检测 - 在Wave.gd中添加MTY的生成配置 - 扩展BulletTool工具类添加查找最近子弹功能 --- components/Bullets/MTYSprint.tscn | 17 +++++++++++++++++ components/Characters/MTY.tscn | 4 +++- scripts/Contents/Bullets/MTYSprint.gd | 5 +++++ scripts/Contents/Bullets/MTYSprint.gd.uid | 1 + scripts/Contents/Characters/MTY.gd | 22 ++++++++++++++++++++++ scripts/Contents/Characters/MTY.gd.uid | 1 + scripts/Contents/Wave.gd | 1 + scripts/Tools/BulletTool.gd | 17 +++++++++++++++++ 8 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 components/Bullets/MTYSprint.tscn create mode 100644 scripts/Contents/Bullets/MTYSprint.gd create mode 100644 scripts/Contents/Bullets/MTYSprint.gd.uid create mode 100644 scripts/Contents/Characters/MTY.gd create mode 100644 scripts/Contents/Characters/MTY.gd.uid diff --git a/components/Bullets/MTYSprint.tscn b/components/Bullets/MTYSprint.tscn new file mode 100644 index 0000000..4723ee3 --- /dev/null +++ b/components/Bullets/MTYSprint.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=3 uid="uid://digr2lvarxtvf"] + +[ext_resource type="PackedScene" uid="uid://crtdkysmnkith" path="res://components/Abstracts/BulletBase.tscn" id="1_pwer0"] +[ext_resource type="Script" uid="uid://dqgbohkdj8rbj" path="res://scripts/Contents/Bullets/MTYSprint.gd" id="2_rion0"] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_rion0"] +radius = 40.0 +height = 150.0 + +[node name="MTYSprint" instance=ExtResource("1_pwer0")] +script = ExtResource("2_rion0") +displayName = "猛冲" +baseDamage = 5.0 +penerate = 1.0 + +[node name="hitbox" parent="." index="1"] +shape = SubResource("CapsuleShape2D_rion0") diff --git a/components/Characters/MTY.tscn b/components/Characters/MTY.tscn index d7ecb8a..9b9600c 100644 --- a/components/Characters/MTY.tscn +++ b/components/Characters/MTY.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=6 format=3 uid="uid://b5ysxff1ujv4l"] +[gd_scene load_steps=7 format=3 uid="uid://b5ysxff1ujv4l"] [ext_resource type="PackedScene" uid="uid://cvogxi7mktumf" path="res://components/Abstracts/EntityBase.tscn" id="1_8og84"] +[ext_resource type="Script" uid="uid://b80jr04qpitly" path="res://scripts/Contents/Characters/MTY.gd" id="2_hjlm2"] [ext_resource type="Texture2D" uid="uid://cpaafqx7vf443" path="res://resources/characters/bird/mty.png" id="2_i2hh0"] [sub_resource type="SpriteFrames" id="SpriteFrames_hjlm2"] @@ -24,6 +25,7 @@ radius = 37.0 height = 126.0 [node name="MTY" instance=ExtResource("1_8og84")] +script = ExtResource("2_hjlm2") displayName = "猫头鹰" drops = Array[int]([0, 1, 3]) dropCounts = Array[Vector2]([Vector2(2, 4), Vector2(2, 4), Vector2(1, 3)]) diff --git a/scripts/Contents/Bullets/MTYSprint.gd b/scripts/Contents/Bullets/MTYSprint.gd new file mode 100644 index 0000000..ade1e62 --- /dev/null +++ b/scripts/Contents/Bullets/MTYSprint.gd @@ -0,0 +1,5 @@ +extends BulletBase +class_name MTYSprint + +func ai(): + PresetBulletAI.lockLauncher(self, launcher, true) diff --git a/scripts/Contents/Bullets/MTYSprint.gd.uid b/scripts/Contents/Bullets/MTYSprint.gd.uid new file mode 100644 index 0000000..9897978 --- /dev/null +++ b/scripts/Contents/Bullets/MTYSprint.gd.uid @@ -0,0 +1 @@ +uid://dqgbohkdj8rbj diff --git a/scripts/Contents/Characters/MTY.gd b/scripts/Contents/Characters/MTY.gd new file mode 100644 index 0000000..0dc8fb5 --- /dev/null +++ b/scripts/Contents/Characters/MTY.gd @@ -0,0 +1,22 @@ +extends EntityBase +class_name MTY + +func register(): + fields[FieldStore.Entity.MAX_HEALTH] = 400 + fields[FieldStore.Entity.MOVEMENT_SPEED] = 0.9 + attackCooldownMap[0] = 1500 + sprintMultiplier = 5 +func spawn(): + BulletBase.generate(ComponentManager.getBullet("MTYSprint"), self, position, 0) +func ai(): + PresetEntityAI.follow(self, currentFocusedBoss) + tryAttack(0) +func attack(type: int): + if type == 0: + trySprint() + return true +func sprint(): + var target = BulletTool.findClosetBulletCanDamage(position, get_tree(), self) + if is_instance_valid(target): + var dir = (target.position - position).rotated(MathTool.randc_from([-1, 1]) * deg_to_rad(90)) + move(dir.normalized() * sprintMultiplier, true) diff --git a/scripts/Contents/Characters/MTY.gd.uid b/scripts/Contents/Characters/MTY.gd.uid new file mode 100644 index 0000000..31bab00 --- /dev/null +++ b/scripts/Contents/Characters/MTY.gd.uid @@ -0,0 +1 @@ +uid://b80jr04qpitly diff --git a/scripts/Contents/Wave.gd b/scripts/Contents/Wave.gd index 7873a32..4b0f3cb 100644 --- a/scripts/Contents/Wave.gd +++ b/scripts/Contents/Wave.gd @@ -27,6 +27,7 @@ static var WAVE_NORMAL = [ Wave.create("Hen", 1, 3, false, 0, INF, 1), Wave.create("Cat", 1, 3, false, 0, INF, 1), Wave.create("Dog", 1, 3, false, 0, INF, 1), + Wave.create("MTY", 0, 1, false, 0, INF, 4), Wave.create("Chick", 0, 0, true, 9, INF, 20), Wave.create("KukeMC", 0, 0, true, 19, INF, 20), Wave.create("Bear", 0, 0, true, 29, INF, 20), diff --git a/scripts/Tools/BulletTool.gd b/scripts/Tools/BulletTool.gd index 0af38be..1bfaa25 100644 --- a/scripts/Tools/BulletTool.gd +++ b/scripts/Tools/BulletTool.gd @@ -12,3 +12,20 @@ static func canDamage(bullet: BulletBase, target: EntityBase) -> bool: if !GameRule.allowFriendlyFire: if target.isPlayer() == bullet.launcher.isPlayer() and bullet.launcher.currentFocusedBoss != target: return false return true +static func findClosetBullet(to: Vector2, fromTree: SceneTree) -> BulletBase: + var result: BulletBase = null + var lastDistance = INF + for bullet in fromTree.get_nodes_in_group("bullets"): + if to.distance_to(bullet.position) < lastDistance: + lastDistance = to.distance_to(bullet.position) + result = bullet + return result +static func findClosetBulletCanDamage(to: Vector2, fromTree: SceneTree, target: EntityBase) -> BulletBase: + var result: BulletBase = null + var lastDistance = INF + for bullet in fromTree.get_nodes_in_group("bullets"): + if canDamage(bullet, target): + if to.distance_to(bullet.position) < lastDistance: + lastDistance = to.distance_to(bullet.position) + result = bullet + return result