在WPF中创建国际象棋GUI
首先:道歉,如果这是一个重复的职位。 事情有点混乱,因为我试图同时发布/注册。
我开始研究从简单的WPF窗口运行UCI国际象棋引擎,得到了让国际象棋引擎在不同线程上运行的界面,并创建了一个合理的基于服务的文本前端。
我现在变得更加野心勃勃,并且想要开始构建一个带有棋子的GUI,它将把玩家的动作提供给国际象棋引擎,并代表引擎在棋盘上的移动。 我瞄准的是可拖曳的棋子,而不是点击方块。
我目前的尝试涉及在<canvas>元素上使用可拖动的用户控件。 我真的很想知道其他更有经验的WPF / .NET程序员会如何解决这个问题,因为我并不完全确信自己正处在正确的轨道上。
例如:使用统一网格并在子元素之间拖动块数据会更好吗? 我应该创建一个抽象的“棋子”类,从中可以派生出棋子这样的棋子吗? 那种事。
有什么想法吗? 这不是一项家庭作业或任何事情,只是我闲暇时候用作练习的东西。
我为我的Silverlight在线国际象棋系统实施了一个国际象棋棋盘。
这是我如何做到的。
每个图像收到相同的事件(这很重要),所有64个图像调用相同的代码:
MouseLeftButtonDown =“Image_MouseLeftButtonDown”MouseMove =“Image_MouseMove”MouseLeftButtonUp =“Image_MouseLeftButtonUp”
这3个事件背后的想法是,我们记录当我点击图像时(MouseLeftButtonDown),它让我成为点击的起源,然后当鼠标移动时我调用该事件,这允许我更新屏幕,因为该片是移动以及我放开鼠标按钮(MouseLeftButtonUp)时记录的最后一个事件,这可以让我获取目标并将移动发送到我的国际象棋引擎。 一旦移动被国际象棋引擎录制,我只需重新画一个棋盘即可。
private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Image image = (Image)sender;
Border border = (Border)image.Parent;
image.CaptureMouse();
isMouseCapture = true;
mouseXOffset = e.GetPosition(border).X;
mouseYOffset = e.GetPosition(border).Y;
var chessPiece = (Image) sender;
var chessSquare = (Border) chessPiece.Parent;
var row = (byte) (Grid.GetRow(chessSquare));
var column = (byte) (Grid.GetColumn(chessSquare) - 1);
if (engine.HumanPlayer == ChessPieceColor.White)
{
SelectionChanged(row, column, false);
}
else
{
SelectionChanged((byte)(7 - row), (byte)(7 - column), false);
}
}
SelectionChanged是我自己记录用户选择的信号源的方法。 isMouseCapture也是我自己的变量,用于在用户开始播放时录制。
private void Image_MouseMove(object sender, MouseEventArgs e)
{
Image image = (Image)sender;
Border border = (Border)image.Parent;
if (!currentSource.Selected)
{
image.ReleaseMouseCapture();
isMouseCapture = false;
translateTransform = new TranslateTransform();
translateTransform.X = 0;
translateTransform.Y = 0;
mouseXOffset = 0;
mouseYOffset = 0;
}
if (isMouseCapture)
{
translateTransform = new TranslateTransform();
translateTransform.X = e.GetPosition(border).X - mouseXOffset;
translateTransform.Y = e.GetPosition(border).Y - mouseYOffset;
image.RenderTransform = translateTransform;
CalculateSquareSelected((int)translateTransform.X, (int)translateTransform.Y, false);
}
}
在上面的CalculareSquareSelected将像素移动到我认为棋子移动到8x8棋盘上的位置。 例如,我说我移动了100个像素,棋盘正方形只有50个像素,比我移动了2个棋盘正方形。
private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (translateTransform == null)
{
return;
}
Image image = (Image)sender;
image.ReleaseMouseCapture();
isMouseCapture = false;
if (translateTransform.X > 10 || translateTransform.Y > 10 || translateTransform.X < -10 || translateTransform.Y < -10)
{
CalculateSquareSelected((int)translateTransform.X, (int)translateTransform.Y, true);
}
translateTransform = new TranslateTransform();
translateTransform.X = 0;
translateTransform.Y = 0;
mouseXOffset = 0;
mouseYOffset = 0;
image.RenderTransform = translateTransform;
}
如果您有任何问题,请随时与我联系。
链接地址: http://www.djcxy.com/p/2429.html