extends CharacterBody2D
# 移動地点をプロットしたときのシグナル
signal SIG_SET_WAY_POINT
# 移動速度
const MOVE_SPEED : float = 60
# 移動地点をプロットする数
const WAY_COUNT : int = 60
# 移動地点をプロットする時間間隔
const WAY_TIME : float = 1.0
# 追記1:現在の処理番号
var proc : int
# 移動地点をプロットしたリスト(配列、リングバッファ扱い)
var way_point : Array
# プロットするリストの番号
var way_count : int
# プロットする待機時間
var way_time : float = 0
# 移動角度
var way_angle : float = PI / 2
func _ready():
# 場所プロット用の配列を用意する
for i in WAY_COUNT:
way_point.append(global_position)
# 移動方向をway_angleの角度へ指定する
set_move_velocity(way_angle)
func _physics_process(delta):
match proc:
0:
# 追記2:一定の高さまで下がったら次のプロセスへ
if global_position.y > 150:
proc = 1
1:
#
pass
_:
pass
# 実際に移動する
move_and_slide()
# プロットの待ち時間を減らす
way_time -= delta
# プロットの待ち時間が0未満になった場合の処理
if way_time < 0:
# 待機時間の増加
way_time += WAY_TIME
# 現在の場所をプロットする
set_way_point(global_position)
# 追記3:移動方向を変える
if proc == 1:
way_angle -= 0.4
set_move_velocity(way_angle)
# 指定された方向への移動量を設定する
func set_move_velocity(_angle : float):
velocity.x = cos(_angle) * MOVE_SPEED
velocity.y = sin(_angle) * MOVE_SPEED
# _positionで示された場所をプロットする
func set_way_point(_position : Vector2):
# way_point 配列の way_count の場所に _position を記録する
way_point[way_count] = _position
# 配列に記録する場所を次へ進める(リングバッファ)
way_count = (way_count + 1) % WAY_COUNT
# プロットしたこと伝えるシグナルを発行する
SIG_SET_WAY_POINT.emit()
# 他のノードが場所の履歴を参照できるようにする
func _get_way_point(_body_pos : int) -> Vector2:
var read_pos = (way_count - _body_pos - 1 + WAY_COUNT) % WAY_COUNT
return way_point[read_pos]