Silverlight游戏设计(Game Design):(十三)帝国时代II(Demo)之“战争艺 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

帝国时代是一部阐述世界战争发展史的游戏巨著,讲究还原真实的历史战争场景,其中的阵型系统为 游戏的极大亮点之一;玩家根据兵种的不同搭配上最合适的阵型时常能起到逆转乾坤的神效,经典的如前 枪,中骑,后投石,强大的阵型加上玩家精确的微操能瞬间扫荡大规模敌军而毫发不伤,

Silverlight游戏设计(Game Design):(十三)帝国时代II(Demo)之“战争艺

。阵型系统不仅仅 存在于即时战略游戏中,在《三国志》、《信长野望》等SLG策略游戏中,其同样是一者永远不可缺少的 重要机制。

本节,我将在上一节搭建的《帝国时代》Demo的基础上引入比原著更加灵活多变的自定义阵型系统, 以让战争游戏更显真实与华丽。

自定义阵型系统的灵感来源于国际象棋,阵型好比“棋盘”,作战单位好比“棋子”;因此从结构出 发,我选择使用Grid作为构建阵型系统的最底层载体,通过指定Row和Column即可随意布局棋子到指定方 格内:

在本节Demo中,我将“棋盘”摆放在HUD的中下方,并限制其为一个4*12最大容纳48单位的表格型载体 。

有了“棋盘”,当然还少不了“棋子”。“棋子”是一个图标,于是我创建一个名为Piece的类,该类 包含一个图片控件和一个矩形方块控件(血条):

上图为骑兵对应的“棋子”图标。接下来要实现自定义的棋子布局,我们还需为这些棋子增加座位交 互功能:即点击其中一个棋子后,该棋子为选中状态,并与接下来点击的位置或另一个棋子进行位置交换 ,代码很简单,大致如下:

Piece hitPiece = null; //点击的棋子
         /// 


         /// 单位位置更换
         /// 

         private void img_MouseLeftButtonDown(object sender,  MouseButtonEventArgs e) {
             if (hitPiece == null && (int)((sender as  Piece).Code) != -1) {
                 hitPiece = sender as Piece;
                 hitPiece.Effect = new DropShadowEffect() {  BlurRadius = 8, ShadowDepth = 0, Color = Colors.Red };
             } else if (hitPiece != null) {
                 int ldRow = Grid.GetRow(hitPiece);
                 int ldColumn = Grid.GetColumn(hitPiece);
                 Piece piece = sender as Piece;
                 int newRow = Grid.GetRow(piece);
                 int newColumn = Grid.GetColumn(piece);
                 Grid.SetRow(piece, oldRow);
                 Grid.SetColumn(piece, oldColumn);
                 Grid.SetRow(hitPiece, newRow);
                 Grid.SetColumn(hitPiece, newColumn);
                 hitPiece.Effect = null;
                 hitPiece = null;
             }
             e.Handled = true;
         }

“棋盘” 和“棋子”功能完成后,我们最后要做的仅仅是将这套布局应用到游戏中的作战单位上,

电脑资料

Silverlight游戏设计(Game Design):(十三)帝国时代II(Demo)之“战争艺》(https://www.unjs.com)。上一 节中讲解了如何对单位进行范围选取,每次选取后“棋盘”中所显示的即为选择的单位们所对 应的“棋子”,这里我通过一个DispatcherTimer每间隔1秒钟刷新一次“棋盘”中 所有“棋子”的血条值;当然,这或许并非最好的解决方案,但却是一则通用且简单高效的实 现方式之一:

查看原图(大图)

阵型系统的最终实现即是对所选取的作战单位按排列好的布局图进行走位,Grid作为棋盘的优越性及 简易性也将从中得以体现,实现起来代码就更简单了:

……
Point p  = e.GetPosition(mainScene.Container);
//单个精确移动,多个则按阵型移动
if (mainScene.SelectedArmy.Count == 1) {
     mainScene.SelectedArmy [0].MoveTo(p);
} else {
    for (int i = 0; i <  facePlate.formation.Children.Count; i++) {
         Piece piece =  facePlate.formation.Children[i] as Piece;
         if (piece.Code != -1)  {
             int row = Grid.GetRow(piece);
              int column = Grid.GetColumn(piece);
              piece.CorrespondingSprite.Enemy = null;
              piece.CorrespondingSprite.MoveTo(new Point(p.X + column * pieceSpace, p.Y + row *  pieceSpace));
          }
     }
}
……

自定义阵型是阵型系统中的最高级别,实际游戏开发中,根据需要将“棋盘”定义为相应规格尺寸的 Grid后,即可衍生出更加丰富多变的固定或非固定阵型,不仅大幅度增加游戏的趣味性与战略性,同时也 是设计师们对游戏艺术的不屑追求。

以上为随意排列出的一些经典阵型,不禁让我再次重温了一遍从小陪伴我长大的三国志系列。当然了 ,实际中您可以根据兵种的近、远距离攻击属性及移动速度、相生相克等因素布局出更适合不同战役的阵 型。战斗,胜败的关键在策略,而阵型就是其核心之一,这就是战争艺术。 

在线演示地址:http://silverfuture.cn

本文配套源码

说明:源文件较大,对其进行了分割压缩。请将各分卷下载到同一文件夹,解压其中的part1或part01即可。

AoEIIDemo.part1.rar

AoEIIDemo.part2.rar

AoEIIDemo.part3.rar

最新文章