Система диалогов.

This commit is contained in:
Евгений Титаренко 2024-08-19 18:06:14 +03:00
parent 3c1619ee9f
commit 2a2399dc2c
8 changed files with 264 additions and 88 deletions

View file

@ -6,17 +6,20 @@ public partial class Player : CharacterBody2D
{
private const double TransitionTime = 0.5;
private const double CameraTransitionTime = 0.25;
public enum State
{
Normal,
Wait,
Transition,
ReadChat
ReadChat,
ChatWithNPC
}
private State _state;
[Export] public State CurrentState
[Export]
public State CurrentState
{
get => _state;
private set
@ -24,29 +27,33 @@ public partial class Player : CharacterBody2D
switch (value)
{
case State.Normal:
if (_state == State.Transition) DoorSounds.Play();
if (_state == State.Transition) _doorSounds.Play();
Visible = true;
break;
case State.Transition:
Visible = false;
break;
case State.ReadChat:
// ChatLog.Visible = !ChatLog.Visible;
_nextLabel.Visible = false;
break;
case State.Wait:
break;
case State.ChatWithNPC:
_nextLabel.Visible = true;
break;
default:
throw new ArgumentOutOfRangeException();
}
_state = value;
}
}
[Export] public float Speed = 300.0f;
// Get the gravity from the project settings to be synced with RigidBody nodes.
public float Gravity = ProjectSettings.GetSetting("physics/2d/default_gravity").AsSingle();
public List<Node2D> InteractableObjects = new List<Node2D>();
public Node2D InteractableObject
@ -69,27 +76,34 @@ public partial class Player : CharacterBody2D
return nearObj;
}
}
protected AnimatedSprite2D Sprite;
protected PanelContainer ChatLog;
protected Camera2D Camera;
protected AudioCollection Footsteps;
protected AudioCollection DoorSounds;
private AnimatedSprite2D _sprite;
private PanelContainer _chatLog;
private PanelContainer _nextLabel;
private VBoxContainer _chatLogContainer;
private Camera2D _camera;
private AudioCollection _footsteps;
private AudioCollection _doorSounds;
private Vector2 _newPosition;
private double _currentTransitionTime = 0;
private double _currentCameraTransitionTime = 0;
private Vector2 _previousPosition;
private Vector2 _nextPosition;
private Vector2 _cameraDefaultPosition = new(0, -20);
private Vector2 _cameraChatLogPosition = new(116, -20);
private Vector2 _cameraChatLogPosition = new(96, -20);
private PackedScene _dialogBox = GD.Load<PackedScene>("res://prefabs/Dialog.tscn");
public override void _Ready()
{
Sprite = (AnimatedSprite2D)FindChild("AnimatedSprite2D");
ChatLog = (PanelContainer)FindChild("ChatLog");
Camera = (Camera2D)FindChild("Camera2D");
Footsteps = (AudioCollection)FindChild("Footsteps");
DoorSounds = (AudioCollection)FindChild("DoorSounds");
_sprite = (AnimatedSprite2D)FindChild("AnimatedSprite2D");
_chatLog = (PanelContainer)FindChild("ChatLog");
_nextLabel = (PanelContainer)FindChild("NextLabel");
_chatLogContainer = (VBoxContainer)FindChild("ChatLogContainer");
_camera = (Camera2D)FindChild("Camera2D");
_footsteps = (AudioCollection)FindChild("Footsteps");
_doorSounds = (AudioCollection)FindChild("DoorSounds");
}
public override void _PhysicsProcess(double delta)
@ -97,12 +111,13 @@ public partial class Player : CharacterBody2D
switch (CurrentState)
{
case State.Normal:
if (Camera.Offset != _cameraDefaultPosition)
if (_camera.Offset != _cameraDefaultPosition)
{
if (_currentCameraTransitionTime < CameraTransitionTime)
{
Camera.Offset = _cameraChatLogPosition.Lerp(_cameraDefaultPosition, (float)(_currentCameraTransitionTime * 1/CameraTransitionTime));
_camera.Offset = _cameraChatLogPosition.Lerp(_cameraDefaultPosition,
(float)(_currentCameraTransitionTime * 1 / CameraTransitionTime));
_currentCameraTransitionTime += delta;
}
else
@ -110,51 +125,37 @@ public partial class Player : CharacterBody2D
_currentCameraTransitionTime = 0;
}
}
Vector2 velocity = Velocity;
// if (!IsOnFloor())
// {
// velocity += GetGravity() * (float)delta;
// }
//
// if (IsOnFloor() && !Visible)
// {
// Visible = true;
// }
Vector2 direction = Input.GetVector("move_left", "move_right", "move_up", "move_down");
if (direction != Vector2.Zero)
{
Footsteps.Play();
// if (!Footsteps.IsPlaying())
// {
// // Footsteps.PitchScale = (float)GD.RandRange(0.5, 1.0);
// Footsteps.Play();
// }
_footsteps.Play();
velocity.X = direction.X * Speed;
Sprite.Play("walk");
Sprite.FlipH = direction.X switch
_sprite.Play("walk");
_sprite.FlipH = direction.X switch
{
> 0 => false,
< 0 => true,
_ => Sprite.FlipH
_ => _sprite.FlipH
};
}
else
{
// Footsteps.Stop();
velocity.X = Mathf.MoveToward(Velocity.X, 0, Speed);
Sprite.Play("default");
_sprite.Play("default");
}
Velocity = velocity;
MoveAndSlide();
break;
case State.Transition:
if (_currentTransitionTime < TransitionTime)
{
GlobalPosition = _previousPosition.Lerp(_nextPosition, (float)(_currentTransitionTime * 1/TransitionTime));
GlobalPosition = _previousPosition.Lerp(_nextPosition,
(float)(_currentTransitionTime * 1 / TransitionTime));
_currentTransitionTime += delta;
}
else
@ -165,25 +166,33 @@ public partial class Player : CharacterBody2D
break;
case State.ReadChat:
if (Camera.Offset != _cameraChatLogPosition)
{
if (_currentCameraTransitionTime < CameraTransitionTime)
{
Camera.Offset = _cameraDefaultPosition.Lerp(_cameraChatLogPosition, (float)(_currentCameraTransitionTime * 1/CameraTransitionTime));
_currentCameraTransitionTime += delta;
}
else
{
_currentCameraTransitionTime = 0;
}
}
ShowChatLog(delta);
break;
case State.ChatWithNPC:
ShowChatLog(delta);
break;
case State.Wait:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
private void ShowChatLog(double delta)
{
if (_camera.Offset != _cameraChatLogPosition)
{
if (_currentCameraTransitionTime < CameraTransitionTime)
{
_camera.Offset = _cameraDefaultPosition.Lerp(_cameraChatLogPosition,
(float)(_currentCameraTransitionTime * 1 / CameraTransitionTime));
_currentCameraTransitionTime += delta;
}
else
{
_currentCameraTransitionTime = 0;
}
}
}
public override void _Input(InputEvent @event)
@ -192,12 +201,41 @@ public partial class Player : CharacterBody2D
{
if (InteractableObject is NPC npc)
{
npc.test();
void AddMessage()
{
var msg = _dialogBox.Instantiate<Dialog>();
msg.Text = npc.Message;
msg.Author = npc.NPCName;
_chatLogContainer.AddChild(msg);
if (npc.IsDialogEnded) CurrentState = State.ReadChat;
}
switch (CurrentState)
{
case State.Normal:
if (GlobalPosition.X - npc.GlobalPosition.X > 0)
{
npc.Flip = false;
_sprite.FlipH = true;
}
else
{
npc.Flip = true;
_sprite.FlipH = false;
}
CurrentState = State.ChatWithNPC;
AddMessage();
break;
case State.ChatWithNPC:
AddMessage();
break;
}
}
if (InteractableObject is Door door)
{
DoorSounds.Play();
_doorSounds.Play();
_previousPosition = GlobalPosition;
_nextPosition = door.Exit.GlobalPosition;
CurrentState = State.Wait;
@ -225,4 +263,5 @@ public partial class Player : CharacterBody2D
CurrentState = State.Transition;
}
}
}