pt效果实现: hp mp
|
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 257 B |
|
Before Width: | Height: | Size: 118 B After Width: | Height: | Size: 121 B |
|
After Width: | Height: | Size: 120 B |
@ -0,0 +1,34 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://c5xgdirnx5gq8"
|
||||||
|
path="res://.godot/imported/headbar_shield.png-eb868afd362afa8156e57504275f9354.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://resource/ui/hud/headbar_shield.png"
|
||||||
|
dest_files=["res://.godot/imported/headbar_shield.png-eb868afd362afa8156e57504275f9354.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=0
|
||||||
|
compress/normal_map=2
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=false
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
|
Before Width: | Height: | Size: 194 B After Width: | Height: | Size: 209 B |
|
Before Width: | Height: | Size: 141 B After Width: | Height: | Size: 142 B |
@ -0,0 +1,34 @@
|
|||||||
|
[gd_scene load_steps=6 format=3 uid="uid://cjvrn0m6dnkwm"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://script/item/pt.gd" id="1_7fo1j"]
|
||||||
|
[ext_resource type="Material" uid="uid://b3mpocbc8svx2" path="res://render/material/fragment.tres" id="2_rgdfq"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://bcrr12gbos636" path="res://render/texture/particle/shape/fragment1.png" id="3_slgv7"]
|
||||||
|
|
||||||
|
[sub_resource type="Curve" id="Curve_q38s7"]
|
||||||
|
max_value = 8.0
|
||||||
|
_data = [Vector2(0, 4), 0.0, 1.4, 0, 0, Vector2(1, 8), 0.0, 0.0, 0, 0]
|
||||||
|
point_count = 2
|
||||||
|
|
||||||
|
[sub_resource type="BoxShape3D" id="BoxShape3D_4u1o3"]
|
||||||
|
size = Vector3(0.1, 0.1, 0.1)
|
||||||
|
|
||||||
|
[node name="PT" type="RigidBody3D"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.40703, 3.77352, 0)
|
||||||
|
collision_layer = 256
|
||||||
|
linear_damp = 0.1
|
||||||
|
script = ExtResource("1_7fo1j")
|
||||||
|
follow_speed_curve = SubResource("Curve_q38s7")
|
||||||
|
color_hp = Color(0.94902, 0.494118, 0.498039, 1)
|
||||||
|
color_mp = Color(0.286275, 0.701961, 0.854902, 1)
|
||||||
|
|
||||||
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
shape = SubResource("BoxShape3D_4u1o3")
|
||||||
|
|
||||||
|
[node name="Sprite3D" type="Sprite3D" parent="."]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
material_override = ExtResource("2_rgdfq")
|
||||||
|
pixel_size = 0.004
|
||||||
|
texture = ExtResource("3_slgv7")
|
||||||
|
hframes = 2
|
||||||
|
vframes = 2
|
||||||
@ -0,0 +1,109 @@
|
|||||||
|
extends RigidBody3D
|
||||||
|
class_name PT
|
||||||
|
|
||||||
|
@export var follow_speed_curve: Curve
|
||||||
|
@export var color_hp: Color = Color.WHITE
|
||||||
|
@export var color_mp: Color = Color.WHITE
|
||||||
|
|
||||||
|
var type: Enum.EPtType
|
||||||
|
var value: int = 1
|
||||||
|
var velocity_min: Vector2 = Vector2.RIGHT *1
|
||||||
|
var velocity_max: Vector2 = Vector2.ONE *4
|
||||||
|
var born_time: float = 1.0 #生成时间,无法收集
|
||||||
|
var alive_time: float = 10.0 #存活时间
|
||||||
|
var is_born: bool = false
|
||||||
|
var is_init: bool = false
|
||||||
|
var is_collect: bool = false
|
||||||
|
var collect_range: float = 2.0
|
||||||
|
var follow_dist_max: float = 5.0
|
||||||
|
|
||||||
|
@onready var sprite3D: Sprite3D = %Sprite3D as Sprite3D
|
||||||
|
@onready var collision_shape: CollisionShape3D = %CollisionShape3D as CollisionShape3D
|
||||||
|
|
||||||
|
var frame_rate: float = 0.1
|
||||||
|
var frame_time: float = 0
|
||||||
|
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
var dir: Vector2 = Util.angle_dir(randf_range(0, 360)) * randf_range(velocity_min.x, velocity_max.x)
|
||||||
|
var velocity: Vector3 = Vector3(dir.x, randf_range(velocity_min.y, velocity_max.y), dir.y)
|
||||||
|
set_linear_velocity(velocity)
|
||||||
|
|
||||||
|
|
||||||
|
func _process(delta: float) -> void:
|
||||||
|
if not is_init:
|
||||||
|
var scale: Vector3 = Vector3.ONE * sqrt(sqrt(value))
|
||||||
|
sprite3D.scale = scale
|
||||||
|
collision_shape.scale = scale
|
||||||
|
var color: Color = Color.WHITE
|
||||||
|
match type:
|
||||||
|
Enum.EPtType.HP: color = color_hp
|
||||||
|
Enum.EPtType.MP: color = color_mp
|
||||||
|
_: pass
|
||||||
|
#随机色移
|
||||||
|
color.r += randf_range(0, 0.3)
|
||||||
|
color.g += randf_range(0, 0.3)
|
||||||
|
color.b += randf_range(0, 0.3)
|
||||||
|
color.clamp()
|
||||||
|
sprite3D.modulate = color
|
||||||
|
sprite3D.rotation.z = randf_range(0, 360)
|
||||||
|
is_init = true
|
||||||
|
|
||||||
|
var velocity: Vector3 = get_linear_velocity()
|
||||||
|
if velocity.y > 0.01:
|
||||||
|
var frame_count: int = sprite3D.hframes * sprite3D.vframes
|
||||||
|
var frame_time_all: float = frame_rate * frame_count
|
||||||
|
frame_time += delta
|
||||||
|
sprite3D.frame = int(frame_time / frame_rate) % frame_count
|
||||||
|
frame_time = fmod(frame_time, frame_time_all)
|
||||||
|
|
||||||
|
#生成
|
||||||
|
if not is_born:
|
||||||
|
if born_time <= 0:
|
||||||
|
is_born = true
|
||||||
|
else:
|
||||||
|
born_time -= delta
|
||||||
|
return
|
||||||
|
|
||||||
|
#收集激活
|
||||||
|
if not is_collect:
|
||||||
|
var target: Character = Global.character_mgr.get_player()
|
||||||
|
if not target:
|
||||||
|
return
|
||||||
|
var dir: Vector3 = target.view_pos() - global_position
|
||||||
|
var dist: float = dir.length()
|
||||||
|
if dist < collect_range:
|
||||||
|
is_collect = true
|
||||||
|
|
||||||
|
#存活时间
|
||||||
|
if not is_collect:
|
||||||
|
if alive_time <= 0:
|
||||||
|
queue_free()
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
alive_time -= delta
|
||||||
|
|
||||||
|
#收集
|
||||||
|
if is_collect:
|
||||||
|
var target: Character = Global.character_mgr.get_player()
|
||||||
|
if not target:
|
||||||
|
return
|
||||||
|
var dir: Vector3 = target.view_pos() - global_position
|
||||||
|
var dist: float = dir.length()
|
||||||
|
if dist > 0.1:
|
||||||
|
var dist_rate = clamp(dist / follow_dist_max, 0, 1)
|
||||||
|
var speed: float = follow_speed_curve.sample(dist_rate)
|
||||||
|
set_linear_velocity(dir.normalized() * speed)
|
||||||
|
else:
|
||||||
|
collect()
|
||||||
|
|
||||||
|
|
||||||
|
func collect() -> void:
|
||||||
|
var target: Character = Global.character_mgr.get_player()
|
||||||
|
if not target:
|
||||||
|
return
|
||||||
|
match type:
|
||||||
|
Enum.EPtType.HP: target.add_hp(value)
|
||||||
|
Enum.EPtType.MP: target.add_mp_sub(value, true)
|
||||||
|
_: pass
|
||||||
|
queue_free()
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
extends Node3D
|
||||||
|
class_name ItemManager
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
Global.item_mgr = self
|
||||||
|
SignalManager.level_loading_start.connect(on_level_loading_start)
|
||||||
|
|
||||||
|
|
||||||
|
func on_level_loading_start():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
func create_pt(type: Enum.EPtType, value: int, pos: Vector3):
|
||||||
|
value = randi_range(0.5 * value, 1.5 * value)
|
||||||
|
var pt_slice: Array[int] = [100, 50, 20, 10, 5, 2, 1]
|
||||||
|
while value > 0:
|
||||||
|
for i in pt_slice:
|
||||||
|
if value < i:
|
||||||
|
continue
|
||||||
|
value -= i
|
||||||
|
_create_pt(type, i, pos)
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
func _create_pt(type: Enum.EPtType, value: int, pos: Vector3):
|
||||||
|
var pt: PT = ResourceManager.scene_pt.instantiate() as PT
|
||||||
|
pt.type = type
|
||||||
|
pt.value = value
|
||||||
|
add_child(pt)
|
||||||
|
pt.position = pos
|
||||||