// Chessboard.cs using System; using Godot; using ChineseChess; using Godot.Collections; using static IBoard; public partial class ChessBoard : Node2D, ICCBoardOn { public event EventHandler? OnMouseClicked; public event EventHandler? OnPosClicked; public event EventHandler? OnStepsChanged; public Vector2 from = Vector2.Inf, to = Vector2.Inf; public Array canMovePos = []; public override void _Ready() { } public void Clear() { from = to = Vector2.Inf; QueueRedraw(); } void IBoardOn.OnInsert(object self, IPiece piece) { ChessPiece? node = piece.On as ChessPiece; // throw new InvalidOperationException(); node ??= new ChessPiece((CCPiece)piece); node.ShowBehindParent = true; AddChild(node); // ChessPiece chessPiece = null; // if (piece.Data.TryGetValue("Godot", out object node)) { // chessPiece = node as ChessPiece; // } else { // chessPiece = new((CCPiece)piece); // } // chessPiece.ShowBehindParent = true; // AddChild(chessPiece); } void IBoardOn.OnRemove(object self, IPiece piece) { if (piece.On is not ChessPiece node) { throw new InvalidOperationException(); } RemoveChild(node); } void IBoardOn.OnMove(object self, IBoardOn.MoveEventArgs vals) { from = PosTrans.transArrToPix * new Vector2(vals.From.X, vals.From.Y); to = PosTrans.transArrToPix * new Vector2(vals.To.X, vals.To.Y); QueueRedraw(); } void ICCBoardOn.OnSteps(object _self, int oldSteps) { if (_self is not CCBoard self) return; OnStepsChanged?.Invoke(self, self.Steps); } 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) { OnMouseClicked?.Invoke(this, GetLocalMousePosition()); OnPosClicked?.Invoke(this, (PosTrans.transArrToPix.AffineInverse() * 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 ); } }