interaction wheel
cancel interaction wheel
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
class_name CellData
|
||||
extends Resource
|
||||
|
||||
const BUILD = preload("res://data/interactions/build.tres")
|
||||
const GATHER = preload("res://data/interactions/gather.tres")
|
||||
|
||||
@export var layer_info: Dictionary = {
|
||||
Constants.TilemapLayers.CORRUPTION: false
|
||||
}
|
||||
@@ -27,6 +30,9 @@ func get_resource() -> GameResource:
|
||||
|
||||
func has_resource() -> bool:
|
||||
return has_layer(Constants.TilemapLayers.ENVIRONMENT)
|
||||
|
||||
func has_building() -> bool:
|
||||
return has_layer(Constants.TilemapLayers.BUILDINGS)
|
||||
|
||||
func is_corrupted() -> bool:
|
||||
return layer_info[Constants.TilemapLayers.CORRUPTION]
|
||||
@@ -35,7 +41,7 @@ func has_layer(layer: int) -> bool:
|
||||
return layer_info.has(layer)
|
||||
|
||||
func interact(timer: Timer) -> void:
|
||||
var is_interactable := has_resource() or has_layer(Constants.TilemapLayers.BUILDINGS)
|
||||
var is_interactable := has_resource() or not has_building()
|
||||
if is_interactable and not interaction_display:
|
||||
timer.timeout.connect(_on_interaction_finished.bind(timer))
|
||||
timer.start(3)
|
||||
@@ -47,6 +53,14 @@ func interact(timer: Timer) -> void:
|
||||
var tween = timer.get_tree().create_tween()
|
||||
tween.tween_property(interaction_display, "value", 100, 3)
|
||||
timer.get_parent().add_sibling(interaction_display)
|
||||
|
||||
func get_interaction_options() -> Array[Interaction]:
|
||||
var interactions: Array[Interaction] = []
|
||||
if has_resource():
|
||||
interactions.append(GATHER)
|
||||
if not has_building():
|
||||
interactions.append(BUILD)
|
||||
return interactions
|
||||
|
||||
func _on_interaction_finished(timer: Timer) -> void:
|
||||
timer.timeout.disconnect(_on_interaction_finished)
|
||||
|
||||
5
scripts/interaction.gd
Normal file
5
scripts/interaction.gd
Normal file
@@ -0,0 +1,5 @@
|
||||
extends Resource
|
||||
class_name Interaction
|
||||
|
||||
@export var name: String
|
||||
@export var image: AtlasTexture
|
||||
24
scripts/interaction_wheel.gd
Normal file
24
scripts/interaction_wheel.gd
Normal file
@@ -0,0 +1,24 @@
|
||||
extends Node2D
|
||||
class_name InteractionWheel
|
||||
|
||||
var interactions: Array[Interaction]
|
||||
|
||||
@onready var interaction_icons: Array[Node] = $Interactions.get_children()
|
||||
@onready var cursor: Sprite2D = $Cursor
|
||||
|
||||
func initialize(interaction_location: Vector2i, interactions: Array[Interaction]) -> void:
|
||||
position = Grid.grid_to_world_center(interaction_location)
|
||||
self.interactions = interactions
|
||||
|
||||
func _ready() -> void:
|
||||
for i in range(interactions.size()):
|
||||
interaction_icons[i].texture = interactions[i].image
|
||||
interaction_icons[i].show()
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
var selection_direction = Input.get_vector("view_left", "view_right", "view_up", "view_down")
|
||||
if selection_direction:
|
||||
cursor.rotation = selection_direction.angle()
|
||||
cursor.show()
|
||||
if Input.is_action_just_pressed("select"):
|
||||
pass
|
||||
@@ -5,16 +5,21 @@ class_name Player
|
||||
|
||||
var last_direction = 0
|
||||
var interaction_location: Vector2i
|
||||
var _interaction_options: InteractionWheel
|
||||
|
||||
@onready var animation_player: AnimationPlayer = $AnimationPlayer
|
||||
@onready var interaction_timer: Timer = $InteractionTimer
|
||||
const INTERACTION_WHEEL = preload("res://scene/interaction_wheel.tscn")
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
var input_direction := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
|
||||
var input_direction := Input.get_vector("move_left", "move_right", "move_up", "move_down")
|
||||
velocity = input_direction * SPEED / delta
|
||||
move_and_slide()
|
||||
|
||||
if input_direction:
|
||||
if _interaction_options:
|
||||
_interaction_options.queue_free()
|
||||
_interaction_options = null
|
||||
animation_player.current_animation = "walk"
|
||||
animation_player.play()
|
||||
last_direction = input_direction.angle() + 3 * PI / 2
|
||||
@@ -25,9 +30,12 @@ func _physics_process(delta: float) -> void:
|
||||
animation_player.stop()
|
||||
|
||||
func _input(event: InputEvent) -> void:
|
||||
if event.is_action_pressed("ui_accept"):
|
||||
Grid.get_location_data(interaction_location).interact(interaction_timer)
|
||||
print("interaction started")
|
||||
if event.is_action_pressed("select") and not _interaction_options:
|
||||
var interactions: Array[Interaction] = Grid.get_location_data(interaction_location).get_interaction_options()
|
||||
if interactions.size() > 0:
|
||||
_interaction_options = INTERACTION_WHEEL.instantiate()
|
||||
_interaction_options.initialize(interaction_location, interactions)
|
||||
add_sibling(_interaction_options)
|
||||
|
||||
func _finished_interaction(results: Dictionary) -> void:
|
||||
print("interaction finished: %s" % results)
|
||||
|
||||
Reference in New Issue
Block a user