64 lines
2.6 KiB
C#
64 lines
2.6 KiB
C#
using UnityEngine;
|
|
using Zenject;
|
|
using FlappyBird.Gameplay.Pipes;
|
|
namespace FlappyBird.Core
|
|
{
|
|
/// <summary>
|
|
/// Pure C# service — owns all death side-effects.
|
|
/// Subscribes to IGameStateManager.OnStateChanged at construction time
|
|
/// and reacts when the state becomes GameOver.
|
|
///
|
|
/// Side-effects on death:
|
|
/// 1. Freeze the bird Rigidbody2D (velocity + gravity)
|
|
/// 2. Reset the pipe spawner timer so pipes start cleanly on restart
|
|
/// </summary>
|
|
public sealed class DeathHandler : IDeathHandler, IInitializable
|
|
{
|
|
private readonly Rigidbody2D _birdRigidbody;
|
|
private readonly IGameStateManager _gameStateManager;
|
|
private readonly IPipeSpawner _pipeSpawner;
|
|
public DeathHandler(
|
|
Rigidbody2D birdRigidbody,
|
|
IGameStateManager gameStateManager,
|
|
IPipeSpawner pipeSpawner)
|
|
{
|
|
_birdRigidbody = birdRigidbody;
|
|
_gameStateManager = gameStateManager;
|
|
_pipeSpawner = pipeSpawner;
|
|
}
|
|
// ── IInitializable ─────────────────────────────────────────────────
|
|
public void Initialize()
|
|
{
|
|
_gameStateManager.OnStateChanged += OnStateChanged;
|
|
}
|
|
// ── IDeathHandler ──────────────────────────────────────────────────
|
|
/// <inheritdoc/>
|
|
public void HandleDeath()
|
|
{
|
|
FreezeBird();
|
|
_pipeSpawner.ResetTimer();
|
|
}
|
|
// ── Private helpers ────────────────────────────────────────────────
|
|
private void OnStateChanged(GameState newState)
|
|
{
|
|
if (newState == GameState.Playing)
|
|
UnfreezeBird();
|
|
}
|
|
/// <summary>
|
|
/// Kills velocity and disables gravity so the bird hangs in place
|
|
/// during the GameOver freeze (Time.timeScale is 0, but we set this
|
|
/// explicitly so the bird does not drop when timeScale resumes on restart).
|
|
/// </summary>
|
|
private void FreezeBird()
|
|
{
|
|
_birdRigidbody.linearVelocity = Vector2.zero;
|
|
_birdRigidbody.angularVelocity = 0f;
|
|
_birdRigidbody.gravityScale = 0f;
|
|
}
|
|
/// <summary>Restore gravity when a new game begins.</summary>
|
|
private void UnfreezeBird()
|
|
{
|
|
_birdRigidbody.gravityScale = 1f;
|
|
}
|
|
}
|
|
} |