我已经为我的 Silverlight Online Chess系统实现了一个棋盘。
这是我的做法。
- 我为棋盘做了一个单独的用户控制
- 我在控件上添加了一个 8x8 网格
- 然后我添加了 64 个边框,每个边框都使用不同的颜色(深色方块和浅色方块)确保为每个边框命名。每个边框都使用 Grid.Row 和 Grid.Col 属性放置在网格上。
- 在每个边界内,我添加了一个保存棋子图像的图像。
- 您将不得不编写一些方法来根据您当前的游戏状态将图像设置为正确的棋子。
每个图像都收到相同的事件(这很重要),所有 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 个像素,而棋盘方格仅比我移动 2 个棋盘方格的 50 像素。
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;
}
如果您有任何问题,请随时与我联系。