diff --git a/Events/EventBus.cs b/Events/EventBus.cs index 50c2ad4..9f719b1 100644 --- a/Events/EventBus.cs +++ b/Events/EventBus.cs @@ -24,4 +24,18 @@ public partial class EventBus : Node [Signal] public delegate void DeregisteredBossEventHandler(Characters.Boss boss); + + [Signal] + public delegate void EnterTransitionEventHandler(); + + [Signal] + public delegate void TransitionFinishedEventHandler(); + + [Signal] + public delegate void ExitTransitionEventHandler(); + + public override void _Ready() + { + ProcessMode = ProcessModeEnum.Always; + } } diff --git a/Scenes/BaseMap.tscn b/Scenes/BaseMap.tscn index 603d2e4..20cc7f6 100644 --- a/Scenes/BaseMap.tscn +++ b/Scenes/BaseMap.tscn @@ -1833,6 +1833,7 @@ glow_enabled = true glow_hdr_threshold = 1.4 [node name="TileMap" type="TileMap" node_paths=PackedStringArray("Entities", "Areas", "Spawners", "Markers")] +process_mode = 1 y_sort_enabled = true texture_filter = 3 tile_set = SubResource("TileSet_18c7j") diff --git a/Scenes/Level.tscn b/Scenes/Level.tscn index e04588f..09ca743 100644 --- a/Scenes/Level.tscn +++ b/Scenes/Level.tscn @@ -4,6 +4,7 @@ [ext_resource type="PackedScene" uid="uid://c271rdjhd1gfo" path="res://UI/Base.tscn" id="2_mm0qt"] [node name="World" type="Node2D" node_paths=PackedStringArray("MusicPlayer", "DialogueBalloon")] +process_mode = 3 script = ExtResource("1_1k6ew") MusicPlayer = NodePath("MusicPlayer") DialogueBalloon = NodePath("CanvasLayer/SubViewportContainer/UIViewport/DialogBalloon") diff --git a/Shaders/WipeTransition.gdshader b/Shaders/WipeTransition.gdshader new file mode 100644 index 0000000..f39806c --- /dev/null +++ b/Shaders/WipeTransition.gdshader @@ -0,0 +1,16 @@ +shader_type canvas_item; + +uniform float a: hint_range(0.0, 1.0, 0.1) = 0; +uniform float b: hint_range(0.0, 1.0, 0.1) = 0; + +void fragment() { + if (UV.x < a) { + if (UV.x > b) { + COLOR.a = 1.0; + } else { + COLOR.a = 0.0; + } + } else { + COLOR.a = 0.0; + } +} \ No newline at end of file diff --git a/State/Global/GlobalState.cs b/State/Global/GlobalState.cs index ed915bd..51b42a4 100644 --- a/State/Global/GlobalState.cs +++ b/State/Global/GlobalState.cs @@ -17,7 +17,10 @@ public partial class GlobalState : Node [Signal] public delegate void SummonBossEventHandler(string bossName); - public void Print(string str) => GD.Print(str); + public override void _Ready() + { + ProcessMode = ProcessModeEnum.Always; + } public void ImportFromSave(Save save) { diff --git a/UI/Base.tscn b/UI/Base.tscn index 7770bdc..db8df23 100644 --- a/UI/Base.tscn +++ b/UI/Base.tscn @@ -1,12 +1,14 @@ -[gd_scene load_steps=6 format=3 uid="uid://c271rdjhd1gfo"] +[gd_scene load_steps=7 format=3 uid="uid://c271rdjhd1gfo"] [ext_resource type="PackedScene" uid="uid://73jm5qjy52vq" path="res://Dialogue/balloon.tscn" id="1_atjb1"] [ext_resource type="Script" path="res://UI/UIController.cs" id="2_b4b6l"] [ext_resource type="PackedScene" uid="uid://bxo553hblp6nf" path="res://UI/HealthBar.tscn" id="3_j1j6h"] [ext_resource type="PackedScene" uid="uid://01d24ij5av1y" path="res://UI/BossBar.tscn" id="4_igi28"] [ext_resource type="PackedScene" uid="uid://c77754nvmckn" path="res://UI/LocationDisplay.tscn" id="5_cr6vo"] +[ext_resource type="PackedScene" uid="uid://d3q1yu3n7cqfj" path="res://UI/SceneTransition.tscn" id="6_j0nhv"] [node name="BaseUI" type="CanvasLayer"] +process_mode = 3 [node name="SubViewportContainer" type="SubViewportContainer" parent="."] anchors_preset = 15 @@ -73,3 +75,6 @@ visible = false layout_mode = 2 [node name="LocationDisplay" parent="SubViewportContainer/UIViewport/MainUILayer" instance=ExtResource("5_cr6vo")] + +[node name="SceneTransition" parent="SubViewportContainer/UIViewport/MainUILayer" instance=ExtResource("6_j0nhv")] +z_index = 1 diff --git a/UI/SceneTransition.cs b/UI/SceneTransition.cs new file mode 100644 index 0000000..1d5a89f --- /dev/null +++ b/UI/SceneTransition.cs @@ -0,0 +1,30 @@ +using Godot; +using SupaLidlGame.Extensions; + +namespace SupaLidlGame.UI; + +public partial class SceneTransition : Control +{ + private AnimationPlayer _animPlayer; + private Events.EventBus _bus; + + public override void _Ready() + { + _animPlayer = GetNode("AnimationPlayer"); + _bus = this.GetEventBus(); + _bus.EnterTransition += Enter; + _bus.ExitTransition += Exit; + } + + public async void Enter() + { + _animPlayer.Play("enter"); + await ToSignal(_animPlayer, "animation_finished"); + _bus.EmitSignal(Events.EventBus.SignalName.TransitionFinished); + } + + public void Exit() + { + _animPlayer.Play("exit"); + } +} diff --git a/UI/SceneTransition.tscn b/UI/SceneTransition.tscn new file mode 100644 index 0000000..b7b3c97 --- /dev/null +++ b/UI/SceneTransition.tscn @@ -0,0 +1,125 @@ +[gd_scene load_steps=8 format=3 uid="uid://d3q1yu3n7cqfj"] + +[ext_resource type="Shader" path="res://Shaders/WipeTransition.gdshader" id="1_1rft7"] +[ext_resource type="Script" path="res://UI/SceneTransition.cs" id="1_mx0ay"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_vfeh4"] +shader = ExtResource("1_1rft7") +shader_parameter/a = 0.0 +shader_parameter/b = 0.0 + +[sub_resource type="Animation" id="Animation_4e8tt"] +resource_name = "enter" +length = 0.5 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("ColorRect:material:shader_parameter/a") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.25), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 1.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("ColorRect:material:shader_parameter/b") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_c026w"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("ColorRect:material:shader_parameter/a") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("ColorRect:material:shader_parameter/b") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_uvf4a"] +resource_name = "exit" +length = 0.25 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("ColorRect:material:shader_parameter/a") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("ColorRect:material:shader_parameter/b") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.25), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 1.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_51tf5"] +_data = { +"RESET": SubResource("Animation_c026w"), +"enter": SubResource("Animation_4e8tt"), +"exit": SubResource("Animation_uvf4a") +} + +[node name="SceneTransition" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_mx0ay") + +[node name="ColorRect" type="ColorRect" parent="."] +material = SubResource("ShaderMaterial_vfeh4") +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 1) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_51tf5") +} diff --git a/Utils/World.cs b/Utils/World.cs index ec354f3..6163081 100644 --- a/Utils/World.cs +++ b/Utils/World.cs @@ -3,6 +3,7 @@ using SupaLidlGame.Characters; using SupaLidlGame.Extensions; using SupaLidlGame.Scenes; using SupaLidlGame.State.Global; +using SupaLidlGame.Events; namespace SupaLidlGame.Utils; @@ -58,7 +59,7 @@ public partial class World : Node public State.Global.GlobalState GlobalState { get; set; } - public Events.EventBus EventBus { get; set; } + public EventBus EventBus { get; set; } private CacheStore _maps = new(); @@ -95,9 +96,10 @@ public partial class World : Node UIController = this.GetMainUI(); EventBus = this.GetEventBus(); - EventBus.RequestMoveToArea += (Events.RequestAreaArgs args) => + EventBus.RequestMoveToArea += (RequestAreaArgs args) => { - CallDeferred(nameof(MoveToArea), args.Area, args.Connector); + //CallDeferred(nameof(MoveToArea), args.Area, args.Connector); + MoveToArea(args.Area, args.Connector); }; EventBus.RegisteredBoss += RegisterBoss; EventBus.DeregisteredBoss += DeregisterBoss; @@ -155,7 +157,7 @@ public partial class World : Node CurrentMap.Active = true; CurrentMap.Load(); - EventBus.EmitSignal(Events.EventBus.SignalName.AreaChanged, map); + EventBus.EmitSignal(EventBus.SignalName.AreaChanged, map); if (CurrentPlayer is not null) { @@ -220,7 +222,7 @@ public partial class World : Node { CurrentPlayer = _playerScene.Instantiate(); - CurrentPlayer.Death += (Events.HurtArgs args) => + CurrentPlayer.Death += (HurtArgs args) => { // TODO: respawn the player at the last campfire. GetTree().CreateTimer(3).Timeout += () => @@ -230,15 +232,6 @@ public partial class World : Node GlobalState.Stats.DeathCount++; }; - /* - CurrentPlayer.Hurt += (Events.HurtArgs args) => - { - // TODO: move this to UI controller and add a setup method - var bar = UIController.GetNode("Top/Margin/HealthBar"); - bar.ProgressBar.Value = args.NewHealth; - }; - */ - return CurrentPlayer; } @@ -253,16 +246,23 @@ public partial class World : Node CurrentPlayer.GlobalPosition = marker?.GlobalPosition ?? Vector2.Zero; } - public void MoveToArea(string path, string connector) + public async void MoveToArea(string path, string connector) { _currentConnector = connector; GD.Print($"Moving to area {path} - {connector}"); + + EventBus.EmitSignal(EventBus.SignalName.EnterTransition); + GetTree().Paused = true; + await ToSignal(EventBus, EventBus.SignalName.TransitionFinished); + if (path != CurrentMap.SceneFilePath) { LoadScene(path); - //_currentMapResourcePath = path; } + EventBus.EmitSignal(EventBus.SignalName.ExitTransition); + GetTree().Paused = false; + // after finished loading, move our player to the connector MovePlayerToConnector(connector); }