From d483cd0660c858edb55e1b477aa7c6e9e594416f Mon Sep 17 00:00:00 2001 From: Heller Date: Fri, 19 Jun 2026 10:12:32 +0000 Subject: [PATCH] fix: only interpolate head and tail, keep middle segments grid-snapped MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prevents diagonal shortcuts when snake bends — middle segments stay at exact cell centers so L-shaped corners render correctly. --- Snake.Avalonia/Views/SnakeRenderer.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Snake.Avalonia/Views/SnakeRenderer.cs b/Snake.Avalonia/Views/SnakeRenderer.cs index 11a60f0..934004a 100644 --- a/Snake.Avalonia/Views/SnakeRenderer.cs +++ b/Snake.Avalonia/Views/SnakeRenderer.cs @@ -376,11 +376,19 @@ public sealed class SnakeRenderer : Control if (Segments == null) return (pos.X * CellSize + CellSize * 0.5, pos.Y * CellSize + CellSize * 0.5); + var isHead = segmentIndex == 0; + var isTail = Segments.Count > 1 && segmentIndex == Segments.Count - 1; + + // Only interpolate head and tail — middle segments stay grid-snapped + // to preserve sharp corners when the snake bends. + if (!isHead && !isTail) + return (pos.X * CellSize + CellSize * 0.5, pos.Y * CellSize + CellSize * 0.5); + var from = PreviousSegments != null && PreviousSegments.Count > 0 ? AnimationHelper.GetPreviousPosition(segmentIndex, Segments, PreviousSegments, SnakeDirection) : pos; - var useEasing = segmentIndex == 0; // Head gets easing for snappy feel - return AnimationHelper.InterpolatePosition(from, pos, t, CellSize, useEasing); + // Head gets easing for snappy feel; tail uses linear interpolation + return AnimationHelper.InterpolatePosition(from, pos, t, CellSize, useEasing: isHead); } }