Реализация окончания дня по приходу в каюту.

This commit is contained in:
Евгений Титаренко 2024-08-25 14:16:11 +03:00
parent de683399fa
commit 4222af1896
8 changed files with 111 additions and 81 deletions

View file

@ -31,15 +31,16 @@ public partial class Day : Node2D
_colorRect.Color = new Color(0, 0, 0, 1f);
_music.VolumeDb = -40;
_player.CurrentState = Player.State.Wait;
_endDay.Disable();
}
public void AssignEndDay()
public void AssignEndDay(Player player)
{
_player.InteractableObjects.Add(_endDay);
player.InteractableObjects.Add(_endDay);
}
public void RemoveEndDay()
public void RemoveEndDay(Player player)
{
_player.InteractableObjects.Remove(_endDay);
player.InteractableObjects.Remove(_endDay);
}
public void ChangeDay()
@ -49,7 +50,7 @@ public partial class Day : Node2D
public void EnableEndDay()
{
_endDay.IsEnabled = true;
_endDay.Enable();
}
// Called every frame. 'delta' is the elapsed time since the previous frame.

View file

@ -4,83 +4,87 @@ using System;
[Tool]
public partial class Interactable : Node2D
{
private const double Tolerance = 1e-6;
private const double Tolerance = 1e-6;
[Signal]
public delegate void PlayerNearByEventHandler(Player player);
[Signal]
public delegate void PlayerNearByEventHandler(Player player);
[Signal]
public delegate void PlayerLeftEventHandler(Player player);
[Signal]
public delegate void PlayerLeftEventHandler(Player player);
[Signal]
public delegate void OnInteractEventHandler();
[Signal]
public delegate void OnInteractEventHandler();
[Export] public Vector2 SpriteOffset;
[Export] public float AreaRadius;
[Export] public bool IsEnabled;
private AnimatedSprite2D _sprite;
[Export] public Vector2 SpriteOffset;
[Export] public float AreaRadius;
private CollisionShape2D _areaMesh;
private AnimatedSprite2D _sprite;
private CircleShape2D _collisionCircle;
private CollisionShape2D _areaMesh;
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
_sprite = (AnimatedSprite2D)FindChild("AnimatedSprite2D");
_areaMesh = (CollisionShape2D)FindChild("CollisionShape2D");
_sprite.Position = SpriteOffset;
_collisionCircle = (CircleShape2D)_areaMesh.Shape;
_collisionCircle.Radius = AreaRadius;
if (Engine.IsEditorHint())
{
_sprite.Visible = true;
}
else
{
_sprite.Visible = false;
}
}
private CircleShape2D _collisionCircle;
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
if (Engine.IsEditorHint())
{
if (_sprite.Position != SpriteOffset) _sprite.Position = SpriteOffset;
if (Math.Abs(_collisionCircle.Radius - AreaRadius) > Tolerance) _collisionCircle.Radius = AreaRadius;
}
private bool _isEnabled = true;
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
_sprite = (AnimatedSprite2D)FindChild("AnimatedSprite2D");
_areaMesh = (CollisionShape2D)FindChild("CollisionShape2D");
_sprite.Position = SpriteOffset;
_collisionCircle = (CircleShape2D)_areaMesh.Shape;
_collisionCircle.Radius = AreaRadius;
if (Engine.IsEditorHint())
{
_sprite.Visible = true;
}
else
{
_sprite.Visible = false;
}
}
if (IsEnabled)
{
_sprite.Visible = true;
}
else
{
_sprite.Visible = false;
}
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
if (Engine.IsEditorHint())
{
if (_sprite.Position != SpriteOffset) _sprite.Position = SpriteOffset;
if (Math.Abs(_collisionCircle.Radius - AreaRadius) > Tolerance) _collisionCircle.Radius = AreaRadius;
}
}
public void Interact()
{
EmitSignal(SignalName.OnInteract);
}
private void _on_area_2d_body_entered(Node2D body)
{
if (IsEnabled && body is Player player)
{
_sprite.Visible = true;
EmitSignal(SignalName.PlayerNearBy, player);
}
}
public void Interact()
{
EmitSignal(SignalName.OnInteract);
}
private void _on_area_2d_body_exited(Node2D body)
{
if (IsEnabled && body is Player player)
{
_sprite.Visible = false;
EmitSignal(SignalName.PlayerLeft, player);
}
}
}
public void Enable()
{
_isEnabled = true;
_sprite.Visible = true;
}
public void Disable()
{
_isEnabled = false;
_sprite.Visible = false;
}
private void _on_area_2d_body_entered(Node2D body)
{
if (_isEnabled && body is Player player)
{
_sprite.Visible = true;
EmitSignal(SignalName.PlayerNearBy, player);
}
}
private void _on_area_2d_body_exited(Node2D body)
{
if (_isEnabled && body is Player player)
{
_sprite.Visible = false;
EmitSignal(SignalName.PlayerLeft, player);
}
}
}