创建国际象棋的GUI WPF

首先:道歉,如果这是一个重复的职位。 事情变得有点混乱,因为我正在尝试发布/注册在同一时间。

我开始调查,从一个简单的WPF窗口中运行UCI国际象棋引擎,得到了具有国际象棋引擎运转ONF不同的线程接口的窍门,并创建了一个合理的servcieable基于文本的前端。

我得到更宏大一点,现在,想入手建设有棋子就可以了,这将养活玩家的移动到国际象棋引擎,代表了发动机的举动在板上还有一个图形用户界面。 我的目标可拖动的作品,而不是点击方块。

我现在的尝试涉及使用拖动用户控件的<canvas>元素的作品。 我会很有兴趣听听其他更有经验的WPF / .NET程序员将接近这一点,因为我并不完全相信我在正确的轨道上。

例如:会是更好地使用一个统一的网格,拖动子元素之间的数据块? 我应该创建哪件如棋子可以得出一个抽象的“棋子”级? 类似的事情。

有什么想法吗? 这不是一个家庭作业或任何东西,只是一些我noodling围绕在我的课余时间练习。

--------------解决方案-------------

我实现了一个国际象棋棋盘为我的Silverlight在线国际象棋系统。

这里是我做到了。

  1. 我为国际象棋棋盘一个单独的用户控件
  2. 我加了一个网格8×8到控制
  3. 我再补充64边框阴影每一个不同的颜色(黑方块和光明广场)确保命名每一个。 每个边界置于使用Grid.Row和Grid.Col属性的网格。
  4. 在每个边境我增加了一个图片,将持有的棋子的图像。
  5. 你将不得不代码周围的图像设置为根据您当前的游戏状态正确的棋子一些方法。
  6. 每个图像接收同一事件(这很重要),所有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也是我自己的变量记录,当用户开始draging片。

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转换的像素移动到我觉得片移动在8×8棋盘。 例如说,我搬到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;

}

如果您有任何问题,请随时与我联系。

分类:WPF 时间:2015-03-15 人气:4
本文关键词: 用户界面,WPF,棋牌
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.227 (s). 10 q(s)