diff --git a/main.gd b/main.gd index 9067b12..a84cfda 100644 --- a/main.gd +++ b/main.gd @@ -3,7 +3,9 @@ extends Node3D @onready var dice1: Dice = $dice1 @onready var dice2: Dice = $dice2 @onready var camera: Camera3D = $Camera3D -@onready var camera_start: Marker3D = $CameraPositionDefault +@onready var camera_starting: Marker3D = $CameraPositionStarting +@onready var camera_prethrow: Marker3D = $CameraPositionPrethrow +@onready var camera_target: Marker3D = $CameraPositionTarget @onready var ui: Ui = $Ui enum GameState { @@ -14,27 +16,37 @@ enum GameState { } var state: GameState = GameState.START +var camera_transition := 0. +var camera_speed := 1.5 +var first_throw := true func _ready() -> void: - pass + ui.connect("roll_pressed", throw_dice) + +func _physics_process(delta: float) -> void: + camera_transition += delta * camera_speed + camera_transition = min(camera_transition, 1.) + if state == GameState.THROWING_START or state == GameState.THROWING: + camera.transform = ( camera_starting if first_throw else camera_target).transform.interpolate_with(camera_prethrow.transform, camera_transition) + elif state == GameState.THROWN: + camera.transform = camera_prethrow.transform.interpolate_with(camera_target.transform, camera_transition) -func _process(_delta: float) -> void: if (!dice1.can_be_thrown() or !dice2.can_be_thrown()) and state == GameState.THROWING_START: state = GameState.THROWING if dice1.can_be_thrown() and dice2.can_be_thrown() and state == GameState.THROWING: state = GameState.THROWN var avg_position = (dice1.global_transform.origin + dice2.global_transform.origin) / 2 var diff = dice1.global_position - dice2.global_position - camera.global_position = avg_position + Vector3.UP * (diff.length()) - camera.look_at(avg_position, Vector3.FORWARD) + camera_target.global_position = avg_position + Vector3.UP * max(diff.length(), 0.1) + camera_target.look_at(avg_position, Vector3.FORWARD) + camera_transition = 0. + first_throw = false + + ui.set_current_throw_value([dice1.get_value(), dice2.get_value()]) func throw_dice() -> void: if dice1.can_be_thrown() and dice2.can_be_thrown(): dice1.random_throw() dice2.random_throw() state = GameState.THROWING_START - reset_camera() - -func reset_camera() -> void: - camera.global_transform.origin = camera_start.global_transform.origin - camera.global_transform.basis = camera_start.global_transform.basis + camera_transition = 0. diff --git a/main.tscn b/main.tscn index 7a62316..8d3fa9d 100644 --- a/main.tscn +++ b/main.tscn @@ -116,9 +116,14 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.323323, 0.972071) current = true near = 0.003 -[node name="CameraPositionDefault" type="Marker3D" parent="."] +[node name="CameraPositionStarting" type="Marker3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.323323, 0.972071) +[node name="CameraPositionPrethrow" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 1, 0) + +[node name="CameraPositionTarget" type="Marker3D" parent="."] + [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_rm3d5") camera_attributes = SubResource("CameraAttributesPractical_i6kyw") diff --git a/ui.gd b/ui.gd index a23ea8f..3d092ed 100644 --- a/ui.gd +++ b/ui.gd @@ -1,8 +1,12 @@ extends Control - class_name Ui signal roll_pressed - func _on_roll_button_pressed() -> void: roll_pressed.emit() + +@onready var current_throw_value = $current_throw_value + +func set_current_throw_value(value: Array[int]) -> void: + current_throw_value.set_text(str(value)) + pass \ No newline at end of file diff --git a/ui.tscn b/ui.tscn index 558a08c..477b941 100644 --- a/ui.tscn +++ b/ui.tscn @@ -36,4 +36,15 @@ tooltip_text = "Click or press space to roll dice" shortcut = SubResource("Shortcut_0osx3") text = "Roll" +[node name="current_throw_value" type="RichTextLabel" parent="."] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_left = 10.0 +offset_top = -29.0 +offset_right = 51.0 +grow_vertical = 0 +text = "0, 0" + [connection signal="pressed" from="roll button" to="." method="_on_roll_button_pressed"]