feat: 1. 添加武器基础脚本

2. 添加武器基本resources
3. 武器碰撞 RangeArea 进入和退出检测
4. 添加 Hitbox 进行武器碰撞敌人区域(只是添加了,功能还没实现)
5. 武器冷却时间 weapon_base / CooldownTimer
This commit is contained in:
luke358
2026-05-19 00:22:38 +08:00
parent 883a9b4c05
commit 7c7b2e9420
19 changed files with 263 additions and 0 deletions
+7
View File
@@ -6,6 +6,13 @@ signal on_create_damage_text(unit: Node2D, hitbox: HitboxComponent)
const FLASH_MATERIAL = preload("uid://cwtrdmkrsmw23") const FLASH_MATERIAL = preload("uid://cwtrdmkrsmw23")
const FLOATING_TEXT_SCENE = preload("uid://qkwyrg22h3gi") const FLOATING_TEXT_SCENE = preload("uid://qkwyrg22h3gi")
enum UpgradeTier {
COMMON,
RARE,
EPIC,
LEGENDARY
}
var player: Player var player: Player
# 尝试阻止敌人攻击,获取闪避, unit_stats block_chance 越大 # 尝试阻止敌人攻击,获取闪避, unit_stats block_chance 越大
+18
View File
@@ -0,0 +1,18 @@
extends Resource
class_name ItemBase
enum ItemType {
WEAPON,
UPGRADE,
PASSIVE
}
@export var item_name: String
@export var item_icon: Texture2D
@export var item_tier: Global.UpgradeTier
@export var item_type: ItemType
@export var item_cost: int
func get_description() -> String:
return ""
+1
View File
@@ -0,0 +1 @@
uid://jdonfq601lgj
+12
View File
@@ -0,0 +1,12 @@
extends ItemBase
class_name ItemWeapon
enum WeaponType {
MELEE,
RANGE
}
@export var type: WeaponType
@export var scene: PackedScene
@export var stats: WeaponStats
@export var upgradge_to: ItemWeapon
@@ -0,0 +1 @@
uid://26bxxaoso6np
@@ -0,0 +1,17 @@
[gd_resource type="Resource" script_class="ItemWeapon" format=3 uid="uid://murcuuks1j8l"]
[ext_resource type="Texture2D" uid="uid://cyh23wqn8vcac" path="res://assets/sprites/Weapons/Icons/weapon_punch_icon.png" id="1_h03dk"]
[ext_resource type="Script" uid="uid://26bxxaoso6np" path="res://resources/items/weapons/item_weapon.gd" id="1_o6o4d"]
[ext_resource type="PackedScene" uid="uid://d1igydtpm3sq8" path="res://scenes/weapons/melee/weapon_punch.tscn" id="2_rm85p"]
[ext_resource type="Resource" uid="uid://dqsjrkb2ehidv" path="res://resources/items/weapons/melee/punch/stats_punch_1.tres" id="3_ftcsy"]
[ext_resource type="Resource" uid="uid://cakw72u61qp80" path="res://resources/items/weapons/melee/punch/item_punch_2.tres" id="4_k4o1h"]
[resource]
script = ExtResource("1_o6o4d")
scene = ExtResource("2_rm85p")
stats = ExtResource("3_ftcsy")
upgradge_to = ExtResource("4_k4o1h")
item_name = "Punch I"
item_icon = ExtResource("1_h03dk")
item_cost = 12
metadata/_custom_type_script = "uid://26bxxaoso6np"
@@ -0,0 +1,18 @@
[gd_resource type="Resource" script_class="ItemWeapon" format=3 uid="uid://cakw72u61qp80"]
[ext_resource type="Texture2D" uid="uid://cyh23wqn8vcac" path="res://assets/sprites/Weapons/Icons/weapon_punch_icon.png" id="1_wrw2j"]
[ext_resource type="Script" uid="uid://26bxxaoso6np" path="res://resources/items/weapons/item_weapon.gd" id="2_amj6w"]
[ext_resource type="PackedScene" uid="uid://d1igydtpm3sq8" path="res://scenes/weapons/melee/weapon_punch.tscn" id="2_igce5"]
[ext_resource type="Resource" uid="uid://c6a44r3a7jmyd" path="res://resources/items/weapons/melee/punch/stats_punch_2.tres" id="3_wrw2j"]
[ext_resource type="Resource" uid="uid://h4jqjg8mu53b" path="res://resources/items/weapons/melee/punch/item_punch_3.tres" id="4_amj6w"]
[resource]
script = ExtResource("2_amj6w")
scene = ExtResource("2_igce5")
stats = ExtResource("3_wrw2j")
upgradge_to = ExtResource("4_amj6w")
item_name = "Punch II"
item_icon = ExtResource("1_wrw2j")
item_tier = 1
item_cost = 25
metadata/_custom_type_script = "uid://26bxxaoso6np"
@@ -0,0 +1,18 @@
[gd_resource type="Resource" script_class="ItemWeapon" format=3 uid="uid://h4jqjg8mu53b"]
[ext_resource type="Texture2D" uid="uid://cyh23wqn8vcac" path="res://assets/sprites/Weapons/Icons/weapon_punch_icon.png" id="1_c6qlh"]
[ext_resource type="PackedScene" uid="uid://d1igydtpm3sq8" path="res://scenes/weapons/melee/weapon_punch.tscn" id="2_nyb4v"]
[ext_resource type="Script" uid="uid://26bxxaoso6np" path="res://resources/items/weapons/item_weapon.gd" id="2_tds7r"]
[ext_resource type="Resource" uid="uid://dwdqmgsh0e417" path="res://resources/items/weapons/melee/punch/stats_punch_3.tres" id="3_c6qlh"]
[ext_resource type="Resource" uid="uid://b535w50o17ui" path="res://resources/items/weapons/melee/punch/item_punch_4.tres" id="4_tds7r"]
[resource]
script = ExtResource("2_tds7r")
scene = ExtResource("2_nyb4v")
stats = ExtResource("3_c6qlh")
upgradge_to = ExtResource("4_tds7r")
item_name = "Punch III"
item_icon = ExtResource("1_c6qlh")
item_tier = 2
item_cost = 55
metadata/_custom_type_script = "uid://26bxxaoso6np"
@@ -0,0 +1,16 @@
[gd_resource type="Resource" script_class="ItemWeapon" format=3 uid="uid://b535w50o17ui"]
[ext_resource type="Texture2D" uid="uid://cyh23wqn8vcac" path="res://assets/sprites/Weapons/Icons/weapon_punch_icon.png" id="1_f1uf4"]
[ext_resource type="Script" uid="uid://26bxxaoso6np" path="res://resources/items/weapons/item_weapon.gd" id="2_503wk"]
[ext_resource type="PackedScene" uid="uid://d1igydtpm3sq8" path="res://scenes/weapons/melee/weapon_punch.tscn" id="2_tm866"]
[ext_resource type="Resource" uid="uid://d32uq8u04r5t7" path="res://resources/items/weapons/melee/punch/stats_punch_4.tres" id="3_f1uf4"]
[resource]
script = ExtResource("2_503wk")
scene = ExtResource("2_tm866")
stats = ExtResource("3_f1uf4")
item_name = "Punch IV"
item_icon = ExtResource("1_f1uf4")
item_tier = 3
item_cost = 130
metadata/_custom_type_script = "uid://26bxxaoso6np"
@@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="WeaponStats" format=3 uid="uid://dqsjrkb2ehidv"]
[ext_resource type="Script" uid="uid://d3d6rctbb48mk" path="res://resources/items/weapons/weapon_stats.gd" id="1_b0adc"]
[resource]
script = ExtResource("1_b0adc")
damage = 4.0
accurary = 1.0
cooldown = 1.5
max_range = 180.0
knockback = 1.0
metadata/_custom_type_script = "uid://d3d6rctbb48mk"
@@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="WeaponStats" format=3 uid="uid://c6a44r3a7jmyd"]
[ext_resource type="Script" uid="uid://d3d6rctbb48mk" path="res://resources/items/weapons/weapon_stats.gd" id="1_ccedh"]
[resource]
script = ExtResource("1_ccedh")
damage = 8.0
accurary = 1.0
cooldown = 1.2
max_range = 180.0
knockback = 1.0
metadata/_custom_type_script = "uid://d3d6rctbb48mk"
@@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="WeaponStats" format=3 uid="uid://dwdqmgsh0e417"]
[ext_resource type="Script" uid="uid://d3d6rctbb48mk" path="res://resources/items/weapons/weapon_stats.gd" id="1_jst7l"]
[resource]
script = ExtResource("1_jst7l")
damage = 16.0
accurary = 1.0
cooldown = 0.9
max_range = 180.0
knockback = 1.0
metadata/_custom_type_script = "uid://d3d6rctbb48mk"
@@ -0,0 +1,14 @@
[gd_resource type="Resource" script_class="WeaponStats" format=3 uid="uid://d32uq8u04r5t7"]
[ext_resource type="Script" uid="uid://d3d6rctbb48mk" path="res://resources/items/weapons/weapon_stats.gd" id="1_kkanm"]
[resource]
script = ExtResource("1_kkanm")
damage = 30.0
accurary = 1.0
cooldown = 0.7
crit_chance = 0.1
crit_damage = 2.0
max_range = 200.0
knockback = 1.0
metadata/_custom_type_script = "uid://d3d6rctbb48mk"
+18
View File
@@ -0,0 +1,18 @@
extends Resource
class_name WeaponStats
@export var damage := 1.0
@export_range(0.0,1.0) var accurary := 0.9
@export_range(0.5,3.0) var cooldown := 1.0
@export_range(0.0,1.0) var crit_chance := 0.05
@export var crit_damage := 1.5
@export var max_range := 150.0
@export var knockback := 0.0
@export_range(0.0,1.0) var life_steal := 0.0
@export var recoil := 25.0
@export_range(0.1,3.0) var recoil_duration := 0.0
@export_range(0.1,3.0) var attack_duration := 0.2
@export_range(0.1,3.0) var back_duration := 0.15
@export var projectile_scene: PackedScene
@export var projectile_speed := 1600.0
@@ -0,0 +1 @@
uid://d3d6rctbb48mk
+20
View File
@@ -0,0 +1,20 @@
[gd_scene format=3 uid="uid://d1igydtpm3sq8"]
[ext_resource type="PackedScene" uid="uid://dcc7rsdy4j8v6" path="res://scenes/weapons/weapon_base.tscn" id="1_soyvn"]
[ext_resource type="PackedScene" uid="uid://c0fyx8gj5uexl" path="res://scenes/components/hitbox_component.tscn" id="2_gq287"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_gq287"]
size = Vector2(52, 42)
[node name="WeaponPunch" unique_id=63743776 instance=ExtResource("1_soyvn")]
[node name="Sprite2D" parent="." index="0" unique_id=1011668514]
position = Vector2(21, 1)
[node name="HitboxComponent" parent="Sprite2D" index="0" unique_id=151235566 instance=ExtResource("2_gq287")]
scale = Vector2(2, 2)
[node name="CollisionShape2D" type="CollisionShape2D" parent="Sprite2D/HitboxComponent" index="0" unique_id=1064980236]
z_index = 1
shape = SubResource("RectangleShape2D_gq287")
debug_color = Color(0.9556908, 0.042769283, 0.5218647, 0.41960785)
+36
View File
@@ -0,0 +1,36 @@
extends Node2D
class_name Weapon
@onready var sprite_2d: Sprite2D = $Sprite2D
@onready var collision: CollisionShape2D = %CollisionShape2D
@onready var cooldown_timer: Timer = $CooldownTimer
var data: ItemWeapon
var is_attacking := false
var atk_start_pos: Vector2
var targets: Array[Enemy]
var closest_target: Enemy
var weapon_spread: float
func _ready() -> void:
atk_start_pos = sprite_2d.position
func setup_weapon(data: ItemWeapon) -> void:
self.data = data
collision.shape.radius = data.stats.max_range
func can_use_weapon() -> bool:
return cooldown_timer.is_stopped() and closest_target
func _on_range_area_area_entered(area: Area2D) -> void:
targets.push_back(area)
func _on_range_area_area_exited(area: Area2D) -> void:
targets.erase(area)
if targets.size() == 0:
closest_target = null
+1
View File
@@ -0,0 +1 @@
uid://d2fxp4oky50qs
+29
View File
@@ -0,0 +1,29 @@
[gd_scene format=3 uid="uid://dcc7rsdy4j8v6"]
[ext_resource type="Script" uid="uid://d2fxp4oky50qs" path="res://scenes/weapons/weapon.gd" id="1_v4xn6"]
[ext_resource type="Texture2D" uid="uid://l5hst1cf27oo" path="res://assets/sprites/Weapons/Melee/Weapon_Punch.png" id="2_uvw4m"]
[sub_resource type="CircleShape2D" id="CircleShape2D_vffjk"]
radius = 150.0
[node name="WeaponBase" type="Node2D" unique_id=63743776]
script = ExtResource("1_v4xn6")
[node name="Sprite2D" type="Sprite2D" parent="." unique_id=1011668514]
scale = Vector2(0.5, 0.5)
texture = ExtResource("2_uvw4m")
[node name="RangeArea" type="Area2D" parent="." unique_id=877203105]
collision_mask = 2
[node name="CollisionShape2D" type="CollisionShape2D" parent="RangeArea" unique_id=902525969]
unique_name_in_owner = true
shape = SubResource("CircleShape2D_vffjk")
[node name="CooldownTimer" type="Timer" parent="." unique_id=1814049304]
one_shot = true
[node name="WeaponBehavior" type="Node2D" parent="." unique_id=1507497844]
[connection signal="area_entered" from="RangeArea" to="." method="_on_range_area_area_entered"]
[connection signal="area_exited" from="RangeArea" to="." method="_on_range_area_area_exited"]