前几天忘了上传了上传一下

This commit is contained in:
2025-07-09 17:37:10 +08:00
parent 3ccd7e93ed
commit 68a9508f4d
1526 changed files with 60713 additions and 9496 deletions

129
Script/Pet/Projectile.gd Normal file
View File

@@ -0,0 +1,129 @@
extends Area2D
# 子弹属性
var damage: float = 20.0
var speed: float = 300.0
var direction: Vector2 = Vector2.ZERO
var attacker_team: String = ""
var attacker_element: int = 0
var armor_penetration: float = 0.0
var attacker_pet: CharacterBody2D = null # 攻击者引用
# 子弹生存时间(防止子弹飞出边界后一直存在)
var lifetime: float = 3.0
var lifetime_timer: float = 0.0 # 生存时间计时器
func _ready():
# 连接碰撞信号
area_entered.connect(_on_area_entered)
body_entered.connect(_on_body_entered)
# 设置子弹的碰撞层 - 子弹需要能检测到所有队伍的宠物
collision_layer = 0 # 子弹本身不需要被检测
collision_mask = 3 # 检测team1和team2的宠物 (1+2)
# 创建简单的圆形纹理
create_circle_texture()
# 添加到子弹组
add_to_group("projectiles")
func _physics_process(delta):
# 子弹移动
global_position += direction * speed * delta
# 更新生存时间
lifetime_timer += delta
if lifetime_timer >= lifetime:
destroy_projectile()
# 销毁子弹(直接销毁)
func destroy_projectile():
# 延迟销毁,避免在物理回调中移除节点
call_deferred("queue_free")
# 穿透属性
var pierce_remaining: int = 1 # 剩余穿透次数
var hit_enemies: Array[CharacterBody2D] = [] # 已击中的敌人列表(防止重复击中)
func set_projectile_data(dmg: float, spd: float, dir: Vector2, team: String, element: int, armor_pen: float = 0.0, pierce: int = 1, attacker: CharacterBody2D = null):
damage = dmg
speed = spd
direction = dir.normalized()
attacker_team = team
attacker_element = element
armor_penetration = armor_pen
pierce_remaining = pierce
attacker_pet = attacker
func _on_area_entered(area):
# 这里可以处理与其他Area2D的碰撞如果需要
pass
func _on_body_entered(body):
# 检查是否击中敌方宠物
if body is CharacterBody2D and body.has_method("get_team"):
var target_team = body.get_team()
# 不能击中同队伍的宠物
if target_team == attacker_team:
print("子弹跳过同队伍宠物: " + body.pet_name + " (队伍: " + target_team + ")")
return
# 不能击中死亡的宠物
if not body.is_alive:
print("子弹跳过死亡宠物: " + body.pet_name)
return
# 不能重复击中同一个敌人
if body in hit_enemies:
print("子弹跳过已击中的宠物: " + body.pet_name)
return
# 记录击中的敌人
hit_enemies.append(body)
# 对目标造成伤害(检查攻击者是否还有效)
var valid_attacker = null
if attacker_pet and is_instance_valid(attacker_pet):
valid_attacker = attacker_pet
body.take_damage(damage, armor_penetration, attacker_element, valid_attacker)
print("子弹击中敌方宠物: " + body.pet_name + " (攻击方: " + attacker_team + " 目标: " + target_team + ") 造成伤害: " + str(damage))
# 减少穿透次数
pierce_remaining -= 1
# 如果穿透次数用完,销毁子弹
if pierce_remaining <= 0:
print("子弹穿透次数用完,销毁")
destroy_projectile()
else:
print("子弹穿透,剩余穿透次数: " + str(pierce_remaining))
else:
print("子弹击中非宠物对象: " + str(body))
# 创建简单的圆形纹理
func create_circle_texture():
var sprite = get_node_or_null("ProjectileSprite")
if sprite:
# 创建一个简单的圆形图像纹理
var image = Image.create(20, 20, false, Image.FORMAT_RGBA8)
var center = Vector2(10, 10)
var radius = 8
# 绘制圆形
for x in range(20):
for y in range(20):
var distance = Vector2(x, y).distance_to(center)
if distance <= radius:
# 设置黄色像素
image.set_pixel(x, y, Color.YELLOW)
else:
# 设置透明像素
image.set_pixel(x, y, Color.TRANSPARENT)
# 创建纹理并应用
var texture = ImageTexture.new()
texture.set_image(image)
sprite.texture = texture