103 lines
3.1 KiB
C#
103 lines
3.1 KiB
C#
// 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);
|
|
// }
|
|
}
|
|
|
|
|
|
}
|