Compare commits
No commits in common. "da0eb07a28952dd3ba094fec16e1667ecb529b00" and "463f51dcbedf28be235c6f3add08aa19b3662493" have entirely different histories.
da0eb07a28
...
463f51dcbe
|
|
@ -0,0 +1,5 @@
|
|||
[gd_scene format=3 uid="uid://csdxpv8gefpec"]
|
||||
|
||||
[node name="MovablePlateform" type="AnimatableBody2D"]
|
||||
collision_layer = 4
|
||||
collision_mask = 0
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
extends AnimatableBody2D
|
||||
|
||||
@export var shaking_target: Node2D
|
||||
@export var shake_strength: float = 8.0
|
||||
@export var shake_duration: float = 0.25
|
||||
@export var shake_hz: float = 12.0 # 每秒抖几次(关键参数)
|
||||
|
||||
signal shaking_finished()
|
||||
|
||||
var _origin_pos: Vector2
|
||||
var _shaking := false
|
||||
var _rng := RandomNumberGenerator.new()
|
||||
|
||||
func _ready() -> void:
|
||||
if not shaking_target:
|
||||
shaking_target = self
|
||||
_rng.randomize()
|
||||
|
||||
func shaking() -> void:
|
||||
if _shaking:
|
||||
return
|
||||
|
||||
if not shaking_target:
|
||||
shaking_target = self
|
||||
|
||||
_origin_pos = shaking_target.position
|
||||
_shaking = true
|
||||
|
||||
var end_timer := get_tree().create_timer(shake_duration)
|
||||
var interval : float = 1.0 / max(shake_hz, 1.0)
|
||||
var next_update := 0.0
|
||||
var current_offset := Vector2.ZERO
|
||||
|
||||
while end_timer.time_left > 0.0:
|
||||
next_update -= get_process_delta_time()
|
||||
|
||||
if next_update <= 0.0:
|
||||
current_offset = Vector2(
|
||||
randf_range(-shake_strength, shake_strength),
|
||||
randf_range(-shake_strength, shake_strength)
|
||||
)
|
||||
next_update = interval
|
||||
|
||||
shaking_target.position = _origin_pos + current_offset
|
||||
await get_tree().process_frame
|
||||
|
||||
shaking_target.position = _origin_pos
|
||||
_shaking = false
|
||||
shaking_finished.emit()
|
||||
|
|
@ -1 +0,0 @@
|
|||
uid://c3lbocrolvqyg
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://csdxpv8gefpec"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://c3lbocrolvqyg" path="res://_props/_prefabs/plateform/movable_plateform.gd" id="1_w8q55"]
|
||||
|
||||
[node name="MovablePlateform" type="AnimatableBody2D" groups=["GRAPABLE"]]
|
||||
collision_layer = 4
|
||||
collision_mask = 0
|
||||
script = ExtResource("1_w8q55")
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
[gd_scene load_steps=4 format=3 uid="uid://brxjxhoq2g2bb"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://csdxpv8gefpec" path="res://_props/_prefabs/plateform/movable_plateform.tscn" id="1_4q2e0"]
|
||||
[ext_resource type="PackedScene" uid="uid://csdxpv8gefpec" path="res://_props/_prefabs/movable_plateform.tscn" id="1_4q2e0"]
|
||||
[ext_resource type="Texture2D" uid="uid://c673bap4b12fx" path="res://icon.svg" id="2_687ql"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_687ql"]
|
||||
|
|
|
|||
|
|
@ -1,6 +1,3 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://cpbaoqfc2kq80"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://decr4caey82gc" path="res://_props/move_plateform/path_drive_move_plateform/path_drive_move_plateform.gd" id="1_ouylf"]
|
||||
[gd_scene format=3 uid="uid://cpbaoqfc2kq80"]
|
||||
|
||||
[node name="PathDriveMovePlateform" type="Node2D"]
|
||||
script = ExtResource("1_ouylf")
|
||||
|
|
|
|||
|
|
@ -1,126 +0,0 @@
|
|||
extends Node2D
|
||||
|
||||
@export var path2d: Path2D
|
||||
@export var plateform: Node2D
|
||||
|
||||
@export var move_speed: float = 200.0 # 最大前进速度
|
||||
@export var returning_speed: float = 60.0 # 加速度
|
||||
@export var acceleration: float = 400.0 # 加速度
|
||||
|
||||
@export var reach_wait_time: float = 1.5
|
||||
|
||||
|
||||
enum State{
|
||||
IDLE,
|
||||
READY,
|
||||
MOVING,
|
||||
REACHED,
|
||||
RETURNING
|
||||
}
|
||||
|
||||
var _current_state: State = -1
|
||||
var _path_follow: PathFollow2D
|
||||
var _current_speed: float = 0
|
||||
|
||||
func _ready() -> void:
|
||||
if path2d:
|
||||
_path_follow = PathFollow2D.new()
|
||||
_path_follow.visible = false
|
||||
path2d.add_child(_path_follow)
|
||||
|
||||
change_state(State.READY)
|
||||
|
||||
func change_state(state:State) -> void:
|
||||
if _current_state == state:
|
||||
return
|
||||
|
||||
_current_state = state
|
||||
|
||||
match state:
|
||||
State.IDLE:
|
||||
##重新进入Idle可以让重置CanTrigger
|
||||
pass
|
||||
State.READY:
|
||||
ready_to_move()
|
||||
State.MOVING:
|
||||
pass
|
||||
State.REACHED:
|
||||
wait_reach_time()
|
||||
State.RETURNING:
|
||||
pass
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
match _current_state:
|
||||
State.MOVING:
|
||||
_process_moving(delta)
|
||||
State.RETURNING:
|
||||
_process_returning(delta)
|
||||
|
||||
func _process_moving(delta) -> void:
|
||||
|
||||
_current_speed = min(_current_speed + acceleration * delta, move_speed)
|
||||
_path_follow.progress = clampf(
|
||||
_path_follow.progress + _current_speed * delta,
|
||||
0,
|
||||
path2d.curve.get_baked_length())
|
||||
plateform.global_position = _path_follow.global_position
|
||||
|
||||
if _path_follow.progress_ratio >= 1.0:
|
||||
_current_speed = 0.0
|
||||
change_state(State.REACHED)
|
||||
|
||||
func _process_returning(delta) -> void:
|
||||
_current_speed += acceleration * delta
|
||||
_current_speed = min(_current_speed, returning_speed)
|
||||
|
||||
_path_follow.progress = clampf(
|
||||
_path_follow.progress - _current_speed * delta,
|
||||
0,
|
||||
path2d.curve.get_baked_length())
|
||||
plateform.global_position = _path_follow.global_position
|
||||
|
||||
if _path_follow.progress_ratio <= 0:
|
||||
_current_speed = 0.0
|
||||
change_state(State.IDLE)
|
||||
|
||||
##等待状态函数
|
||||
func wait_reach_time()-> void:
|
||||
var expected_state := _current_state
|
||||
|
||||
await get_tree().create_timer(reach_wait_time).timeout
|
||||
|
||||
if _current_state != expected_state:
|
||||
return
|
||||
|
||||
change_state(State.RETURNING)
|
||||
|
||||
|
||||
func ready_to_move() -> void:
|
||||
if plateform.has_method(&"shaking"):
|
||||
plateform.shaking()
|
||||
|
||||
await plateform.shaking_finished
|
||||
|
||||
##在结束await之后,要额外做一判断,如果其他的函数把State又改变了,则我们直接跳过
|
||||
if _current_state != State.READY:
|
||||
return
|
||||
|
||||
start_move()
|
||||
|
||||
func start_move() -> void:
|
||||
if not (plateform or path2d):
|
||||
push_error("[PathDrivePlateform]:No vaild plateform or path2d checked.")
|
||||
|
||||
# 创建 PathFollow(只创建一次)
|
||||
if not _path_follow:
|
||||
_path_follow = PathFollow2D.new()
|
||||
path2d.add_child(_path_follow)
|
||||
|
||||
# 把 platform 挂到 PathFollow 下
|
||||
plateform.reparent(_path_follow)
|
||||
plateform.position = Vector2.ZERO
|
||||
|
||||
_path_follow.progress = 0.0
|
||||
_current_speed = 0.0
|
||||
change_state(State.MOVING)
|
||||
|
|
@ -1 +0,0 @@
|
|||
uid://decr4caey82gc
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -118,24 +118,10 @@ func _editor_ensure_states_root() -> void:
|
|||
|
||||
## 不允许StatesNode被删除,如果删了会自动补一个
|
||||
func _on_child_exiting_tree(child: Node) -> void:
|
||||
if child.name != STATES_ROOT_NAME:
|
||||
return
|
||||
# 不要立刻报错,先延后一帧再确认
|
||||
call_deferred("_editor_verify_states_root_missing")
|
||||
|
||||
func _editor_verify_states_root_missing() -> void:
|
||||
if not Engine.is_editor_hint():
|
||||
return
|
||||
if not is_inside_tree():
|
||||
return
|
||||
|
||||
# 如果下一帧 States 还在,说明只是编辑器重建/移动过程,不算删除
|
||||
if get_node_or_null(STATES_ROOT_NAME) != null:
|
||||
return
|
||||
|
||||
# 到这里才算真的没了
|
||||
if child.name == STATES_ROOT_NAME:
|
||||
push_error("[PropComponent] 'States' node is required and cannot be removed.")
|
||||
_editor_ensure_states_root()
|
||||
call_deferred("_editor_ensure_states_root")
|
||||
|
||||
## ==============================
|
||||
## External API
|
||||
## ==============================
|
||||
|
|
|
|||
Loading…
Reference in New Issue