除战斗范围设定外,说到SLG中最有趣而经典的算法莫过于角色可移动范围的测算与寻路。当前成熟的SLG商业游戏中,以《火焰纹章》、《高级大战争》等系列新作为代表,它们在传统的基础上将可移动范围进行了拓展,组合上攻击范围并配合移动指向路径箭头,使得整场战局每个“棋子”的操控感受和趣味性都无与伦比。
SLG角色移动从程序设计的角度可大致分为3个步骤:
1)呈现可移动路径范围
2)确定移动目的地单元格
3)沿着路径移动到目的地
以四向为基础的Silverlight 2D SLG游戏,我们首先想到的当然是采用四叉树遍历算法来实现其中的角色可移动路径范围测算。
不要被它的行头所吓到,其实它只是一种很简单的四向延展循环遍历,我们不妨先来看下图:
每个角色以其所处的格子(坐标)为中心,第一步可移动的格子只有:北、东、南、西;那么要测算其可移动范围,首先得分析周围这4个格子角色是否可以移动到,其中判断的依据有地形矩阵边界、机动力极限(或四叉树深度)以及地形机动力消耗等元素;如果判断为可行,则将此格子进行标记(存储进可移动范围List<Point>表中);接下来再以同样的步骤,分别以这些被标记过的格子为中心,继续四向延伸遍历 (以减去当前单元格机动力消耗为基础);额外的,此时除了判断是否可以移动外,还需判断子节点是否有效(List中是否存在重复,Path是否回头等逻辑)。于是,最终我们可以得出类似如下算法:
///<summary>
///显示可移动范围路径
///</summary>
publicvoidShowPathRange(Spritesprite){
sprite.PathRange.Clear();
ClearAllRange();
Dictionary<Point2D,int>rangeList=newDictionary<Point2D,int>();
Dictionary<Point2D,int>tempList=newDictionary<Point2D,int>();
Point2Dcenter=newPoint2D((int)sprite.Coordinate.X,(int)sprite.Coordinate.Y);
rangeList.Add(center,0);
tempList.Add(center,0);
intcountPoint=0;
while(countPoint<sprite.Mov){
tempList=RangeScan(tempList,rangeList,sprite.Mov);
countPoint++;
}
//绘制所有格子
for(inti=0;i<rangeList.Count;i++){
Pointp=rangeList.ElementAt(i).Key.ToPoint();
sprite.PathRange.Add(p);
EntityObjectbox=newEntityObject(){
Source=GetImage("MoveBox.png"),
Position=GetPositionFromCoordinate(p),
};
pathRangeSystem.Children.Add(box);
MouseButtonEventHandlerhandler=null;
box.MouseLeftButtonDown+=handler=delegate{
box.MouseLeftButtonDown-=handler;
sprite.MoveTo(p,Matrix);
};
}
}
///<summary>
///四叉树遍历扫描
///</summary>
Dictionary<Point2D,int>RangeScan(Dictionary<Point2D,int>tempList,Dictionary<Point2D,int>rangeList,intmoveLimit){
Dictionary<Point2D,int>result=newDictionary<Point2D,int>();
for(inti=0;i<tempList.Count;i++){
KeyValuePair<Point2D,int>kvp=tempList.ElementAt(i);
DirectionScan(newPoint2D(kvp.Key.X,kvp.Key.Y-1),kvp.Value,result,rangeList,moveLimit);//北
DirectionScan(newPoint2D(kvp.Key.X+1,kvp.Key.Y),kvp.Value,result,rangeList,moveLimit);//东
DirectionScan(newPoint2D(kvp.Key.X,kvp.Key.Y+1),kvp.Value,result,rangeList,moveLimit);//南
DirectionScan(newPoint2D(kvp.Key.X-1,kvp.Key.Y),kvp.Value,result,rangeList,moveLimit);//西
}
returnresult;
}
///<summary>
///基于方向的扫描
///</summary>
voidDirectionScan(Point2Ddirection,intmatrix,Dictionary<Point2D,int>tempList,Dictionary<Point2D,int>range,intmoveLimit){
if(!range.ContainsKey(direction)&&IsEffectivelyCoordinate(direction)&&Matrix[direction.X,direction.Y]!=0){
intvalue=matrix+Matrix[direction.X,direction.Y];
if(value<=moveLimit){
tempList.Add(direction,value);
range.Add(direction,value);
}
}
}
///<summary>
///坐标是否有效
///</summary>
boolIsEffectivelyCoordinate(Point2Dp){
returnp.X>=0&&p.Y>=0&&p.X<dimension&&p.Y<dimension?true:false;
}
顺便说明一下,SLG地形设计千变万化,本节中我仅仅设置了5种地形:障碍(无法通行)、平原/草地(机动力消耗1)、森林/丘陵 (机动力消耗2)、沙漠/沼泽(机动力消耗3)、山地(机动力消耗4)、河流(机动力消耗5)等,其枚举如下(对应的枚举值也是该地形的机动力消耗,当然实际情况要比这复杂,比如不同地形相同机动力消耗等):
///<summary>
///地形类型
///</summary>
publicenumTerrainTypes{
///<summary>
///障碍
///</summary>
Obstacle=0,
///<summary>
///平地
///</summary>
Ground=1,
///<summary>
///森林
///</summary>
Forest=2,
///<summary>
///沙漠
///</summary>
Desert=3,
///<summary>
///雪地
///</summary>
Snow=4,
}
当我们计算并呈现完角色可移动范围后,接下来玩家便需要指挥角色向目标位置移动,人工智能A*算法又一次的派上了用场;Silverlight中我们可以通过创建Storyboard关键帧动画的简单形式配合上A*算法得到的Path路径点轻松实现非对角线式的角色寻路移动(其中的A*代码为国外高人编写,可参考我曾写过的一篇文章,本文就不再班门弄斧了)。:
关键帧动画A*寻路移动
这是一款基于Silverlight的SLG游戏引擎的一部分,在线演示Demo 如下(点击下载该Demo源码),大家不妨刷刷怪和地形,然后移动角色试试,非常有趣:
手记感悟:回想之前曾写过的一个三国策的SLG Demo,为了省事,当时写的移动范围算法其实是错误的;大量测试证明,SLG中的移动范围不能使用A*寻路算法替代,虽然看上去似乎减少了工作量,但实际操作过程中你会发现对可及范围所有格子都使用一次A*算法极其消耗性能;另外,就目前我所用到的A*算法来说,根本就无法正确显示角色的可移动范围(由于A*算法原理所致),要么漏掉几格,要么多出几格,越是复杂且障碍物无规律的地形表现越突出。
手记小结:通过四叉树遍历算法可以很有趣的将SLG游戏角色可移动范围形象化、直观化,此算法的实现和优化无止尽,仁者见仁智者见智,期待您更优秀的实现,让思维的创新来得更猛烈些吧!
分享到:
相关推荐
vstemplate文件引用的向导类"Microsoft.Xna.GameStudio.Wizards.MultiProjectWizard"在程序集"Microsoft.Xna.GameStudio,Version=4.0.0.0,Culture=naeutral,PublicKeyToken=6d5c3888ef60e27d"中不存在。 那么将这个...
Windows Phone提供了两种不同的用户界面编程模型:Silverlight 和 XNA。Silverlight是最常用的应用程序开发方式,应用程序可以使用控件、显示很多数据。XNA是2D和3D游戏开发方式。当年您也可以使用Silverlight来写...
该框架的目标是使XNA可以更容易地开发跨平台游戏,并且可以进行代码的高效复用。一次编写,随处运行 MonoGame目前支持iOS,Android,Windows(包括OpenGL和DirectX),Mac OS X,Linux,Windows 8 Store,Windows ...
游戏详细连接: http://hi.baidu.com/linrao/blog/item/51bfef839c257e86f603a680.html 1、版本:1.0 beta版 2、待实现: 1)装备系统 2)技能系统 3)声音系统 4)网络通讯(这部分就大了,因为有计划写...
Building.XNA.2.0.Games.A.Practical.for.Independent.Game.Development 英文版 pdf
Direct.3D和XNA游戏开发基础(C#语言版)
Wiley.XNA.3D.Primer(含源码)
基于 PC,Xbox 360 和 Windows Phone 的游戏开发.想为Xbox360和Windows Phone 7开发游戏吗?通过这本人手必备的教程,您将立马掌握使用微软XNA 4.0游戏开发
Sams.Microsoft.XNA.Game.Studio.3.0.Unleashed.pdf
内含两本电子书: Professional.XNA.Game.Programming.chm Professional.XNA.Game.Programming简体中文版.chm
A fast-paced, hands-on guide to building a 3D game for the Windows Phone 7 platform using XNA 4.0 Overview Building a 3D game for the Windows Phone 7 platform. Drawing 2D and 3D graphics on Windows ...
Sams.Microsoft.XNA.Game.Studio.3.0.Unleashed.Feb.2009.rar
一款C# XNA框架下自己以前写的游戏 由于是第一次写游戏 可能代码比较不规范 但是适合游戏初学者借鉴 游戏很精简 但是类很多 面向对象设计可借鉴
Packt.Windows.Phone.7.XNA.Cookbook.2012
采用VS2008,C#语言,利用XNA游戏框架开发的小游戏
MS.Press.Microsoft.XNA.Game.Studio.4.0.Learn.Programming.Now
This book is a step-by-step tutorial that includes complete source code for all of the games covered. It adopts an engaging style to teach all the game development concepts. Each block of code is ...
Course.Technology.XNA.Game.Studio.4.0.for.Xbox.360.Developers
Teach yourself how to build rich Internet applications with Silverlight 4--one step at a time. With this practical, learn-by-doing tutorial, you'll learn how to create interactive user interfaces for ...
Beginning.XNA.2.0.Game.Programming