`
cenphoenix
  • 浏览: 163480 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

游戏算法整理 算法七 无限大地图的实现

阅读更多

这已经不是什么新鲜的东西了,不过现在实在想不到什么好写,而且版面上又异常冷清,我再不说几句就想要倒闭了一样。只好暂且拿这个东西来凑数吧。 
无限大的地图,听上去非常吸引人。本来人生活的空间就是十分广阔的,人在这么广阔的空间里活动才有一种自由的感觉。游戏中的虚拟世界由于受到计算机存储空间的限制,要真实地反映这个无限的空间是不可能的。而对这个限制最大的,就是内存的容量了。所以在游戏的空间里,我们一般只能在一个狭小的范围里活动,在一般的RPG中,从一个场景走到另一个场景,即使两个地方是紧紧相连的,也要有一个场景的切换过程,一般的表现就是画面的淡入淡出。

这样的场景切换给人一种不连续的感觉(我不知道可不可以把这种称作“蒙太奇”:o)),从城内走到城外还有情可缘,因为有道城墙嘛,但是两个地方明明没有界限,却偏偏在这一边看不到另外一边,就有点不现实了。当然这并不是毛病,一直以来的RPG都是遵循这个原则,我们(至少是我)已经习惯了这种走路的方式。我在这里说的仅仅是另外一种看起来更自然一点的走路方式,仅此而已。

当然要把整个城市的地图一下子装进内存,现在的确是不现实的,每一次只能放一部分,那么应该怎么放才是我们要讨论的问题。

我们在以前提到Tile方法构造地图时就谈到过Tile的好处之一就是节省内存,这里仍然可以借鉴Tile的思想。我们把整个大地图分成几块,把每一块称作一个区域,在同一时间里,内存中只保存相邻的四块区域。这里每个区域的划分都有一定的要求:每个区域大小应该相等这是一定的了,不然判断当前屏幕在哪个区域中就成了一个非常令人挠头的事;另外每个区域的大小都要大于屏幕的大小,也只有这样才能保证屏幕(就是图中那块半透明的蓝色矩形)在地图上荡来荡去的时候,最多同时只能覆盖四个区域(象左图中所表示的),内存里也只要保存四个区域就足够了;还有一点要注意的,就是地图上的建筑物(也包括树啦,大石头啦什么的)必须在一个区域内,这样也是为了画起来方便,当然墙壁——就是那种连续的围墙可以除外,因为墙壁本来就是一段一段拼起来的。 

我们在程序中可以设定4个指针来分别指向这4个区域,当每次主角移动时,就判断当前滚动的屏幕是否移出了这四个区域,如果移出了这四个区域,那么就废弃两个(或三个)已经在目前的四个相邻区域中被滚出去的区域(说得很别扭,各位见谅),读入两个(或三个)新滚进来的区域,并重新组织指针。这里并不涉及内存区域的拷贝。

这样的区域划分方法刚好适合我们以前提到的Tile排列方法,只要每个区域横向Tile的个数是个偶数就行了,这样相邻的两个区域拼接起来刚好严丝合缝,而且每个区域块的结构完全一致,没有那些需要重复保存的Tile(这个我想我不需要再画图说明了,大家自己随便画个草图就看得出来了)。在文件中的保存方法就是按一个个区域分别保存,这样在读取区域数据时就可以直接作为一整块读入,也简化了程序。另外还有个细节就是,我们的整个地图可能不是一个规则的矩形,可能有些地方是无法达到的,如右图所示,背景是黑色的部分代表人物不能达到的地方。那么在整个地图中,这一部分区域(在图中蓝色的3号区域)就可以省略,表现在文件存储上就是实际上不存储这一部分区域,这样可以节省下不少存储空间。对于这种地图可以用一个稀疏矩阵来存储,大家也可以发挥自己的才智用其他对于编程来说更方便的形式来存储地图。  

这就是对无限大地图实现的一种方法,欢迎大家提出更好的方法。也希望整个版面能够活跃一点。

分享到:
评论
1 楼 Meggie_love 2011-01-06  
受教了

相关推荐

    常用游戏算法整理.mht[评价可免费]

    精华游戏算法整理.mht 经典的游戏算法全集

    unity2017算法分析与实现.rar

    《Unity2017算法分析与实现》是一个针对游戏开发者,特别是使用Unity引擎进行游戏开发者的宝贵资源。这本书籍深入探讨了在Unity2017版本中如何运用各种算法来优化游戏性能,提升游戏体验。从提供的压缩包文件名来看...

    模型算法大全(20+种常用算法模型+代码实现)

    模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+...

    卡马克算法 经典 详细 游戏地图绘制中的常用算法 值的研究的算法

    卡马克算法,全称为“卡马克卷轴算法”(Carmack's scrolling algorithm),是由著名游戏程序员约翰·卡马克(John Carmack)所提出的一种在2D游戏中实现平滑滚动地图的技术。这种算法在80年代末90年代初的游戏开发...

    【路径规划】基于灰狼算法实现机器人栅格地图路径规划matlab源码.zip

    【路径规划】基于灰狼算法实现机器人栅格地图路径规划matlab源码.zip是一个包含MATLAB源代码的压缩包,其主要目标是演示如何利用灰狼算法(Grey Wolf Optimizer, GWO)来解决机器人在栅格地图中的路径规划问题。...

    Matlab机器人基于RRT*+APF的二值地图动态避障算法实现

    全局路径规划:使用RRT*算法实现二值图像和初始障碍物位置的全局路径规划 动态避障:机器人按照全局路径行驶,在运行过程中使用APF算法,实时计算和障碍物之间的斥力,实现点到点的动态规划从而动态进行动态避障 5:...

    基于改进A*算法的机器人路径规划的MATLAB实现

    图的路径规划及路径优化算法,首先建立已知环境的矩形化栅格地图用分区算法实现地图建模。机器人沿着路径即可实现对已知环境区域的全覆盖并且使得机器人的运行路径最短。对于环境内存在的任意形状的障碍物此...

    A星寻路算法之45度地图

    - 考虑地图的障碍物,对不可通过的节点设置无限大G值或直接忽略。 在提供的代码(包括资源)中,可能包含了以下内容: 1. A*算法的实现,包括评估函数、节点结构、开放列表和关闭列表的管理等。 2. 45度地图的数据...

    A星算法 c语言实现 a*算法

    而`route.txt`文件可能是一个输入文件,包含地图信息或者用于测试算法的初始和目标位置。 在实际应用中,启发式函数通常选用曼哈顿距离或欧几里得距离,但也可以根据具体问题选择其他合适的函数。启发式函数必须是...

    数独游戏算法(C实现)

    "数独游戏算法(C实现)" 数独游戏算法是指使用计算机程序来解决数独游戏的算法。数独游戏是一种流行的逻辑游戏,玩家需要填充一个9x9的矩阵,使得每行、每列和每宫中都包含数字1-9,且每个数字只能出现一次。数独...

    java国密算法实现

    总的来说,Java国密算法实现涉及了椭圆曲线加密和哈希函数两大核心概念,通过合理运用这些算法,可以构建安全可靠的加密通信和数据保护系统。在具体编程时,需要对算法原理有深入理解,并熟练掌握相关库的使用,以...

    基于栅格地图的蚁群算法路径规划

    本项目利用MATLAB这一强大的数值计算和可视化工具,实现了基于栅格地图的蚁群算法(Ant Colony Optimization, ACO)进行路径规划。 **一、蚁群算法简介** 蚁群算法是模拟自然界中蚂蚁寻找食物路径的行为而设计的一...

    基于dijkstra 算法实现图像地图最短路径求解附matlab代码.zip

    1.版本:matlab2019a,不会运行可私信 2.领域:【路径规划-图像地图】 3.内容:基于dijkstra 算法实现图像地图最短路径求解附matlab代码.zip 4.适合人群:本科,硕士等教研学习使用

    几个推荐算法的java实现

    本项目提供了一些推荐算法的Java实现,包括slopeone、SVD(奇异值分解)以及基于物品邻接的SVD(ItemNeighborSVD)。下面我们将详细探讨这些算法及其在Java中的实现。 1. **slopeone**: - Slope One是一种简单的...

    MoreWindows白话经典算法之七大排序第2版(高清)

    ### 更多Windows白话经典算法之七大排序第2版(高清) #### 一、概览 本书《更多Windows白话经典算法之七大排序第2版》是一部深入浅出讲解七种经典排序算法的著作,旨在帮助读者理解并掌握冒泡排序、直接插入排序...

    C语言实现Dijkstra算法

    在C语言中实现Dijkstra算法,需要理解图的表示方法、优先队列的概念以及如何有效地更新路径信息。以下是关于这个主题的详细讲解。 首先,图在C语言中通常使用邻接矩阵或邻接表来表示。邻接矩阵是一个二维数组,其...

    (源码)基于Python的算法整理与实现.zip

    # 基于Python的算法整理与实现 ## 项目简介 本项目是一个基于Python的算法整理与实现,涵盖了多种经典算法和数据结构,包括排序算法、查找算法、树结构、图算法、动态规划、贪心算法、摊还分析、高级数据结构等。...

    A*算法Java/C++实现

    在Java和C++中实现A*算法,可以提高我们对这两种语言特性的掌握,同时也为我们提供了一个强大的工具,用于解决游戏路径规划、机器人导航、网络路由等各种问题。通过这个项目,我们可以进一步提升编程技能,同时深化...

    【路径规划】基于A星算法实现栅格地图全路径规划matlab源码.zip

    【路径规划】基于A星算法实现栅格地图全路径规划matlab源码 在现代机器人技术、自动驾驶汽车和游戏设计等领域,路径规划是一项至关重要的任务。A*(A-star)算法是一种广泛应用的搜索算法,它在寻找从起点到终点的...

Global site tag (gtag.js) - Google Analytics