中国象棋游戏开发实战(C#)【四】

rufengit 2017-08-02 06:53:53
2、绘制棋子
棋盘有了,接下来就该画棋子了。我们知道,中国象棋总共有32个棋子、分红黑双方,每个棋子都有不同的名称、不同的位置、不同的颜色、不同的走法、不同的吃子规则。因此,定义棋子类ChessPiece,该类有若干属性及方法。
其中,定义一个Draw方法,原型如下。
    /// <summary>
/// 绘制自身
/// </summary>
/// <param name="g">Graphics对象</param>
public void Draw(Graphics g)
{
}

这个Draw方法如何实现呢?首先画一个圆形,贴上一张背景图,代码如下。至于背景图大家可以随便找一个,自己觉得漂亮就行。
  g.DrawImage(new Bitmap(global::wChess.Properties.Resources.piece), Left,
Top,
ChessBoard.sW,
ChessBoard.sH);

然后在圆形背景图上面写字,代码如下:
   Font font = new Font("楷体", 25);
var fontSize = g.MeasureString(Name, font);
g.DrawString(Name, font, FontBrush, CenterX - fontSize.Width / 2, CenterY - fontSize.Height / 2 + 5);

这样就把棋子画在画布上了,简单吧?细心的朋友估计肯定会发现上面两段代码中有Left、Top、CenterX、CenterY等没见过的东东,这些正是我们接下来要说明的内容。
棋子其实有两种坐标,一个是像素坐标,即该棋子在棋盘画布上的像素位置;另一个是索引坐标,代表该棋子在棋盘里每个小格子组成的二维矩阵中的索引位置。例如图8中,假设棋盘每一个小格子的宽和高都为10像素,同时忽略线条的宽度,则A点的像素坐标为(20,10),它的索引坐标为(2,1)。

棋子类需要有三个代表坐标的属性FixedMetaPosition、OldMetaPosition、FloatMetaPosition,其中FixedMetaPosition表示棋子落地后的位置,OldMetaPosition代表该棋子在走棋之前的上一个位置,FloatMetaPosition代表该棋子移动过程中未放下状态的位置。我们在把棋子绘制到棋盘上的时候,位置信息用的就是FloatMetaPosition。
这些坐标信息都有什么作用呢?棋子不是只需要一个坐标就行了么?从表面上看,棋子确实只需要一个位置信息就可以了,但具体到中国象棋程序中,由于需要给玩家提供悔棋功能,所以每一个棋子都需要记录自己在走棋之前的上一步位置,即OldMetaPosition;为了给玩家提供友好的用户体验,当用鼠标拖动棋子时,该棋子要跟随鼠标移动,在移动状态下的临时位置,就是FloatMetaPosition;而FixedMetaPosition则代表棋子落地后的确定位置。
刚才出现的Left、Top、CenterX、CenterY这几个属性,定义如下,分别代表该棋子所在圆形的外切矩形的左上角坐标和中心点坐标,用于绘制该棋子自身。
  private float Left
{
get
{
return (ChessBoard.LINE_WEIGHT + ChessBoard.sW) * FloatMetaPosition.X + ChessBoard.LINE_WEIGHT / 2;
}
}

private float Top
{

get
{
return (ChessBoard.LINE_WEIGHT + ChessBoard.sH) * FloatMetaPosition.Y + ChessBoard.LINE_WEIGHT / 2;
}
}

private float CenterX
{
get
{
return Left + ChessBoard.sW / 2;
}
}
private float CenterY
{
get
{
return Top + ChessBoard.sH / 2;
}
}

大家想想,棋子除了这些坐标信息,还需要有哪些属性?对了,还要有名称(Name)、是红棋还是黑棋(Team)、该棋子是棋盘上边一方还是下边一方(Side)等属性。其中,Team和Side为枚举类型,定义如下:
 /// <summary>
/// 红黑方枚举
/// </summary>
public enum TEAM
{
RED,
BLACK
}
/// <summary>
/// 该棋子是棋盘上边的一方,还是下边的一方
/// </summary>
public enum SIDE
{
UP,
DOWN
}

有了以上的这些基础,现在我们已经可以在棋盘上绘制出某个棋子了,有成就感吧?
...全文
395 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
江湖评谈 2017-08-02
  • 打赏
  • 举报
回复
你搞这个有啥用?网络伤下载的一堆

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧