add 新增远程连接,实现多人游戏

This commit is contained in:
ZZY
2024-06-27 15:02:57 +08:00
parent d892cd6c0e
commit 9a79bef410
23 changed files with 1167 additions and 211 deletions

View File

@ -6,6 +6,10 @@ public partial class ChessBoard : Node2D {
MoveRecords Records = null;
// Called when the node enters the scene tree for the first time.
public Vector2 selectedNodePos = Vector2.Inf;
public delegate bool ChessMoveFunc(Vector2 toPos, Vector2 fromPos);
public Callable chessMoveFunc { get; set; }
public override void _Ready() {
Board = new VirtualBoard(this as Node);
Records = new MoveRecords(onUndoRecordCallback: (newNode, oldNode, newPos, oldPos) => {
@ -16,72 +20,55 @@ public partial class ChessBoard : Node2D {
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()
);
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 ActionPos(Vector2 newPos) {
}
public void undo() {
public void MoveAndRecord(Vector2 toPos, Vector2 fromPos) {
GD.Print($"{fromPos} move to {toPos}");
ChessPiece toChess = Board.GetNodeFromBoard(toPos) as ChessPiece;
ChessPiece fromChess = Board.GetNodeFromBoard(fromPos) as ChessPiece;
if (fromChess != null) {
fromChess.DeSelected();
}
Node NowNode;
if (toChess != null) {
GD.Print("nowchess", toChess);
NowNode = toChess.Duplicate();
Board.RemoveNode(toPos);
} else {
NowNode = toChess as Node;
}
Records.AddRecord(NowNode, fromChess, toPos, fromPos);
Board.MoveNode(toPos, fromPos);
selectedNodePos = Vector2.Inf;
}
public void Undo() {
Records.Undo();
}
public void redo() {
public void ReInit() {
Records.Clear();
Board.Clear();
selectedNodePos = Vector2.Inf;
@ -89,13 +76,39 @@ public partial class ChessBoard : Node2D {
}
private void HandleMouseClick(Vector2 clickPosition) {
Vector2 newPos = (PosTrans.transArrToPix.AffineInverse() *
clickPosition).Round();
// 如果有棋子被选中,则进行后续操作
// if (nowSelectedChess == null) {
// seletedNode = null;
// } else if (nowSelectedChess != null && seletedNode != null) {
// if (seletedNode is ChessPiece chessPiece) MoveChess(arrayPos, chessPiece.arrPos);
// }
if (VirtualBoard.ArrPosOutOfRange(newPos)) return;
GD.Print($"{newPos} mouse clicked");
ChessPiece NowChess = Board.GetNodeFromBoard(newPos) as ChessPiece;
ChessPiece SelChess = Board.GetNodeFromBoard(selectedNodePos) as ChessPiece;
if (Vector2.Inf.Equals(selectedNodePos)) {
if (NowChess == null) {
return;
}
NowChess.Selected();
selectedNodePos = newPos;
} else if (selectedNodePos == newPos) {
if (SelChess != null) {
SelChess.DeSelected();
}
selectedNodePos = Vector2.Inf;
} else {
if (chessMoveFunc.Delegate != null) {
GD.Print("chessMoveFunc Move: ", selectedNodePos, "->", newPos);
if ((bool)chessMoveFunc.Call(newPos, selectedNodePos)) {
MoveAndRecord(newPos, selectedNodePos);
}
} else {
GD.Print("default MoveFunc Move: ", selectedNodePos, "->", newPos);
MoveAndRecord(newPos, selectedNodePos);
}
// MoveAndRecord(newPos, selectedNodePos);
// GD.Print($"End: {selectedNodePos} {SelChess} move to {clickArrPos} {NowChess}");
}
}

View File

@ -35,6 +35,7 @@ public partial class ChessPiece : Sprite2D {
if (isSelected) {
return;
}
GD.Print($"{arrPos} is selected");
this.Transform *= transToSeleted;
this.isSelected = true;
}
@ -43,6 +44,7 @@ public partial class ChessPiece : Sprite2D {
if (!isSelected) {
return;
}
GD.Print($"{arrPos} is deselected");
this.Transform *= transToSeleted.AffineInverse();
this.isSelected = false;
}
@ -54,7 +56,7 @@ public partial class ChessPiece : Sprite2D {
private void InitLabel() {
// this.Texture.ResourcePath = "res://Asserts/ChesspieceBase.tres";
this.Texture = (Texture2D)ResourceLoader.Load("res://Asserts/ChesspieceBase.tres");
this.Texture ??= (Texture2D)ResourceLoader.Load("res://Asserts/ChesspieceBase.tres");
textureSize = this.Texture.GetSize();
Vector2 labalPosition = new(
-textureSize.X / 2,