帝国时代是一部阐述世界战争发展史的游戏巨著,讲究还原真实的历史战争场景,其中的阵型系统为游戏的极大亮点之一;玩家根据兵种的不同搭配上最合适的阵型时常能起到逆转乾坤的神效,经典的如前枪,中骑,后投石,强大的阵型加上玩家精确的微操能瞬间扫荡大规模敌军而毫发不伤。阵型系统不仅仅存在于即时战略游戏中,在《三国志》、《信长野望》等SLG策略游戏中,其同样是一者永远不可缺少的重要机制。

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

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

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

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

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

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

        /// <summary>

        /// 单位位置更换

        /// </summary>

        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 oldRow = Grid.GetRow(hitPiece);

                int oldColumn = 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;

        }

“棋盘”和“棋子”功能完成后,我们最后要做的仅仅是将这套布局应用到游戏中的作战单位上。上一节中讲解了如何对单位进行范围选取,每次选取后“棋盘”中所显示的即为选择的单位们所对应的“棋子”,这里我通过一个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

WPF/Silverlight
作者:深蓝色右手
出处:http://alamiye010.cnblogs.com/
教程目录及源码下载:点击进入(欢迎加入WPF/Silverlight小组 WPF/Silverlight博客团队)
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。
posted on 2010-05-17 16:33  深蓝色右手  阅读(7712)  评论(24编辑  收藏  举报