every level load left another handler attached to a freed HUD. SpeedRunManager outlives the scene, so it kept calling them and each one wrote to a disposed Label - thousands of ObjectDisposedException per frame, growing with each load. Latent all along: StartTimer was only ever called from StartNewGame, so after a Continue the timer never ticked and the dead handlers never ran. Calling StartTimer on Continue (needed for splits and best times) made it visible. Also stop the timer when leaving to the menu - StopTimer existed and had no callers, so the run kept ticking in the main menu.
59 lines
1.7 KiB
C#
59 lines
1.7 KiB
C#
using Godot;
|
|
using Mr.BrickAdventures;
|
|
using Mr.BrickAdventures.Autoloads;
|
|
|
|
namespace Mr.BrickAdventures.scripts.UI;
|
|
|
|
public partial class GameOverScreen : Control
|
|
{
|
|
[Export] public Control GameOverPanel { get; set; }
|
|
[Export] public Button RestartButton { get; set; }
|
|
[Export] public Button MainMenuButton { get; set; }
|
|
[Export] public PackedScene MainMenuScene { get; set; }
|
|
|
|
public override void _Ready()
|
|
{
|
|
RestartButton.FocusMode = Control.FocusModeEnum.All;
|
|
MainMenuButton.FocusMode = Control.FocusModeEnum.All;
|
|
|
|
RestartButton.Pressed += OnRestartClicked;
|
|
MainMenuButton.Pressed += OnMainMenuClicked;
|
|
|
|
if (InputDeviceManager.Instance != null)
|
|
InputDeviceManager.Instance.DeviceChanged += OnDeviceChanged;
|
|
}
|
|
|
|
public override void _ExitTree()
|
|
{
|
|
if (InputDeviceManager.Instance != null)
|
|
InputDeviceManager.Instance.DeviceChanged -= OnDeviceChanged;
|
|
}
|
|
|
|
private void OnDeviceChanged(int device)
|
|
{
|
|
var d = (InputDeviceManager.InputDevice)device;
|
|
if (d != InputDeviceManager.InputDevice.Mouse && GameOverPanel.IsVisibleInTree())
|
|
RestartButton.GrabFocus();
|
|
}
|
|
|
|
private void OnMainMenuClicked()
|
|
{
|
|
GameStateStore.Instance?.ResetAll();
|
|
SpeedRunManager.Instance?.StopTimer();
|
|
GetTree().ChangeSceneToPacked(MainMenuScene);
|
|
}
|
|
|
|
private void OnRestartClicked()
|
|
{
|
|
GameManager.Instance?.RestartGame();
|
|
}
|
|
|
|
public void OnPlayerDeath()
|
|
{
|
|
if (GameStateStore.Instance?.Player.Lives != 0) return;
|
|
|
|
GameOverPanel.Show();
|
|
if (InputDeviceManager.Instance?.IsPointerless == true)
|
|
RestartButton.GrabFocus();
|
|
}
|
|
} |