From a254309ec97f55f16d8152f761d416528d47750d Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Mon, 3 Aug 2026 17:30:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B7=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=B5:=20=D1=82=D0=B5=D0=BB=D0=B5=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=82=20=D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B8=20=D1=82?= =?UTF-8?q?=D1=91=D0=BC=D0=BD=D0=BE=D0=B9=20=D1=88=D0=B0=D1=85=D1=82=D1=8B?= =?UTF-8?q?=20(fade=20=D0=B8=D1=81=D1=87=D0=B5=D0=B7=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5/=D0=BF=D0=BE=D1=8F=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Персонаж доходит до тёмной шахты, плавно исчезает (alpha 1->0), переносится в шахту на случайном другом этаже и плавно появляется (0->1). Без вертикального прохода. Co-Authored-By: Claude Opus 4.8 --- src/RoomMap.cs | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/RoomMap.cs b/src/RoomMap.cs index 5f76fc2..e45dcfb 100644 --- a/src/RoomMap.cs +++ b/src/RoomMap.cs @@ -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); }