找回密码
 立即注册
首页 业界区 业界 Silverlight MMORPG网页游戏开发课程[一期] 第七课:场 ...

Silverlight MMORPG网页游戏开发课程[一期] 第七课:场景之地形与寻径

勺缓曜 2025-5-29 19:26:57
引言
在上一课实现场景遮挡效果的基础上如能融合相应的地形系统,那么整个场景才能算做是个有机整体。传统的2D-RPG游戏场景按视角划分可分为横向、纵向与斜向的,本节我将分别向大家介绍如何搭建基于直角坐标系及斜视角的RPG游戏场景,并在此基础上实现精灵的完美寻径功能。
7.1基于直角坐标系之场景与寻径实现 (交叉参考:传说中的A*寻径算法  完美实现A*寻径动态动画  2D游戏角色在地图上的移动  第一部分拓展小结篇  地图编辑器诞生啦!  地图编辑器的初步使用)

课程游戏中精灵坐标基于窗口像素级别,要实现精灵按照地图上所描述的地形走动:比方说前面一旦遇到障碍则饶行,碰到河流不能通过等等;这就要求我们必须建立一个关于该地图地形的网格结构,将精灵的坐标与地形障碍物坐标以统一的规格布局到该网格中,最终通过在网格里模拟坐标的移动来完成真实的精灵移动:
1.jpeg

假设此时主角所处位置如上图左边,那么我们要做的就是按上图右方所布局的网格结构让它(蓝色方块)饶过障碍物(红色方块区域)前进,这样看起来精灵的移动是否更加直观了?
将实际移动转换成基于网格的方块移动需要面对的是主要问题是如何进行碰撞检测以饶开障碍物;传统游戏开发中针对这类情况的处理方式相当多样,比如:
坐标还原 - 时时判断精灵所处位置是否为障碍物,是的话则将它的位置坐标还原成进入障碍物之前的坐标并停止移动。
边缘检测 - 通过对两物体之间的边缘是否有交点进行判断(基于像素的检测)。
前方预测 – 时时判断前方坐标是否存在障碍物后再做相关处理。
两点线段检测 – 判断起点到终点所连成的线段中是否存在障碍物后再做相应处理。
……
除此之外还有N多了。本节我将采用A*寻路算法实现精灵在地图中的完美移动。
事先需要说明两点:
1)该A*算法源码为两位国外朋友编写,在本课程中我稍做了些修改后直接使用,对完整版感兴趣的朋友可以去该地址下载。
2)A*算法对于初学者来说比较复杂,网上有关于它非常详细的算法原理介绍;本课程以通过Silverlight敏捷开发网页RPG游戏为目的,因此我不会再对该算法的实现进行讲解。感兴趣的同学可在课后自行研究或重写。
言归正传,我们首先在Logic类库中新建一个名为Algorithm的文件夹,以及在该文件夹下再新建一个名为AStar的文件夹后将A*算法源码添加进AStar文件夹中。
接下来是对该A*算法在游戏中使用做的一些简单说明。
核心使用代码类似如下:
      


                byte[,] matrix = new byte[1024,1024];
                PathFinderFast pathFinderFast = new PathFinderFast(matrix) {
                    Formula = HeuristicFormula.Manhattan, //曼哈顿算法
                    Diagonals = true, //斜视角必须
                    HeuristicEstimate = 2, //多地形必须
                    SearchLimit = 1000, //搜索限制
                };
                List path = pathFinderFast.FindPath(new Point2D((int)start.X, (int)start.Y), new Point2D((int)end.X, (int)end.Y));
                if (path == null || path.Count 1的话则可编写相关逻辑引导精灵按节点表的逆序顺次移动(即节点表的最后一个节点才是寻路的起点)。</p>综上,掌握该A*寻路工具用法后如何在实际中运用?如果是一幅偌大的地图我们该如何描绘出它的每个障碍物点?此时的首要任务是编写一个基于该算法的地图编辑器。
大家不妨先暂用第一部教程中已编写好的地图编辑器,然后将课程游戏中的地图图片载入进去,并在地图相应的位置上绘制障碍物格子,最后点击导出障碍物我们将得到一个xml配置文件:
2.jpeg

将该配置文件中对应的参数复制到场景的Info.xml配置文件中(命名稍微改动了下):


3.gif
4.gif
代码

  
    
    
    
    
  
    同时在场景类中加上相应的属性:

        /// 
        /// 获取或设置地形单位格尺寸(单位:像素)
        /// 
        public int TerrainGridSize { get; set; }

        /// 
        /// 获取或设置地形二维矩阵
        /// 
        public byte[,] TerrainMatrix { get; set; }
    以及修改场景配置Info.xml下载完后对地形的解析:


5.gif
6.gif
代码             TerrainGridSize = (int)xScene.Attribute("TerrainGridSize");
            TerrainMatrix = new byte[(int)xScene.Attribute("TerrainMatrixDimension"), (int)xScene.Attribute("TerrainMatrixDimension")];
            string[] terrain = xScene.Attribute("Terrain").Value.Split(',');
            for (int y = 0; y 
您需要登录后才可以回帖 登录 | 立即注册