From 6f351139cf7b9b65ccd813e47d9259fc4e2b6857 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 13 Jun 2026 18:27:00 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A1=E3=80=81=E4=BF=AE=E5=A4=8Dbug?= =?UTF-8?q?=EF=BC=9A=E5=B0=BE=E9=83=A8=E7=A7=BB=E5=8A=A8=E5=88=B0=E8=BE=B9?= =?UTF-8?q?=E7=95=8C=E5=90=8E=E6=89=8D=E9=9A=90=E8=97=8F=E3=80=822?= =?UTF-8?q?=E3=80=81=E6=B7=BB=E5=8A=A0=E5=88=A0=E9=99=A4=E9=81=93=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ArrowBeatTap-Gp.sln.DotSettings.user | 3 +- .../package/Arrow_game/Arrow_gameBinder.cs | 1 + .../FGUI/package/Arrow_game/com_arrow_game.cs | 6 + .../FGUI/package/Arrow_game/com_finger.cs | 27 ++ .../package/Arrow_game/com_finger.cs.meta | 11 + .../FGUI/Arrow_game_atlas0.png | Bin 15155 -> 18429 bytes .../FGUI/Arrow_game_fui.bytes | Bin 3566 -> 5215 bytes .../Scripts/ModuleUI/ArrowGame/ArrowGameUI.cs | 246 ++++++++++++++---- Assets/StreamingAssets/level_1001.json | 85 +++--- 9 files changed, 279 insertions(+), 100 deletions(-) create mode 100644 Assets/ChillConnect/FGUI/package/Arrow_game/com_finger.cs create mode 100644 Assets/ChillConnect/FGUI/package/Arrow_game/com_finger.cs.meta diff --git a/ArrowBeatTap-Gp.sln.DotSettings.user b/ArrowBeatTap-Gp.sln.DotSettings.user index 6e39860..526b660 100644 --- a/ArrowBeatTap-Gp.sln.DotSettings.user +++ b/ArrowBeatTap-Gp.sln.DotSettings.user @@ -8,4 +8,5 @@ ForceIncluded ForceIncluded ForceIncluded - ForceIncluded \ No newline at end of file + ForceIncluded + ForceIncluded \ No newline at end of file diff --git a/Assets/ChillConnect/FGUI/package/Arrow_game/Arrow_gameBinder.cs b/Assets/ChillConnect/FGUI/package/Arrow_game/Arrow_gameBinder.cs index 511cc1d..8d5a146 100644 --- a/Assets/ChillConnect/FGUI/package/Arrow_game/Arrow_gameBinder.cs +++ b/Assets/ChillConnect/FGUI/package/Arrow_game/Arrow_gameBinder.cs @@ -13,6 +13,7 @@ namespace FGUI.Arrow_game UIObjectFactory.SetPackageItemExtension(LineTile.URL, typeof(LineTile)); UIObjectFactory.SetPackageItemExtension(ArrorPoint.URL, typeof(ArrorPoint)); UIObjectFactory.SetPackageItemExtension(HeartsPanel.URL, typeof(HeartsPanel)); + UIObjectFactory.SetPackageItemExtension(com_finger.URL, typeof(com_finger)); } } } \ No newline at end of file diff --git a/Assets/ChillConnect/FGUI/package/Arrow_game/com_arrow_game.cs b/Assets/ChillConnect/FGUI/package/Arrow_game/com_arrow_game.cs index 52af3dd..d9fee3c 100644 --- a/Assets/ChillConnect/FGUI/package/Arrow_game/com_arrow_game.cs +++ b/Assets/ChillConnect/FGUI/package/Arrow_game/com_arrow_game.cs @@ -14,6 +14,9 @@ namespace FGUI.Arrow_game public ArrorPoint point; public GButton btn_close; public HeartsPanel HeartsPanel; + public GButton btn_clear; + public GButton btn_hint; + public com_finger com_finger; public const string URL = "ui://sjl9teijrsd40"; public static com_arrow_game CreateInstance() @@ -32,6 +35,9 @@ namespace FGUI.Arrow_game point = (ArrorPoint)GetChildAt(4); btn_close = (GButton)GetChildAt(6); HeartsPanel = (HeartsPanel)GetChildAt(7); + btn_clear = (GButton)GetChildAt(9); + btn_hint = (GButton)GetChildAt(10); + com_finger = (com_finger)GetChildAt(11); } } } \ No newline at end of file diff --git a/Assets/ChillConnect/FGUI/package/Arrow_game/com_finger.cs b/Assets/ChillConnect/FGUI/package/Arrow_game/com_finger.cs new file mode 100644 index 0000000..6140f12 --- /dev/null +++ b/Assets/ChillConnect/FGUI/package/Arrow_game/com_finger.cs @@ -0,0 +1,27 @@ +/** This is an automatically generated class by FairyGUI. Please do not modify it. **/ + +using FairyGUI; +using FairyGUI.Utils; + +namespace FGUI.Arrow_game +{ + public partial class com_finger : GComponent + { + public GImage finger; + public Transition t0; + public const string URL = "ui://sjl9teijrsd4f"; + + public static com_finger CreateInstance() + { + return (com_finger)UIPackage.CreateObject("Arrow_game", "com_finger"); + } + + public override void ConstructFromXML(XML xml) + { + base.ConstructFromXML(xml); + + finger = (GImage)GetChildAt(0); + t0 = GetTransitionAt(0); + } + } +} \ No newline at end of file diff --git a/Assets/ChillConnect/FGUI/package/Arrow_game/com_finger.cs.meta b/Assets/ChillConnect/FGUI/package/Arrow_game/com_finger.cs.meta new file mode 100644 index 0000000..1677c84 --- /dev/null +++ b/Assets/ChillConnect/FGUI/package/Arrow_game/com_finger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d110f1d5f9c887b4d9194e2f3ca1c58c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/ChillConnectAssets/FGUI/Arrow_game_atlas0.png b/Assets/Resources/ChillConnectAssets/FGUI/Arrow_game_atlas0.png index 9e86b35dcdd27b51e974857af3a31bdbcd6a7a45..d17798f06621093302671ed64bbb0779e9952545 100644 GIT binary patch delta 17864 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 K=d#Wzp$Pz^ztQgi literal 15155 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 diff --git a/Assets/Resources/ChillConnectAssets/FGUI/Arrow_game_fui.bytes b/Assets/Resources/ChillConnectAssets/FGUI/Arrow_game_fui.bytes index 15908b1cbd97571eb3b64bb1694fcef21d86af23..1d028d0458da19a696c69275751d3e4e70588928 100644 GIT binary patch literal 5215 zcmeHL%}-oa6#w1%Vg~3JVn5N=N>S+tGXoR`un4piENy8my3k}g%)HWR;0+E#p=^~s{4w?!d!YHGi6bhUa_1xN=3=mx2qvc0QdOceVWYbF*v1bJG;$=Gx=VO`g*@ zL{c>?_DzDU4@e)9%+})zi>t0H3Zr@r4&rr;kaHTNKm(UR9iC&gjWi@{&~2o8S&^lp z+|{*qd-$y|1)F=5MZkn)eRqWvcW6EK;h^ToGE}`|V{by%vs6_71)%>kO3iEET}Kgn zbz87C?U5!_FIRF__)cIi@n1028Yy-DgP6VKe9#e@= zq;qAMr*IDEVrZtz2XTne;SP10r9qCACi!DBMg)QkqE5{7fjmseBRW9KZ2kRYGX-)p zqpbtkudQrH3f<^IKl)>c6EcA$;Xb9M?~8Gsb;dzA3a^jRN{lwNv*mkSVmkg-#0Yf7 z6c?p;WDB;V3#du=B)uNcYqZk}S8%c%sn5pIZX7+#Cqx2&{(g#4a8? zPEB(}|0%~EpZ~{b4419p0Ssd}#^o#-MHl~LB%OJ9>t#i#T(!e|pt`w~dzi04T_)5Y zq~)bo3F=JQ{s&HRP2(7$dhr@}7GWa4%Vxbnw0lp0H0Jx579d`qPBrR?_m{v_@^X{A z>3yJf5UQVv27>nq^>D*bKJjBWp$4#rUQW}&<`q!B@x$+=l5>Pb{S-tqBPMfGH(J(9 zZhC)3l$YF;=d1dN^d;#l-KPnzI#iIiq1-g<&Dm)}j3Miu1Cmne;#naz@9>q14kJtK zNSmgZ{JNo5+DKV?@ZbRthIKk&0&LX8*fQHIc2d2zlShvpu@lSl!o4*PNH%tx^bN@^Mt!XV>!vr}D2u6HXTA=Y z;ozp$rLq&>204#It`ocp%5@O<+;c)Mlrr0L!@ETiXWZhc3q$$c^7iV%m*hehvE6Ir zZ@cJK7qP=z6sto9i1E==(SteZ3IwxHyw*%OW;jveVf~D^o}wbj_FEt|4z2c?ygHY3@5 zHE+$Ovjw}9$=j}h?UZ*qE%isU6L!vErVzCgDI*F`7sSh`opgpL$T!r@=DS*2+>dTz zWeVXLYkWTA&QoE=GGODYuW6g|Vt@L*Vd71*spsG<{i}0GyxTAs zF~9{G%5Y%2bO+K%*gh3*D0HAimjyikqn0@80>)9wM;Tsd(1!!Asnh_m&3@&rhj(Nc zB}RoUuNbcxyY$nDO?a>>B$#M$sYQ-h!m2zRaAyNPdZbfHCw|l%iuBZ2R4s(K>KEgV8b*ZKtnZdkxx0Z1?fBNzDo(QX(AVMO z^R(u_u10Z+E&Kj;;d0{QWCd2#DSpgp>IBwx;aE@GZ75)#7q(8}4C&@YhnG;JE9Q#2 zfU`WjcV>PvqM+_P?m5n}M~`jJu|IMK0(H`?th~VI4J#{D)a?LzX{8G;ho@NDBO3o5 zws*Wn7N9}jtpvRfE_+0`+Y;uTV3m h+Bp^IPab#r?f!#a`}QW>8~uA5TV-gYbFSCj{0Bx%l{x?b diff --git a/Assets/Scripts/ModuleUI/ArrowGame/ArrowGameUI.cs b/Assets/Scripts/ModuleUI/ArrowGame/ArrowGameUI.cs index 7ce3121..b611cf3 100644 --- a/Assets/Scripts/ModuleUI/ArrowGame/ArrowGameUI.cs +++ b/Assets/Scripts/ModuleUI/ArrowGame/ArrowGameUI.cs @@ -54,8 +54,11 @@ namespace ChillConnect // 统计场上还存在的箭头总数(用于判断全部移除=通关) private int _remainArrowCount = 0; - // 结算界面UI引用(根据你FGUI包名/组件名自行修改) - // private ResultPanel _resultPanel; + // 记录当前UI所有由 CrazyAsyKit 启动的协程,用于统一停止 + private List _activeCoroutines = new List(); + + // 是否开启删除道具模式 + private bool _isDeleteMode = false; public ArrowGameUI(ArrowGameUICtrl ctrl) : base(ctrl) { @@ -80,6 +83,26 @@ namespace ChillConnect protected override void OnClose() { + // ========= 第一步:统一停止所有协程(核心修复) ========= + foreach (var co in _activeCoroutines) + { + if (co != null) + { + CrazyAsyKit.StopCoroutine(co); + } + } + // 清空列表 + _activeCoroutines.Clear(); + + // 保险========= 强制停止所有移动,终止对应协程 ========= + if (_levelConfig != null) + { + foreach (var arrow in _levelConfig.arrows) + { + arrow.isMoving = false; + } + } + // 销毁所有动态FGUI对象 ClearAllDynamicObj(); @@ -152,6 +175,8 @@ namespace ChillConnect { // 关闭按钮 ui.btn_close.SetClick(() => { CtrlCloseUI(); }); + ui.btn_clear.SetClick(OnClickDeleteItem); + if (_levelConfig == null) return; @@ -410,6 +435,8 @@ namespace ChillConnect arrow.finalMoveDir = GetDirByRotation(arrow.arrowObj.rotation); // ========= 修复2:强制记录原始坐标(关键!)========= arrow.originalArrowPos = new Vector2(arrow.arrowObj.x, arrow.arrowObj.y); + // 优化:给单点箭头填充一个轨迹点,和有线箭头逻辑完全一致 + arrow.totalTrack.Add(pathPoints[0]); return; } @@ -467,10 +494,21 @@ namespace ChillConnect private void OnPathClick(ArrowConfig clickArrow) { if (clickArrow.isMoving) + { + Debug.Log($"[arrow] {clickArrow.id}正在移动,请勿点击其他箭头"); return; + } + + // ========= 删除模式:直接删除箭头,不走移动逻辑 ========= + if (_isDeleteMode) + { + DeleteArrowCompletely(clickArrow); + return; + } clickArrow.isMoving = true; bool hasBlock = CheckBlockByGrid(clickArrow); + Debug.Log("[arrow] 点击箭头:" + clickArrow.id +$"hasBlock==={hasBlock}"); if (hasBlock) { MoveThenReset(clickArrow); @@ -480,6 +518,23 @@ namespace ChillConnect MoveToDisappear(clickArrow); } } + + /// 点击删除道具,开启/关闭删除模式 + public void OnClickDeleteItem() + { + _isDeleteMode = !_isDeleteMode; + + // 可选:加提示,区分状态 + if (_isDeleteMode) + { + Debug.Log("已开启删除模式,点击箭头即可删除"); + // 可加UI提示:如图标高亮、文字提示 + } + else + { + Debug.Log("已关闭删除模式"); + } + } // 基于网格行列的阻挡检测 private bool CheckBlockByGrid(ArrowConfig curArrow) @@ -577,6 +632,58 @@ namespace ChillConnect return isCollide; } + + /// 彻底删除指定箭头:销毁UI+清数据+停逻辑+移除列表 + private void DeleteArrowCompletely(ArrowConfig arrow) + { + if (arrow == null) return; + + // 1. 停止移动标记,拦截Update和协程 + arrow.isMoving = false; + + // 2. 销毁箭头中所有线条UI + if (arrow.lineUnits != null) + { + foreach (var line in arrow.lineUnits) + { + if (line != null) + { + _viewContainer.RemoveChild(line); + line.Dispose(); + } + } + arrow.lineUnits.Clear(); + } + + // 3. 销毁箭头本体UI + if (arrow.arrowObj != null) + { + _viewContainer.RemoveChild(arrow.arrowObj); + arrow.arrowObj.Dispose(); + arrow.arrowObj = null; + } + + // 4. 释放网格占用数据(和飞出边界逻辑保持一致) + ReleaseArrowOccupied(arrow); + + // 5. 存活箭头计数-1 + _remainArrowCount--; + + // 6. 从总列表移除该箭头(核心:删除数据源) + if (_levelConfig != null && _levelConfig.arrows != null) + { + _levelConfig.arrows.Remove(arrow); + } + + // 7. 可选:判断是否全部删除完成,触发结算(按需开启) + if (_remainArrowCount <= 0) + { + ShowResult(true); + } + // 8. 退出删除模式 + _isDeleteMode = false; + Debug.Log("[arrow] 箭头已彻底删除"); + } // 创建箭头 + 绑定点击 private void CreateArrowOnly(ArrowConfig arrow, Vector2 arrowPos) @@ -611,7 +718,7 @@ namespace ChillConnect // 移动后复位动画(回弹,不释放占用) private void MoveThenReset(ArrowConfig arrow) { - CrazyAsyKit.StartCoroutine(MoveAndResetCoroutine(arrow)); + RunCoroutine(MoveAndResetCoroutine(arrow)); } private IEnumerator MoveAndResetCoroutine(ArrowConfig arrow) @@ -638,6 +745,13 @@ namespace ChillConnect while (moved < stepCount) { + // 新增空对象防护 + if (arrow == null || arrow.arrowObj == null) + { + Debug.Log($"[arrow] MoveAndResetCoroutine arrow 为空, 协程结束"); + yield break; + } + for (int i = 0; i < arrow.lineUnits.Count; i++) { int curIdx = arrow.lineTrackIndex[i]; @@ -693,8 +807,10 @@ namespace ChillConnect arrow.lineUnits[i].SetPosition(arrow.originalLinePos[i].x, arrow.originalLinePos[i].y, 0); arrow.lineTrackIndex[i] = i; } - // 单点/多点箭头统一读取原始坐标复位 - arrow.arrowObj.SetPosition(arrow.originalArrowPos.x, arrow.originalArrowPos.y, 0); + if(arrow.arrowObj != null) + { + arrow.arrowObj.SetPosition(arrow.originalArrowPos.x, arrow.originalArrowPos.y, 0); + } arrow.arrowTrackIndex = arrow.totalTrack.Count - 1; arrow.isMoving = false; @@ -702,13 +818,14 @@ namespace ChillConnect private void MoveToDisappear(ArrowConfig arrow) { - CrazyAsyKit.StartCoroutine(MoveAndDisappearCoroutine(arrow)); + RunCoroutine(MoveAndDisappearCoroutine(arrow)); } private IEnumerator MoveAndDisappearCoroutine(ArrowConfig arrow) { + Debug.Log($"[arrow] arrow.totalTrack.Count =={arrow.totalTrack.Count}"); float frameDelay = 0.01f; - int trackMaxIndex = arrow.totalTrack.Count - 1; + int trackMaxIndex = arrow.totalTrack != null ? arrow.totalTrack.Count - 1 : 0; string dir; if (arrow.path != null && arrow.path.Count > 0) @@ -727,6 +844,14 @@ namespace ChillConnect while (true) { + // 兜底:对象已销毁,直接退出 + if (arrow == null || arrow.arrowObj == null) + { + Debug.Log($"arrow 为空, 协程结束"); + + yield break; + } + // 线条移动 for (int i = 0; i < arrow.lineUnits.Count; i++) { @@ -774,38 +899,75 @@ namespace ChillConnect arrow.arrowObj.y += dy; } - // 边界判断 - float curX = arrow.arrowObj.x; - float curY = arrow.arrowObj.y; + // ========= 边界判断:有线箭头取尾部轨迹,单点箭头取自身 ========= + // 直接取箭头实时坐标,不再使用totalTrack静态点位 bool isOut = false; + float checkX = 0; + float checkY = 0; + + // 线段从起点生成,第 0 个元素才是尾巴 + if (arrow.lineUnits != null && arrow.lineUnits.Count > 0) + { + var tailLine = arrow.lineUnits[0]; + checkX = tailLine.x; + checkY = tailLine.y; + } + else if (arrow.arrowObj != null) + { + // 纯单点箭头,使用自身坐标 + checkX = arrow.arrowObj.x; + checkY = arrow.arrowObj.y; + } + + Debug.Log($"[arrow] arrow.finalMoveDir =={arrow.finalMoveDir}"); + switch (arrow.finalMoveDir) { case "right": - if (curX > gridRight + outOffset) isOut = true; + Debug.Log($"[arrow] checkX={checkX} | gridRight={gridRight} | gridRight + outOffset={gridRight + outOffset}"); + if (checkX > gridRight + outOffset) isOut = true; break; case "left": - if (curX < gridLeft - outOffset) isOut = true; + Debug.Log($"[arrow] checkX={checkX} | gridLeft={gridLeft} | gridLeft - outOffset={gridLeft - outOffset}"); + if (checkX < gridLeft - outOffset) isOut = true; break; case "down": - if (curY > gridBottom + outOffset) isOut = true; + Debug.Log($"[arrow] checkY={checkY} | gridBottom={gridBottom} | gridBottom + outOffset={gridBottom + outOffset}"); + if (checkY > gridBottom + outOffset) isOut = true; break; case "up": - if (curY < gridTop - outOffset) isOut = true; + Debug.Log($"[arrow] checkY={checkY} | gridTop={gridTop} | gridTop - outOffset={gridTop - outOffset}"); + if (checkY < gridTop - outOffset) isOut = true; break; } + // ========= 超出边界:隐藏 + 计数 + 终止协程 ========= + Debug.Log($"[arrow] isOut =={isOut}"); if (isOut) { - // 箭头移出屏幕,释放网格占用 ReleaseArrowOccupied(arrow); - // 隐藏视图 + // 销毁线条 foreach (var line in arrow.lineUnits) - line.visible = false; - arrow.arrowObj.visible = false; + { + if(line != null) + { + _viewContainer.RemoveChild(line); + line.Dispose(); + } + } + arrow.lineUnits.Clear(); + + // 销毁箭头 + if(arrow.arrowObj != null) + { + _viewContainer.RemoveChild(arrow.arrowObj); + arrow.arrowObj.Dispose(); + arrow.arrowObj = null; + } + arrow.isMoving = false; - - // ========== 新增:存活箭头-1,判断全部移除 ========== + _remainArrowCount--; if (_remainArrowCount <= 0) { @@ -818,33 +980,6 @@ namespace ChillConnect yield return new WaitForSeconds(frameDelay); } } - - private void CreateLineUnitBetweenTwoPoint(Vector2 pStart, Vector2 pEnd, Color lineColor, List lineList) - { - if (_lineUnitTemplate == null) return; - float offsetX = 0f; - float offsetY = 0f; - - if (Mathf.Abs(pEnd.x - pStart.x) > 1f) - offsetX = 10f; - else - offsetY = 10f; - - Vector2 curPos = pStart; - for (int i = 0; i < 6; i++) - { - LineTile unit = LineTile.CreateInstance(); - unit.SetPosition(curPos.x, curPos.y, 0); - unit.GetChild("line").asGraph.color = lineColor; - unit.visible = true; - - _viewContainer.AddChild(unit); - lineList.Add(unit); - - curPos.x += offsetX; - curPos.y += offsetY; - } - } #endregion #region 点击 & 移动逻辑 @@ -856,6 +991,10 @@ namespace ChillConnect private void UpdateArrowMove(ArrowConfig arrow) { + // 关键拦截:不允许移动 / 对象已销毁 → 直接退出 + if (!arrow.isMoving || arrow.arrowObj == null) + return; + if (!arrow.isMoving) return; List path = arrow.pathPointList; @@ -903,6 +1042,19 @@ namespace ChillConnect #endregion #region 资源清理 + + /// 全局启动协程 + 自动记录,关闭界面时统一停止 + private Coroutine RunCoroutine(IEnumerator cor) + { + if (cor == null) return null; + Coroutine co = CrazyAsyKit.StartCoroutine(cor); + if (co != null) + { + _activeCoroutines.Add(co); + } + return co; + } + private void ClearAllDynamicObj() { if (_levelConfig == null || _viewContainer == null) return; diff --git a/Assets/StreamingAssets/level_1001.json b/Assets/StreamingAssets/level_1001.json index 436367c..bff258a 100644 --- a/Assets/StreamingAssets/level_1001.json +++ b/Assets/StreamingAssets/level_1001.json @@ -8,42 +8,41 @@ { "id": 1, "startPoint": 0, - "endPoint": 25, + "endPoint": 17, "color": "#FFFFFF", "path": [ "right", "right", "right", "right", - "right", "down", - "down" - ] - }, - { - "id": 2, - "startPoint": 30, - "endPoint": 37, - "color": "#FFFFFF", - "path": [ - "right", - "right", - "right", - "right", "right", "right", "right" ] }, { - "id": 3, - "startPoint": 50, - "endPoint": 46, - "color": "#FFFFFF", + "id": 2, + "startPoint": 18, + "endPoint": 23, + "color": "#FFCC00", + "path": [ + "down", + "left", + "left", + "left", + "left", + "down", + "left", + "up" + ] + }, + { + "id": 3, + "startPoint": 36, + "endPoint": 29, + "color": "#33FF00", "path": [ - "right", - "right", - "right", "right", "right", "right", @@ -52,44 +51,26 @@ }, { "id": 4, - "startPoint": 60, - "endPoint": 66, - "color": "#FFFFFF", - "path": [ - "right", - "right", - "right", - "right", - "right", - "right" - ] + "startPoint": 88, + "endPoint": 88, + "color": "#FFFF00", + "path": [] }, { "id": 5, - "startPoint": 93, - "endPoint": 73, + "startPoint": 92, + "endPoint": 84, "color": "#FFFFFF", "path": [ "up", - "up" - ] - }, - { - "id": 6, - "startPoint": 9, - "endPoint": 89, - "color": "#FFFFFF", - "path": [ - "down", - "down", - "down", - "down", - "down", "left", - "down", - "down", + "left", + "up", "right", - "down" + "right", + "right", + "down", + "right" ] } ]