Реализация живого доспеха

This commit is contained in:
Евгений Титаренко 2023-08-18 01:14:55 +03:00
parent 64e6187aab
commit aca884b891
5 changed files with 354 additions and 4 deletions

View file

@ -9,11 +9,13 @@ public partial class Player : CharacterBody2D
public bool Alive = true;
public static Player Instance { get; private set; }
protected AnimatedSprite2D Sprite;
public override void _Ready()
{
base._Ready();
Instance = this;
Sprite = (AnimatedSprite2D)FindChild("AnimatedSprite2D");
}

View file

@ -0,0 +1,158 @@
using Godot;
using System;
public partial class LivingArmor : CharacterBody2D
{
public enum State
{
Waiting,
Moving,
Attack
}
public enum SideFace
{
Left,
Up,
Right,
Down
}
[Export] public SideFace Facing = SideFace.Down;
[Export] public float MovingSpeed = 16f;
public State CurrentState
{
get => _state;
private set
{
_state = value;
_timeSinceState = 0;
switch (_state)
{
case State.Waiting:
break;
case State.Moving:
break;
case State.Attack:
break;
}
}
}
private State _state;
private float _timeSinceState;
private AnimatedSprite2D _sprite;
private bool _isLitUp;
public override void _Ready()
{
_sprite = (AnimatedSprite2D)FindChild("AnimatedSprite2D");
CurrentState = State.Waiting;
var animationName = "side_walk";
switch (Facing)
{
case SideFace.Left:
_sprite.FlipH = true;
break;
case SideFace.Right:
break;
case SideFace.Up:
animationName = "up_walk";
break;
case SideFace.Down:
animationName = "down_walk";
break;
}
_sprite.Play(animationName);
_sprite.Stop();
}
public override void _Process(double delta)
{
}
public override void _PhysicsProcess(double delta)
{
_timeSinceState += (float)delta;
switch (_state)
{
case State.Attack:
break;
case State.Waiting:
_sprite.Stop();
break;
case State.Moving:
var direction = (Player.Instance.Position - Position).Normalized();
Velocity = direction * MovingSpeed;
var animationName = "side_walk";
if (Velocity.Y > 0.001f)
animationName = "down_walk";
else if (Velocity.Y < 0.001f)
animationName = "up_walk";
if (Mathf.Abs(Velocity.X) >= Mathf.Abs(Velocity.Y))
animationName = "side_walk";
_sprite.FlipH = Velocity.X < 0.001f && animationName == "side_walk";
_sprite.Play(animationName);
MoveAndSlide();
//MoveAndCollide(direction);
break;
}
CheckIfLitUp();
}
private void _OnLightEntered(Area2D area)
{
if (area.GetParentOrNull<GameCamera>() is null)
return;
_isLitUp = true;
}
private void _OnPlayerCollision(Node2D body)
{
if (body is not Player player)
return;
if (CurrentState is State.Waiting)
return;
player.Kill(this);
}
private void _OnLightExited(Area2D area)
{
GD.Print("Unlighted");
if (area.GetParentOrNull<GameCamera>() is null)
return;
_isLitUp = false;
}
private void _OnPlayerCollisionExited(Node2D body)
{
}
void CheckIfLitUp()
{
if (!_isLitUp)
{
CurrentState = State.Waiting;
return;
}
if (CurrentState is State.Moving or State.Attack)
return;
CurrentState = State.Moving;
}
}