From cf8c5b90fff2c995e98a097c09ddd1a0596ec94d Mon Sep 17 00:00:00 2001 From: luke358 Date: Tue, 19 May 2026 16:44:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=201.=20=E6=AD=A6=E5=99=A8=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=A0=B9=E6=8D=AE=E6=9C=80=E8=BF=91=E7=9A=84=E6=95=8C?= =?UTF-8?q?=E4=BA=BA=E6=97=8B=E8=BD=AC=202.=20=E6=B5=81=E7=A8=8B=EF=BC=9Ap?= =?UTF-8?q?layer=20=E5=88=9D=E5=A7=8B=E5=8C=96=E8=B0=83=E7=94=A8=20add=5Fw?= =?UTF-8?q?eapon=EF=BC=8C=E6=9B=B4=E6=96=B0weapon=5Fcontainer=EF=BC=8Cweap?= =?UTF-8?q?on=5Fpunch=E5=9C=A8=5Fprocess=E6=AF=8F=E4=B8=80=E5=B8=A7?= =?UTF-8?q?=E4=B8=AD=E7=9B=91=E5=90=AC=EF=BC=8C=E6=9B=B4=E6=96=B0update=5F?= =?UTF-8?q?closest=5Ftarget=E6=9C=80=E8=BF=91=E7=9A=84=E6=95=8C=E4=BA=BA?= =?UTF-8?q?=EF=BC=8C=E7=84=B6=E5=90=8Erotate=5Fto=5Ftarget=E6=97=8B?= =?UTF-8?q?=E8=BD=AC=E5=88=B0=E6=9C=80=E8=BF=91=E7=9A=84=E6=95=8C=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/unit/players/player.gd | 8 ++- scenes/weapons/melee/weapon_punch.tscn | 2 + scenes/weapons/weapon.gd | 72 ++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 5 deletions(-) diff --git a/scenes/unit/players/player.gd b/scenes/unit/players/player.gd index 951170a..b9900bd 100644 --- a/scenes/unit/players/player.gd +++ b/scenes/unit/players/player.gd @@ -24,11 +24,6 @@ func _ready() -> void: dash_cooldown_timer.wait_time = dash_cooldown add_weapon(preload("uid://murcuuks1j8l")) - add_weapon(preload("uid://murcuuks1j8l")) - add_weapon(preload("uid://murcuuks1j8l")) - add_weapon(preload("uid://murcuuks1j8l")) - add_weapon(preload("uid://murcuuks1j8l")) - add_weapon(preload("uid://murcuuks1j8l")) @@ -89,6 +84,9 @@ func can_dash() -> bool: Input.is_action_just_pressed("dash") and \ move_dir != Vector2.ZERO +func is_facing_right() -> bool: + return visuals.scale.x == -0.5 + func _on_dash_timer_timeout() -> void: is_dashing = false visuals.modulate.a = 1.0 diff --git a/scenes/weapons/melee/weapon_punch.tscn b/scenes/weapons/melee/weapon_punch.tscn index 707cfe2..859d774 100644 --- a/scenes/weapons/melee/weapon_punch.tscn +++ b/scenes/weapons/melee/weapon_punch.tscn @@ -15,6 +15,8 @@ position = Vector2(21, 1) scale = Vector2(2, 2) collision_layer = 16 collision_mask = 8 +monitoring = false +monitorable = false [node name="CollisionShape2D" type="CollisionShape2D" parent="Sprite2D/HitboxComponent" index="0" unique_id=1064980236] z_index = 1 diff --git a/scenes/weapons/weapon.gd b/scenes/weapons/weapon.gd index 037b307..90d7ccc 100644 --- a/scenes/weapons/weapon.gd +++ b/scenes/weapons/weapon.gd @@ -16,11 +16,83 @@ var weapon_spread: float func _ready() -> void: atk_start_pos = sprite_2d.position +func _process(delta: float) -> void: + if not is_attacking: + if targets.size() > 0: + update_closest_target() + else: + closest_target = null + + rotate_to_target() + func setup_weapon(_data: ItemWeapon) -> void: self.data = _data collision.shape.radius = data.stats.max_range +func use_weapon() -> void: + calculate_spread() + +func rotate_to_target() -> void: + if is_attacking: + rotation = get_custom_rotation_to_target() + else: + rotation = get_rotation_target() + + +func get_custom_rotation_to_target() -> float: + if not closest_target or not is_instance_valid(closest_target): + return rotation + + var rot := global_position.direction_to(closest_target.global_position).angle() + + return rot + weapon_spread + + +func get_rotation_target() -> float: + if targets.size() == 0: + return get_idle_rotation() + + var rot := global_position.direction_to(closest_target.global_position).angle() + + return rot + + + +func get_idle_rotation() -> float: + if Global.player.is_facing_right(): + return 0 + else: + return PI + + +func calculate_spread() -> void: + weapon_spread += randf_range(-1 + data.stats.accurary, 1- data.stats.accurary) + rotation += weapon_spread + +func update_closest_target() -> void: + closest_target = get_closest_target() + +func get_closest_target() -> Node2D: + # 没有敌人在攻击范围 + if targets.size() == 0: + return + + var closest_enemy := targets[0] + + var closest_distance := global_position.distance_to(closest_enemy.global_position) + + for i in range(1, targets.size()): + var target: Enemy = targets[i] + var distance := global_position.distance_to(target.global_position) + + if distance < closest_distance: + closest_enemy = target + closest_distance = distance + + return closest_enemy + + func can_use_weapon() -> bool: return cooldown_timer.is_stopped() and closest_target