97 lines
1.8 KiB
GDScript
97 lines
1.8 KiB
GDScript
extends Node2D
|
|
|
|
export (int) var speed = 200
|
|
|
|
enum State {
|
|
Sailing,
|
|
Walking,
|
|
Digging
|
|
}
|
|
|
|
signal dig_stopped
|
|
signal coin_collected
|
|
|
|
onready var Shovel = get_node("Shovel")
|
|
onready var DigTimer = get_node("DigTimer")
|
|
onready var Collider = get_node("Collider")
|
|
|
|
var Coin = preload ("Coin.gd")
|
|
var coin = Coin.new()
|
|
|
|
var velocity = Vector2()
|
|
var target = Vector2()
|
|
var prev_tile = null # Hex coords of previous tile
|
|
var cur_tile = null # Hex coords of current tile
|
|
var state = State.Sailing
|
|
|
|
func get_input():
|
|
velocity = Vector2()
|
|
|
|
if state == State.Digging:
|
|
return
|
|
|
|
if Input.is_action_pressed("walk_right"):
|
|
velocity.x += 1
|
|
if Input.is_action_pressed("walk_left"):
|
|
velocity.x -= 1
|
|
if Input.is_action_pressed("walk_down"):
|
|
velocity.y += 1
|
|
if Input.is_action_pressed("walk_up"):
|
|
velocity.y -= 1
|
|
velocity = velocity.normalized() * speed
|
|
|
|
|
|
func _physics_process(delta):
|
|
var r_to_target = target - position
|
|
var dist = r_to_target.length()
|
|
|
|
if delta > 0.0001 and dist < speed * delta:
|
|
position = target
|
|
velocity = Vector2.ZERO
|
|
else:
|
|
velocity = r_to_target.normalized() * speed
|
|
|
|
if state == State.Digging:
|
|
velocity = Vector2.ZERO
|
|
|
|
|
|
position = position + velocity * delta
|
|
|
|
var tile = Globals.WorldToHex(position)
|
|
if tile != cur_tile:
|
|
prev_tile = cur_tile
|
|
cur_tile = tile
|
|
|
|
Shovel.visible = state == State.Digging
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready():
|
|
position = Vector2(0,0)
|
|
DigTimer.connect("timeout", self, "on_dig_stop")
|
|
|
|
|
|
func on_enter_island():
|
|
state = State.Walking
|
|
|
|
|
|
func on_leave_island():
|
|
state = State.Sailing
|
|
|
|
|
|
func on_dig_start():
|
|
state = State.Digging
|
|
DigTimer.start(2.0)
|
|
|
|
|
|
func on_dig_stop():
|
|
state = State.Walking
|
|
emit_signal ("dig_stopped")
|
|
|
|
|
|
func _on_Collider_body_entered(body):
|
|
if body is Coin:
|
|
emit_signal ("coin_collected")
|
|
body.queue_free()
|
|
|