diff --git a/core/battlefield.gd b/core/battlefield.gd index b0ab285..d4bf3d8 100644 --- a/core/battlefield.gd +++ b/core/battlefield.gd @@ -1,4 +1,4 @@ -extends CanvasLayer +extends Node2D class_name BattleField var _ticker1 := 0.0 diff --git a/core/battlefield.tscn b/core/battlefield.tscn index b6bcfe2..a5e9640 100644 --- a/core/battlefield.tscn +++ b/core/battlefield.tscn @@ -2,6 +2,5 @@ [ext_resource type="Script" path="res://core/battlefield.gd" id="1_u7icn"] -[node name="battlefield" type="CanvasLayer"] -follow_viewport_enabled = true +[node name="battlefield" type="Node2D"] script = ExtResource("1_u7icn") diff --git a/core/ui/camera.gd b/core/ui/camera.gd new file mode 100644 index 0000000..d44f3c6 --- /dev/null +++ b/core/ui/camera.gd @@ -0,0 +1,12 @@ +extends Camera2D + +var raw_zoom := 0.0 + +func scroll(diff: Vector2): + position -= diff + +func change_zoom(diff: float): + raw_zoom = clampf(raw_zoom + diff, -2, 2) + + var z := pow(2.0, raw_zoom) + zoom = Vector2(z, z) diff --git a/core/ui/camera.tscn b/core/ui/camera.tscn new file mode 100644 index 0000000..173c49d --- /dev/null +++ b/core/ui/camera.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://ck41r2je85sm3"] + +[ext_resource type="Script" path="res://core/ui/camera.gd" id="1_pdh08"] + +[node name="camera" type="Camera2D"] +position = Vector2(640, 360) +current = true +position_smoothing_enabled = true +position_smoothing_speed = 12.0 +script = ExtResource("1_pdh08") diff --git a/core/ui/command.gd b/core/ui/command.gd index 3159f2d..4d3994e 100644 --- a/core/ui/command.gd +++ b/core/ui/command.gd @@ -11,11 +11,20 @@ signal clicked else: icon = PlaceholderTexture2D.new() _check_compose() + +@export var color: Color: + set(val): + if val is Color: + color = val + else: + color = Color.BLACK + _check_compose() @export var code: String func _compose(): $badge/icon.texture = icon + $badge.self_modulate = color super._compose() func _on_click_input_event(viewport, event, shape_idx): diff --git a/core/ui/command.tscn b/core/ui/command.tscn index 0d7f416..5ffabb4 100644 --- a/core/ui/command.tscn +++ b/core/ui/command.tscn @@ -4,7 +4,7 @@ [sub_resource type="Gradient" id="Gradient_i2fje"] offsets = PackedFloat32Array(0, 0.845528, 1) -colors = PackedColorArray(0.631696, 0, 0.0105082, 1, 0.604306, 0, 0.0100526, 0.95664, 0, 0, 0, 0) +colors = PackedColorArray(0.51, 0.51, 0.51, 1, 0.6, 0.6, 0.6, 0.956863, 0, 0, 0, 0) [sub_resource type="GradientTexture2D" id="GradientTexture2D_3dnb6"] gradient = SubResource("Gradient_i2fje") @@ -19,6 +19,7 @@ radius = 80.0 [node name="command" type="Node2D"] script = ExtResource("1_bwbsk") +code = "" [node name="badge" type="Sprite2D" parent="."] texture = SubResource("GradientTexture2D_3dnb6") diff --git a/core/ui/commands.gd b/core/ui/commands.gd index 901366d..6d927cb 100644 --- a/core/ui/commands.gd +++ b/core/ui/commands.gd @@ -1,4 +1,4 @@ -extends CanvasLayer +extends Node @export var player: Node: set(val): @@ -6,44 +6,46 @@ extends CanvasLayer player = val else: player = null + +@export var camera: Camera2D @export var available_commands: Array[PackedScene] signal commands_changed(commander, commands) func _ready(): - $stock.visible = false - $wheel.visible = false + %stock.visible = false + %wheel.visible = false if available_commands: for command_scene in available_commands: var command := command_scene.instantiate() - $stock.add_child(command) + %stock.add_child(command) -func _unhandled_input(event: InputEvent): - if event is InputEventMouseButton: - if event.button_index == MOUSE_BUTTON_LEFT and not event.pressed: - get_viewport().set_input_as_handled() - _show_command_wheel(event.position) - func _show_command_wheel(pos: Vector2): - var wheel := $wheel as Node2D + var wheel := %wheel as Node2D wheel.position = pos # TODO center cam ? - for command in $wheel.get_children(): + for command in %wheel.get_children(): command.queue_free() - for command in $stock.get_children(): + for command in %stock.get_children(): # TODO only available command = command.duplicate() + command.color = player.color command.connect("clicked", _on_wheel_command_clicked.bind(command)) - $wheel.add_child(command) + %wheel.add_child(command) wheel.visible = true func _on_wheel_command_clicked(command: Command): - command.apply($active, $wheel.position) - $wheel.visible = false - commands_changed.emit(player, $active.get_children()) + command.apply(%active, %wheel.position) + %wheel.visible = false + commands_changed.emit(player, %active.get_children()) + +func background_clicked(pos): + if camera: + pos = camera.get_canvas_transform().inverse() * pos + _show_command_wheel(pos) diff --git a/core/ui/commands.tscn b/core/ui/commands.tscn index deb65d9..6c24255 100644 --- a/core/ui/commands.tscn +++ b/core/ui/commands.tscn @@ -2,14 +2,15 @@ [ext_resource type="Script" path="res://core/ui/commands.gd" id="1_8b4dn"] -[node name="commands" type="CanvasLayer"] -layer = 2 -follow_viewport_enabled = true +[node name="commands" type="Node2D"] script = ExtResource("1_8b4dn") -[node name="wheel" type="Node2D" parent="."] - [node name="stock" type="Node2D" parent="."] +unique_name_in_owner = true visible = false +[node name="wheel" type="Node2D" parent="."] +unique_name_in_owner = true + [node name="active" type="Node2D" parent="."] +unique_name_in_owner = true diff --git a/core/ui/inputs.gd b/core/ui/inputs.gd new file mode 100644 index 0000000..ae593a1 --- /dev/null +++ b/core/ui/inputs.gd @@ -0,0 +1,36 @@ +extends Control + +signal scrolled(diff: Vector2) +signal clicked(pos: Vector2) +signal zoomed(diff: float) + +var pressed = false + +func _ready(): + get_viewport().connect("size_changed", resize) + resize() + +func resize(): + set_deferred("size", get_viewport().size) + +func _gui_input(event): + if event is InputEventMouseMotion: + if event.button_mask & MOUSE_BUTTON_LEFT: + pressed = false + scrolled.emit(event.relative) + accept_event() + if event is InputEventMouseButton: + if event.pressed: + if event.button_index == MOUSE_BUTTON_WHEEL_UP: + zoomed.emit(signf(event.factor)) + accept_event() + elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN: + zoomed.emit(-signf(event.factor)) + accept_event() + elif event.button_index == MOUSE_BUTTON_LEFT: + pressed = true + else: + if event.button_index == MOUSE_BUTTON_LEFT and pressed: + accept_event() + pressed = false + clicked.emit(event.position) diff --git a/core/ui/inputs.tscn b/core/ui/inputs.tscn new file mode 100644 index 0000000..9d72484 --- /dev/null +++ b/core/ui/inputs.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=2 format=3 uid="uid://boo6ta2m7e55o"] + +[ext_resource type="Script" path="res://core/ui/inputs.gd" id="1_wm60j"] + +[node name="inputs" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +mouse_force_pass_scroll_events = false +script = ExtResource("1_wm60j") diff --git a/main.tscn b/main.tscn index 0804594..7ffbac6 100644 --- a/main.tscn +++ b/main.tscn @@ -1,91 +1,49 @@ [gd_scene load_steps=8 format=3 uid="uid://c6omib6txy3qh"] +[ext_resource type="PackedScene" uid="uid://ck41r2je85sm3" path="res://core/ui/camera.tscn" id="1_7evrt"] [ext_resource type="PackedScene" uid="uid://brbtq46uk18gg" path="res://core/battlefield.tscn" id="1_x63ik"] [ext_resource type="PackedScene" uid="uid://dqaabctftkakr" path="res://core/player.tscn" id="2_o4smw"] +[ext_resource type="PackedScene" uid="uid://boo6ta2m7e55o" path="res://core/ui/inputs.tscn" id="2_wkcj2"] [ext_resource type="PackedScene" uid="uid://b8uik6q4v35o3" path="res://tac/units/factory.tscn" id="2_wnc50"] [ext_resource type="PackedScene" uid="uid://xoup4vukp3ni" path="res://core/ui/commands.tscn" id="4_1gkbi"] [ext_resource type="PackedScene" uid="uid://dr1e0h27nuam" path="res://tac/commands/delivery.tscn" id="5_fi2mi"] -[sub_resource type="GDScript" id="GDScript_8ehhf"] -script/source = "extends Camera2D - -var raw_zoom := 0 - -func scroll(diff: Vector2): - position -= diff - -func change_zoom(diff: float): - raw_zoom = clampf(raw_zoom + diff, -2, 2) - - var z := pow(2.0, raw_zoom) - zoom = Vector2(z, z) -" - -[sub_resource type="GDScript" id="GDScript_0auct"] -script/source = "extends Control - -signal scrolled(diff) -signal zoomed(diff) - -func _unhandled_input(event): - if event is InputEventMouseMotion: - if event.button_mask & MOUSE_BUTTON_LEFT: - scrolled.emit(event.relative) - accept_event() - if event is InputEventMouseButton and event.pressed: - if event.button_index == MOUSE_BUTTON_WHEEL_UP: - zoomed.emit(signf(event.factor)) - accept_event() - elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN: - zoomed.emit(-signf(event.factor)) - accept_event() -" - [node name="main" type="Node2D"] -[node name="camera" type="Camera2D" parent="."] -position = Vector2(640, 360) -current = true -script = SubResource("GDScript_8ehhf") +[node name="camera" parent="." instance=ExtResource("1_7evrt")] -[node name="battlefield" parent="." instance=ExtResource("1_x63ik")] +[node name="backui" type="CanvasLayer" parent="."] +layer = -1 -[node name="player1" parent="battlefield" instance=ExtResource("2_o4smw")] +[node name="inputs" parent="backui" instance=ExtResource("2_wkcj2")] + +[node name="world" type="CanvasLayer" parent="."] +follow_viewport_enabled = true + +[node name="player1" parent="world" instance=ExtResource("2_o4smw")] color = Color(0, 0, 1, 1) code = "p1" -[node name="player2" parent="battlefield" instance=ExtResource("2_o4smw")] +[node name="player2" parent="world" instance=ExtResource("2_o4smw")] color = Color(1, 0, 0, 1) code = "p2" -[node name="factory1" parent="battlefield" node_paths=PackedStringArray("player") instance=ExtResource("2_wnc50")] +[node name="battlefield" parent="world" instance=ExtResource("1_x63ik")] + +[node name="factory1" parent="world/battlefield" node_paths=PackedStringArray("player") instance=ExtResource("2_wnc50")] position = Vector2(270, 222) -player = NodePath("../player1") +player = NodePath("../../player1") -[node name="factory2" parent="battlefield" node_paths=PackedStringArray("player") instance=ExtResource("2_wnc50")] +[node name="factory2" parent="world/battlefield" node_paths=PackedStringArray("player") instance=ExtResource("2_wnc50")] position = Vector2(929, 429) -player = NodePath("../player2") +player = NodePath("../../player2") -[node name="commands" parent="." node_paths=PackedStringArray("player") instance=ExtResource("4_1gkbi")] -player = NodePath("../battlefield/player1") +[node name="commands" parent="world" node_paths=PackedStringArray("player", "camera") instance=ExtResource("4_1gkbi")] +player = NodePath("../player1") +camera = NodePath("../../camera") available_commands = [ExtResource("5_fi2mi")] -[node name="ui" type="CanvasLayer" parent="."] -layer = 3 - -[node name="camcontrol" type="Control" parent="ui"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -mouse_filter = 2 -mouse_force_pass_scroll_events = false -script = SubResource("GDScript_0auct") - -[connection signal="commands_changed" from="commands" to="battlefield" method="_on_commands_changed"] -[connection signal="scrolled" from="ui/camcontrol" to="camera" method="scroll"] -[connection signal="zoomed" from="ui/camcontrol" to="camera" method="change_zoom"] +[connection signal="clicked" from="backui/inputs" to="world/commands" method="background_clicked"] +[connection signal="scrolled" from="backui/inputs" to="camera" method="scroll"] +[connection signal="zoomed" from="backui/inputs" to="camera" method="change_zoom"] +[connection signal="commands_changed" from="world/commands" to="world/battlefield" method="_on_commands_changed"] diff --git a/project.godot b/project.godot index dd37ce6..eef998f 100644 --- a/project.godot +++ b/project.godot @@ -9,7 +9,7 @@ config_version=5 _global_script_classes=[{ -"base": "CanvasLayer", +"base": "Node2D", "class": &"BattleField", "language": &"GDScript", "path": "res://core/battlefield.gd"