// Chessboard.cs using Godot; public partial class ChessBoard : Node2D { VirtualBoard Board = null; MoveRecords Records = null; // Called when the node enters the scene tree for the first time. public Vector2 selectedNodePos = Vector2.Inf; public override void _Ready() { Board = new VirtualBoard(this as Node); Records = new MoveRecords(onUndoRecordCallback: (newNode, oldNode, newPos, oldPos) => { GD.Print("Undo: ", newNode, "->", oldNode, ":", newPos, "->", oldPos); ChessPiece newPiece = newNode as ChessPiece; ChessPiece oldPiece = oldNode as ChessPiece; Board.MoveNode(oldPos, newPos); if (newPiece != null) { Board.InsertNode(newPiece, newPos); } // if (oldPiece != null) { // Board.RemoveNode(oldPos); // } }); Board.InitChessBoard(); // this.AddChild(); } public override void _Input(InputEvent @event) { if (@event is InputEventMouseButton mouseEvent && mouseEvent.Pressed && mouseEvent.ButtonIndex == MouseButton.Left) { // HandleMouseClick(GetGlobalTransformWithCanvas().AffineInverse() * mouseButton.Position); // HandleMouseClick(GetLocalMousePosition()); ActionPos( (PosTrans.transArrToPix.AffineInverse() * GetLocalMousePosition()).Round() ); } } public void ActionPos(Vector2 clickArrPos) { if (VirtualBoard.ArrPosOutOfRange(clickArrPos)) return; GD.Print($"{clickArrPos} mouse clicked"); ChessPiece NowChess = Board.getNodeFromBoard(clickArrPos) as ChessPiece; ChessPiece SelChess = Board.getNodeFromBoard(selectedNodePos) as ChessPiece; if (Vector2.Inf.Equals(selectedNodePos)) { if (NowChess == null) { return; } NowChess.Selected(); GD.Print($"{clickArrPos} is selected"); selectedNodePos = clickArrPos; } else if (selectedNodePos == clickArrPos) { if (SelChess != null) { SelChess.DeSelected(); } GD.Print($"{selectedNodePos} is deselected"); selectedNodePos = Vector2.Inf; } else { GD.Print($"{selectedNodePos} move to {clickArrPos}"); if (SelChess != null) { SelChess.DeSelected(); GD.Print($"{selectedNodePos} is deselected"); } Node NowNode; if (NowChess != null) { GD.Print("nowchess", NowChess); NowNode = NowChess.Duplicate(); Board.RemoveNode(clickArrPos); } else { NowNode = NowChess as Node; } Records.AddRecord(NowNode, SelChess, clickArrPos, selectedNodePos); Board.MoveNode(clickArrPos, selectedNodePos); selectedNodePos = Vector2.Inf; // GD.Print($"End: {selectedNodePos} {SelChess} move to {clickArrPos} {NowChess}"); } } public void undo() { Records.Undo(); } public void redo() { Records.Clear(); Board.Clear(); selectedNodePos = Vector2.Inf; Board.InitChessBoard(); } private void HandleMouseClick(Vector2 clickPosition) { // 如果有棋子被选中,则进行后续操作 // if (nowSelectedChess == null) { // seletedNode = null; // } else if (nowSelectedChess != null && seletedNode != null) { // if (seletedNode is ChessPiece chessPiece) MoveChess(arrayPos, chessPiece.arrPos); // } } }