棋盘上有棋子,棋子应该还有一些属性,按原始冲动新建一个棋子类。
上google翻译下棋子E文叫什么,查到了叫Chessman,于是对着项目右键添加一个Chessman.cs
///
<summary>
///
棋子类 by 路过秋天
乱七八糟:
想了想,要画棋子还是找图片好,图片也不是不好找,网上一搜还是有的,只是图片啊,算了,还是画棋子了,反正棋盘也是画出来的。于是想了想怎么画,先画一个圆圈,里面再画一个字。圆圈好说了,有个Ellipse类,设一下属性就得了。画字,于是又朝GDI+的方向想了,找什么DrawString,飞了半天也找不到方向,没办法,最后尘埃落定到了TextBlock上了。
这棋子都要有什么了,想了想,基本上得有的就是:
Name,有个名字,叫“兵”,“炮”,之类的名字
Color,不是红就是黑色了
Radius,棋子半径,这棋子总有个大小。
InitPoint,棋子的坐标位置
MovePoint,棋子总得会移动,移动后的位置。
好了,在类里敲入“prop"按两下Tab键,写好类型,按下Tab,起好名称,回车,一个属性就写完了,继续重复,于是有了以下代码:
///
<summary>
///
棋子类
///
</summary>
public
class
Chessman
{
///
<summary>
///
棋子名称
///
</summary>
public
string
Name
{
get
;
set
;
}
///
<summary>
///
棋子颜色
///
</summary>
public
Color Color
{
get
;
set
;
}
///
<summary>
///
棋子半径
///
</summary>
public
double
Radius
{
get
;
set
;
}
///
<summary>
///
棋子数组坐标
///
</summary>
public
Point InitPoint
{
get
;
set
;
}
///
<summary>
///
移动后数组坐标
///
</summary>
public
Point MovePoint
{
get
;
set
;
}
}
我们再加个构造函数初始化一下属性的数据
public
Chessman(
double
x,
double
y,
double
radius, Color color,
string
name)
{
InitPoint
=
new
Point(x, y);
MovePoint
=
InitPoint;
Radius
=
radius;
Color
=
color;
Name
=
name;
}
好啦,我们要画棋子了
参考下棋盘的画法,我们新增加了两个函数,一个Panel容器是要的了。DrawIn用于外部调用了。
代码
Panel container;
public
void
DrawIn(Panel control)
{
container
=
control;
Draw();
}
private
void
Draw()
{
//
这里实现画啦
}
怎么画怎么画,急啦啦。
想啦想,要画一个圈,又要画一个字,这两个还得组合成一个。于是新建一个Canvas,再把两个放到Canvas里面。这样把Canvas当成棋子。因为棋子迟早是要移动的,你不能只移动个圆圈,或移动一个字吧。
好了,看下圆圈的代码,基本就是赋些属性了事了:
Ellipse elp
=
new
Ellipse()
{
Width
=
Radius
*
2
,
Height
=
Radius
*
2
,
Stroke
=
new
SolidColorBrush(Color),
Fill
=
new
SolidColorBrush(Color),
Opacity
=
15
};
好了,再看下文字的代码,又是赋了一堆属性值了事,那个margin值还真不好调的呢,对的不是很齐,将就点了:
TextBlock text
=
new
TextBlock()
{
TextAlignment
=
TextAlignment.Center,
Foreground
=
new
SolidColorBrush(Colors.White),
Text
=
Name,
FontFamily
=
new
FontFamily(
"
宋体
"
),
FontSize
=
Radius,
FontWeight
=
FontWeights.Bold,
Margin
=
new
Thickness(Radius
/
2
-
2
, Radius
/
2
-
2
,
0
,
0
)
};
接下来要New一个Canvas,把它俩加进去,最后把棋子放到容器Panel里
chessman
=
new
Canvas();
chessman.Children.Add(elp);
chessman.Children.Add(text);
container.Children.Add(chessman);
chessman 的前面咋没有Canvas,是写少了?不是了,这里是把它定义到外面去了,后面应该会用到。
public Canvas chessman;//棋子,这个定义在外面了。
到此,棋子类就差不多了,不过目前少了两个重点。
1。就是棋子的位置,棋子的位置可以通过Margin属性来调整,但目前我们先不写,因为要把原始坐标转成象素坐标,
单独的棋子类没法完成这种事,所以留着,待下一篇我们新增加一个Chess象棋类来控制。
2。就是棋子被点击的事件,下棋你总要先选中棋子的,不选中你就下不了。
这两个重点我们留到下节再补。
我们到上篇New Board的地方下面再New Chessman一个棋子,看看效果。
在Silverlight应用程序的界面代码:
public
partial
class
MainPage : UserControl
{
public
MainPage()
{
InitializeComponent();
Board board
=
new
Board();
board.DrawIn(canvas1);
Chessman chessman
=
new
Chessman(
0
,
0
,
15
, Colors.Red,
"
车
"
);
chessman.DrawIn(canvas1);
}
}
运行,看效果图,一个棋子就出来了:
好了,打完收工。下节再完成重点棋子的位置及点击事件。