Подземелье: телепорт внутри тёмной шахты (fade исчезновение/появление)
Персонаж доходит до тёмной шахты, плавно исчезает (alpha 1->0), переносится в шахту на случайном другом этаже и плавно появляется (0->1). Без вертикального прохода. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
085cf3e5fa
commit
a254309ec9
+20
-12
@@ -30,7 +30,7 @@ public partial class RoomMap : Node2D
|
||||
private PanelContainer _infoPanel;
|
||||
private Label _infoLabel;
|
||||
|
||||
private enum PState { Idle, Walk, GoShaft, Climb, Held }
|
||||
private enum PState { Idle, Walk, GoShaft, Teleport, Held }
|
||||
|
||||
private class Pawn
|
||||
{
|
||||
@@ -38,7 +38,8 @@ public partial class RoomMap : Node2D
|
||||
public AnimationPlayer Ap;
|
||||
public string Name;
|
||||
public int Row, TargetRow;
|
||||
public float X, TargetX, TargetY, Speed, MinX, MaxX, IdleTimer;
|
||||
public float X, TargetX, Speed, MinX, MaxX, IdleTimer, FadeT;
|
||||
public bool Swapped;
|
||||
public PState State;
|
||||
public string WalkAnim, IdleAnim;
|
||||
}
|
||||
@@ -251,29 +252,35 @@ public partial class RoomMap : Node2D
|
||||
{
|
||||
p.X = _shaftX;
|
||||
do { p.TargetRow = _rng.Next(Rows); } while (p.TargetRow == p.Row);
|
||||
p.TargetY = FloorY(p.TargetRow);
|
||||
p.State = PState.Climb;
|
||||
PlayWalk(p); // движение по шахте — боевой walk
|
||||
p.State = PState.Teleport;
|
||||
p.FadeT = 0f; p.Swapped = false;
|
||||
PlayIdle(p);
|
||||
}
|
||||
else { p.State = PState.Idle; p.IdleTimer = 0.8f + (float)_rng.NextDouble() * 2.2f; PlayIdle(p); }
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case PState.Climb: // вертикальное движение сквозь тёмную шахту
|
||||
case PState.Teleport: // исчезнуть в шахте на одном этаже и появиться на другом
|
||||
{
|
||||
float cy = p.Node.Position.Y;
|
||||
cy += Mathf.Sign(p.TargetY - cy) * p.Speed * dt;
|
||||
p.Node.Position = new Vector2(_shaftX, cy);
|
||||
p.Node.Scale = new Vector2(1f, 1f);
|
||||
if (Mathf.Abs(p.TargetY - cy) < 4f)
|
||||
const float dur = 0.5f;
|
||||
p.FadeT += dt / dur;
|
||||
if (!p.Swapped && p.FadeT >= 0.5f)
|
||||
{
|
||||
p.Swapped = true;
|
||||
p.Row = p.TargetRow;
|
||||
p.X = _shaftX;
|
||||
p.Node.Position = new Vector2(_shaftX, FloorY(p.Row));
|
||||
if (_selected == p) ShowInfo(p);
|
||||
}
|
||||
float a = p.FadeT < 0.5f ? 1f - p.FadeT * 2f : (p.FadeT - 0.5f) * 2f;
|
||||
p.Node.Modulate = new Color(1f, 1f, 1f, Mathf.Clamp(a, 0f, 1f));
|
||||
if (p.FadeT >= 1f)
|
||||
{
|
||||
p.Node.Modulate = Colors.White;
|
||||
p.State = PState.Idle;
|
||||
p.IdleTimer = 0.4f + (float)_rng.NextDouble() * 1.5f;
|
||||
PlayIdle(p);
|
||||
if (_selected == p) ShowInfo(p);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -305,6 +312,7 @@ public partial class RoomMap : Node2D
|
||||
p.Row = row;
|
||||
p.X = Mathf.Clamp(col * Cell + Cell * 0.5f, p.MinX, p.MaxX);
|
||||
p.Node.Position = new Vector2(p.X, FloorY(row));
|
||||
p.Node.Modulate = Colors.White;
|
||||
p.State = PState.Idle; p.IdleTimer = 0.5f; PlayIdle(p);
|
||||
if (_selected == p) ShowInfo(p);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user