feat(重构): 重构棋盘和棋子的逻辑
- 重构了 ChessBoard 和 ChessPiece 类的逻辑 - 添加了新版本的 ChineseChess 库 - 删除了旧版本的 VirtualBoard 和 VirtualPiece 类 - 更新了相关的场景和脚本
This commit is contained in:
@ -1,38 +1,60 @@
|
||||
// Chessboard.cs
|
||||
using System;
|
||||
using Godot;
|
||||
using ChineseChess;
|
||||
using Godot.Collections;
|
||||
|
||||
public partial class ChessBoard : Node2D {
|
||||
public event EventHandler<Vector2> OnMouseClicked;
|
||||
public event EventHandler<Vector2> OnPosClicked;
|
||||
|
||||
public Vector2 from = Vector2.Inf, to = Vector2.Inf;
|
||||
public Array<Vector2> canMovePos = new();
|
||||
|
||||
public override void _Ready() {
|
||||
}
|
||||
|
||||
public void LoadBoard(VirtualBoard board) {
|
||||
public void Clear() {
|
||||
from = to = Vector2.Inf;
|
||||
QueueRedraw();
|
||||
}
|
||||
|
||||
public void LoadBoard(CCBoard board) {
|
||||
board.OnRemove += (sender, piece) => {
|
||||
if (piece.data != null) {
|
||||
RemoveChild(piece.data as Node);
|
||||
if (piece?.Data.TryGetValue("Godot", out object node) ?? false) {
|
||||
RemoveChild(node as Node);
|
||||
}
|
||||
};
|
||||
|
||||
board.OnInsert += (sender, piece) => {
|
||||
if (piece.data != null && piece.data is Node) {
|
||||
AddChild(piece.data as Node);
|
||||
ChessPiece chessPiece = null;
|
||||
if (piece.Data.TryGetValue("Godot", out object node)) {
|
||||
chessPiece = node as ChessPiece;
|
||||
} else {
|
||||
ChessPiece chessPiece = new(piece.name, piece);
|
||||
|
||||
if (piece.Pos().Y >= 5) {
|
||||
chessPiece.LabelColor = new Color("red");
|
||||
} else {
|
||||
chessPiece.LabelColor = new Color("black");
|
||||
}
|
||||
AddChild(chessPiece);
|
||||
chessPiece = new((CCPiece)piece);
|
||||
}
|
||||
chessPiece.ShowBehindParent = true;
|
||||
AddChild(chessPiece);
|
||||
};
|
||||
|
||||
board.OnMove += (sender, vals) => {
|
||||
from = PosTrans.transArrToPix * new Vector2(vals.From.X, vals.From.Y);
|
||||
to = PosTrans.transArrToPix * new Vector2(vals.To.X, vals.To.Y);
|
||||
QueueRedraw();
|
||||
};
|
||||
}
|
||||
|
||||
public override void _Input(InputEvent @event) {
|
||||
|
||||
public override void _Draw() {
|
||||
Color color = new(0.7f, 0.7f, 0.7f, 0.5f);
|
||||
DrawLine(from, to, color, PosTrans.pixGripSize / 5);
|
||||
DrawCircle(from, PosTrans.pixGripSize / 2.2f, color);
|
||||
foreach (Vector2 pos in canMovePos) {
|
||||
DrawCircle(pos, PosTrans.pixGripSize / 2.2f,
|
||||
color.Inverted());
|
||||
}
|
||||
}
|
||||
|
||||
public override void _Input(InputEvent @event) {
|
||||
if (@event is InputEventMouseButton mouseEvent &&
|
||||
mouseEvent.Pressed &&
|
||||
mouseEvent.ButtonIndex == MouseButton.Left) {
|
||||
@ -41,4 +63,13 @@ public partial class ChessBoard : Node2D {
|
||||
GetLocalMousePosition()).Round());
|
||||
}
|
||||
}
|
||||
|
||||
public static class PosTrans {
|
||||
public static readonly int pixGripSize = 32;
|
||||
public static readonly Transform2D transArrToPix = new(
|
||||
new Vector2(pixGripSize, 0),
|
||||
new Vector2(0, pixGripSize),
|
||||
new Vector2(-4, -4.5f) * pixGripSize
|
||||
);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user