- 重构了 VirtualBoard 类,优化了棋盘操作和事件处理 - 重写了 ChessPiece 类,增加了事件处理和虚拟棋子逻辑 - 更新了 ChessGame 控制器,增加了结束回合功能和对话框 - 调整了场景布局和资源引用 - 清理了冗余代码和注释
309 lines
6.9 KiB
C#
309 lines
6.9 KiB
C#
// Chessboard.cs
|
||
using Godot;
|
||
|
||
public partial class ChessBoard : Node2D {
|
||
public VirtualBoard board = null;
|
||
public Player playerSelf = null;
|
||
|
||
public delegate bool ChessMoveFunc(Vector2 toPos, Vector2 fromPos);
|
||
public Callable chessMoveFunc { get; set; }
|
||
|
||
public override void _Ready() {
|
||
board = new VirtualBoard(9, 10);
|
||
playerSelf = new Player(board);
|
||
board.OnRemove += OnRemove;
|
||
board.OnInsert += OnInsert;
|
||
board.OnMove += OnMove;
|
||
InitChessBoard();
|
||
}
|
||
|
||
public override void _Input(InputEvent @event) {
|
||
if (@event is InputEventMouseButton mouseEvent &&
|
||
mouseEvent.Pressed &&
|
||
mouseEvent.ButtonIndex == MouseButton.Left) {
|
||
// HandleMouseClick(GetGlobalTransformWithCanvas().AffineInverse() * mouseButton.Position);
|
||
HandleMouseClick(GetLocalMousePosition());
|
||
}
|
||
}
|
||
|
||
private void HandleMouseClick(Vector2 clickPosition) {
|
||
Vector2 clickBoardPos = (PosTrans.transArrToPix.AffineInverse() *
|
||
clickPosition).Round();
|
||
|
||
playerSelf.HandleBoardPosClick(clickBoardPos);
|
||
}
|
||
|
||
void OnMove(Vector2 from, Vector2 to) {
|
||
chessMoveFunc.Call(to, from);
|
||
}
|
||
|
||
void OnRemove(VirtualPiece piece) {
|
||
// (piece.data as Node).QueueFree();
|
||
if (piece?.data != null)
|
||
RemoveChild(piece.data as Node);
|
||
}
|
||
|
||
void OnInsert(VirtualPiece piece) {
|
||
ChessPiece chess = piece.data as ChessPiece;
|
||
AddChild(chess);
|
||
}
|
||
|
||
public void InsertNode(ChessPiece node, Vector2 arrayPos) {
|
||
AddChild(node);
|
||
VirtualPiece piece = node.GetVirtualPiece();
|
||
// piece.Move(vector);
|
||
board.SetPiecePos(piece, arrayPos);
|
||
}
|
||
|
||
|
||
// using Godot;
|
||
|
||
// public enum ChessType
|
||
// {
|
||
// Carriage,
|
||
// Horse,
|
||
// Elephant,
|
||
// Advisor,
|
||
// General,
|
||
// Cannon,
|
||
// Pawn
|
||
// }
|
||
|
||
// public class VirtualBoard
|
||
// {
|
||
// // ...其他原有成员变量...
|
||
|
||
// public VirtualBoard(Node root = null)
|
||
// {
|
||
// BoardRoot = root ?? GetTree().CurrentScene; // 如果未提供root,默认为当前场景
|
||
// }
|
||
|
||
// public void InitChessBoard()
|
||
// {
|
||
// // 定义黑色和红色棋子的初始位置和类型
|
||
// var positions = new (Vector2 position, ChessType type)[]
|
||
// {
|
||
// // 黑方棋子初始化...
|
||
// // 示例省略具体位置和类型,你需要根据实际情况填写
|
||
// // (new Vector2(x, y), ChessType.Pawn),
|
||
|
||
// // 红方棋子初始化...
|
||
// // 同上
|
||
// };
|
||
|
||
// // 初始化棋子
|
||
// foreach (var (position, type) in positions)
|
||
// {
|
||
// var color = position.Y == 0 ? new Color("black") : new Color("red"); // 根据行判断颜色
|
||
// var piece = CreateChessPiece(type, color);
|
||
// InsertChess(piece, position);
|
||
// }
|
||
// }
|
||
|
||
// private ChessPiece CreateChessPiece(ChessType type, Color labelColor)
|
||
// {
|
||
// // 根据ChessType创建对应的棋子实例并设置Label和颜色
|
||
// // 这里需要你实现具体的逻辑,例如switch case或映射表来决定创建哪种棋子
|
||
// // 返回创建的棋子实例
|
||
// }
|
||
|
||
// // ...其他原有方法...
|
||
// }
|
||
|
||
public void InitChessBoard() {
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "车",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(0, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "马",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(1, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "象",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(2, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "士",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(3, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "将",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(4, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "士",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(5, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "象",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(6, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "马",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(7, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "车",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(8, 0));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "炮",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(1, 2));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "炮",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(7, 2));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(0, 3));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(2, 3));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(4, 3));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(6, 3));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("black"),
|
||
}, new Vector2(8, 3));
|
||
|
||
// -----------------------------------
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "车",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(0, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "马",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(1, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "象",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(2, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "士",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(3, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "将",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(4, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "士",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(5, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "象",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(6, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "马",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(7, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "车",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(8, 9));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "炮",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(1, 7));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "炮",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(7, 7));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(0, 6));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(2, 6));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(4, 6));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(6, 6));
|
||
|
||
InsertNode(new ChessPiece
|
||
{
|
||
PieceLabel = "卒",
|
||
LabelColor = new Color("red"),
|
||
}, new Vector2(8, 6));
|
||
}
|
||
}
|