extends KinematicBody2D

const ANIM_SPEED = 7 # アニメーション速度
const GRAVITY = 45 # 重力
const JUMP_POWER = 1000 # ジャンプ力
const MOVE_SPEED = 300 # 移動速度.
const MAX_JUMP_CNT = 2 # 2段ジャンプまで可能.

onready var _spr = $Player # スプライト

var _tAnim:float = 0 # アニメーションタイマー.
var _velocity := Vector2.ZERO # 移動ベクトル.
var _is_jumping = false # ジャンプ中かどうか.
var _cnt_jump = 0 # ジャンプ回数.
var _speed:float = MOVE_SPEED # 移動速度.

# 速度の設定
func set_speed(speed:float) -> void:
	_speed = speed
# 速度の取得
func get_speed() -> float:
	return _speed

# 更新.
func _process(delta: float) -> void:
	# アニメーションの更新.
	_update_anim(delta)

func _update_anim(delta:float) -> void:
	_tAnim += delta
	
	if _is_jumping:
		# ジャンプ中
		if _cnt_jump == 1:
			# 2段ジャンプできるので前方宙返りする.
			_spr.rotation_degrees += 2000 * delta
		else:
			_spr.rotation_degrees = 0
		_spr.frame = 2
		return
	
	# 回転をリセットする.
	_spr.rotation_degrees = 0
	var t = int(_tAnim * ANIM_SPEED) % 2
	var tbl = [2, 3] # 走りアニメーションしか使わない.
	_spr.frame = tbl[t]

# -----------------------
# ここから重力とジャンプ処理
# -----------------------
func _physics_process(delta: float) -> void:
	# 移動速度を反映.
	_velocity.x = _speed
	
	# 重力を反映.
	_velocity.y += GRAVITY
		
	# デバッグ用 (画面外に出ないようにする)
	if position.y > 680:
		_velocity.y = -1500	
		
	
	# -------------------------
	# ※ここを追加.
	Engine.set_time_scale(1)
	if _cnt_jump == MAX_JUMP_CNT and _velocity.y < 0:
		# 2段ジャンプの上昇中はスローになる.
		Engine.set_time_scale(0.5)	
	# -------------------------

	# ※ここの第2引数を追加
	_velocity = move_and_slide(_velocity, Vector2.UP)
	
	# ジャンプ中チェック.
	if is_on_floor():
		# 着地した
		_is_jumping = false
		_velocity.y = 0 # 重力クリア.
		_cnt_jump = 0 # ジャンプ回数をリセットする.
	else:
		# ジャンプ中.
		_is_jumping = true
	
	if _cnt_jump < MAX_JUMP_CNT:
		if Input.is_action_just_pressed("ui_accept"):
			# ジャンプ.
			_velocity.y = -JUMP_POWER
			_cnt_jump += 1
