完善宠物系统

This commit is contained in:
2025-07-26 22:41:15 +08:00
parent 02a7e29e52
commit 048600e95d
135 changed files with 10204 additions and 5859 deletions

368
Scene/NewPet/BulletBase.gd Normal file
View File

@@ -0,0 +1,368 @@
extends Area2D
class_name BulletBase
# 简化子弹系统 - 辅助攻击用
# 基础功能:移动、碰撞检测、伤害
signal bullet_hit(bullet: BulletBase, target: NewPetBase)
@onready var sprite: Sprite2D = $Sprite
@onready var collision_shape: CollisionShape2D = $CollisionShape2D
const bullet = {
"小蓝弹":{
"图片":"res://assets/子弹图片/01.png",
"函数":"create_blue_bullet"
},
"小红弹":{
"图片":"res://assets/子弹图片/02.png",
"函数":"create_red_bullet"
},
"小粉弹":{
"图片":"res://assets/子弹图片/03.png",
"函数":"create_pink_bullet"
},
"小紫弹":{
"图片":"res://assets/子弹图片/04.png",
"函数":"create_purple_bullet"
},
"长橙弹":{
"图片":"res://assets/子弹图片/21.png",
"函数":"create_long_orange_bullet"
},
"长紫弹":{
"图片":"res://assets/子弹图片/22.png",
"函数":"create_long_purple_bullet"
},
"长绿弹":{
"图片":"res://assets/子弹图片/25.png",
"函数":"create_long_green_bullet"
},
"黄色闪电":{
"图片":"res://assets/子弹图片/36.png",
"函数":"create_yellow_lightning_bullet"
},
"绿色闪电":{
"图片":"res://assets/子弹图片/35.png",
"函数":"create_green_lightning_bullet"
},
"红色闪电":{
"图片":"res://assets/子弹图片/33.png",
"函数":"create_red_lightning_bullet"
},
"紫色闪电":{
"图片":"res://assets/子弹图片/32.png",
"函数":"create_purple_lightning_bullet"
},
}
# 基础子弹属性
var direction: Vector2 = Vector2.RIGHT
var speed: float = 300.0
var damage: float = 25.0
var owner_pet: NewPetBase = null
var max_distance: float = 800.0
var traveled_distance: float = 0.0
var is_active: bool = true
# 生存时间
var lifetime: float = 3.0
var current_lifetime: float = 0.0
#==================基础函数=========================
func _ready():
# 连接碰撞信号
area_entered.connect(_on_area_entered)
# 设置碰撞层
collision_layer = 4 # 子弹层
collision_mask = 1 # 只检测宠物层
# 添加到子弹组
add_to_group("bullets")
func _physics_process(delta):
if not is_active:
return
# 更新生存时间
current_lifetime += delta
if current_lifetime >= lifetime:
call_deferred("destroy_bullet")
return
# 检查长紫弹分裂计时
if has_meta("bullet_type") and get_meta("bullet_type") == "长紫弹":
var current_split_time = get_meta("current_split_time", 0.0)
var split_timer = get_meta("split_timer", 2.0)
current_split_time += delta
set_meta("current_split_time", current_split_time)
if current_split_time >= split_timer:
# 时间到了,分裂并销毁
call_deferred("create_split_bullets", global_position)
call_deferred("destroy_bullet")
return
# 移动子弹
var movement = direction * speed * delta
position += movement
traveled_distance += movement.length()
# 检查最大距离
if traveled_distance >= max_distance:
call_deferred("destroy_bullet")
return
# 检查是否超出屏幕边界
var viewport_rect = get_viewport().get_visible_rect()
if not viewport_rect.has_point(global_position):
call_deferred("destroy_bullet")
#==================基础函数=========================
#=============================每个子弹单独效果============================
# 小蓝弹
func create_blue_bullet():
sprite.texture = load(bullet["小蓝弹"]["图片"])
speed = 250.0
damage = 20.0
lifetime = 2.5
sprite.modulate = Color(0.5, 0.8, 1.0, 1.0) # 蓝色调
# 小红弹
func create_red_bullet():
sprite.texture = load(bullet["小红弹"]["图片"])
speed = 300.0
damage = 25.0
lifetime = 3.0
sprite.modulate = Color(1.0, 0.5, 0.5, 1.0) # 红色调
# 小粉弹
func create_pink_bullet():
sprite.texture = load(bullet["小粉弹"]["图片"])
speed = 280.0
damage = 22.0
lifetime = 2.8
sprite.modulate = Color(1.0, 0.7, 0.9, 1.0) # 粉色调
# 小紫弹
func create_purple_bullet():
sprite.texture = load(bullet["小紫弹"]["图片"])
speed = 320.0
damage = 28.0
lifetime = 3.2
sprite.modulate = Color(0.8, 0.5, 1.0, 1.0) # 紫色调
# 长橙弹
func create_long_orange_bullet():
sprite.texture = load(bullet["长橙弹"]["图片"])
speed = 350.0
damage = 35.0
lifetime = 4.0
max_distance = 1000.0
sprite.modulate = Color(1.0, 0.7, 0.3, 1.0) # 橙色调
# 长紫弹
func create_long_purple_bullet():
sprite.texture = load(bullet["长紫弹"]["图片"])
speed = 330.0
damage = 32.0
lifetime = 3.8
max_distance = 950.0
sprite.modulate = Color(0.9, 0.4, 1.0, 1.0) # 深紫色调
# 标记为长紫弹2秒后自动分裂
set_meta("bullet_type", "长紫弹")
set_meta("split_timer", 2.0) # 2秒后分裂
set_meta("current_split_time", 0.0) # 当前计时
# 创建分裂子弹长紫弹2秒后的效果
func create_split_bullets(hit_position: Vector2):
"""在指定位置生成4个小弹向四周发射"""
var bullet_types = ["小蓝弹", "小红弹", "小粉弹", "小紫弹"]
var bullet_scene = preload("res://Scene/NewPet/BulletBase.tscn")
# 生成4个方向的子弹
for i in range(4):
# 计算方向角度每90度一个方向
var angle = i * PI / 2.0
var direction_vector = Vector2(cos(angle), sin(angle))
# 选择子弹类型每种类型1个
var bullet_type = bullet_types[i]
# 创建子弹实例
var new_bullet = bullet_scene.instantiate()
get_parent().add_child(new_bullet)
# 设置子弹位置
new_bullet.global_position = hit_position
# 设置子弹属性5个参数方向、速度、伤害、所有者、子弹类型
new_bullet.setup(direction_vector, 200.0, 15.0, owner_pet, bullet_type)
# 分裂子弹生成完成
# 长绿弹
func create_long_green_bullet():
sprite.texture = load(bullet["长绿弹"]["图片"])
speed = 310.0
damage = 30.0
lifetime = 3.5
max_distance = 900.0
sprite.modulate = Color(0.4, 1.0, 0.5, 1.0) # 绿色调
# 黄色闪电
func create_yellow_lightning_bullet():
sprite.texture = load(bullet["黄色闪电"]["图片"])
speed = 400.0
damage = 40.0
lifetime = 2.0
max_distance = 600.0
sprite.modulate = Color(1.0, 1.0, 0.3, 1.0) # 黄色闪电
# 绿色闪电
func create_green_lightning_bullet():
sprite.texture = load(bullet["绿色闪电"]["图片"])
speed = 380.0
damage = 38.0
lifetime = 2.2
max_distance = 650.0
sprite.modulate = Color(0.3, 1.0, 0.3, 1.0) # 绿色闪电
# 红色闪电
func create_red_lightning_bullet():
sprite.texture = load(bullet["红色闪电"]["图片"])
speed = 420.0
damage = 45.0
lifetime = 1.8
max_distance = 550.0
sprite.modulate = Color(1.0, 0.3, 0.3, 1.0) # 红色闪电
# 紫色闪电
func create_purple_lightning_bullet():
sprite.texture = load(bullet["紫色闪电"]["图片"])
speed = 450.0
damage = 50.0
lifetime = 1.5
max_distance = 500.0
sprite.modulate = Color(0.8, 0.3, 1.0, 1.0) # 紫色闪电
#=============================每个子弹单独效果============================
#=========================通用子弹函数==============================
# 通用子弹创建函数
func create_bullet_by_name(bullet_name: String):
"""根据子弹名称创建对应类型的子弹"""
if not bullet.has(bullet_name):
return
var bullet_data = bullet[bullet_name]
var function_name = bullet_data.get("函数", "")
if function_name != "":
call(function_name)
# 获取子弹图标
func get_bullet_icon(bullet_name: String) -> Texture2D:
if bullet.has(bullet_name) and bullet[bullet_name].has("图片"):
return load(bullet[bullet_name]["图片"])
else:
return null
# 获取所有子弹名称列表
func get_all_bullet_names() -> Array:
return bullet.keys()
# 创建击中特效
func create_hit_effect(pos: Vector2):
pass
#销毁子弹
func destroy_bullet():
"""销毁子弹"""
is_active = false
remove_from_group("bullets")
queue_free()
#初始化子弹
func setup(dir: Vector2, spd: float, dmg: float, owner: NewPetBase, bullet_type: String = ""):
"""初始化子弹"""
direction = dir.normalized()
owner_pet = owner
# 如果指定了子弹类型,使用对应的创建函数
if bullet_type != "" and bullet.has(bullet_type):
create_bullet_by_name(bullet_type)
else:
# 使用传入的参数作为默认值
speed = spd
damage = dmg
# 简单的视觉效果
sprite.modulate = Color.YELLOW
# 设置子弹旋转
rotation = direction.angle()
#碰撞检测
func _on_area_entered(area: Area2D):
"""碰撞检测"""
if not is_active:
return
# 检查是否是宠物
if not area is NewPetBase:
return
var pet_target = area as NewPetBase
# 检查是否是有效目标
if not is_valid_target(pet_target):
return
# 造成伤害并延迟销毁子弹(避免在物理查询期间修改状态)
hit_target(pet_target)
call_deferred("destroy_bullet")
#检查是否是有效攻击目标
func is_valid_target(target: NewPetBase) -> bool:
"""检查是否是有效攻击目标"""
# 检查owner_pet是否有效
if not is_instance_valid(owner_pet):
owner_pet = null
# 不能攻击自己的主人
if target == owner_pet:
return false
# 不能攻击同队伍
if owner_pet != null and target.pet_team == owner_pet.pet_team:
return false
# 不能攻击已死亡的宠物
if not target.is_alive:
return false
return true
#击中目标
func hit_target(target: NewPetBase):
"""击中目标"""
# 检查owner_pet是否有效防止已释放对象错误
if not is_instance_valid(owner_pet):
owner_pet = null
# 造成伤害
target.take_damage(damage, owner_pet)
# 发射信号
bullet_hit.emit(self, target)
# 创建击中特效
create_hit_effect(target.global_position)
#=========================通用子弹函数==============================