Articles of 地图

优化和保存/加载

我正在开发一个2D平铺游戏,我有几个关于它的问题。 首先我想知道这是否构成我的Tile类的正确方法: namespace TileGame.Engine { public enum TileType { Air, Stone } class Tile { TileType type; bool collidable; static Tile air = new Tile(TileType.Air); static Tile stone = new Tile(TileType.Stone); public Tile(TileType type) { this.type = type; collidable = true; } } } 用这个方法,我只是说world[y, x] = Tile.Stone ,这对我来说似乎是正确的,但我不是一个非常有经验的编码器,并希望得到援助。 现在我非常怀疑这个原因是因为我喜欢所有事情都尽可能地优化,这里面有一个重大缺陷,我需要帮助克服。 它与保存和加载…以及实际上加载更多。 它的做法依赖于将枚举转换为一个字节的原则,该字节给出了枚举中声明的相应数字。 每个TileType被转换为一个字节并写出到一个文件中。 因此, TileType.Air将显示为0,并且TileType.Stone在文件中显示为1(明显以字节forms显示)。 […]

寻找障碍,可以被破坏

地图上有几个大小为n * n的建筑物,还有许多可以销毁的障碍物。 假设我在地图上的(x,y)上放置了一名士兵,士兵可以通过移动和摧毁障碍物到达建筑物。 我需要一个方法来找出士兵的最佳select,因为可能有很多士兵,我希望这个过程可以尽可能less的计算资源。 我想出了path寻找和KD树find最近的邻居,但都不合适,因为KD树没有障碍,path寻找需要穿越很多建筑物。 此外,摧毁障碍会影响到一条路线的规划。

2D开放世界MMORPG; 大地图内存问题

我正在开发一个用于学习目的的2D开放式世界MMORPG游戏,并有一个大地图的问题。 一年前,我开发了2D开放式世界单人/合作社游戏。 它以大块的forms保存地图,当指定的地图块加载时,NPC的AI开始“滴答”。 在我的MMORPG游戏中,NPC AI是由服务器处理的,并且它在某个指定的时间间隔内总是“滴答”。 那是我的麻烦开始的地方。 我希望NPC随意走路。 为了这个工作,我必须检查地图碰撞的每一步,所以我的NPC不会在墙上。 问题是当我有大的地图,例如10000×10000,每个瓦片用6个字节表示,这是大约572MB的地图数据,我的服务器必须在内存中保存所有的时间,我不能加载只有几个地图块,就像在我的单人RPG因为NPC的AI需要随时更新,即使玩家不在附近也是如此。 我的目标是存档地图大小为50000×50000的瓷砖。 我知道它是可能的,因为我看到了巨大的开放世界的二维数据,比50000×50000大很多,我怀疑他们的服务器有20GB的RAM在地图上浪费。 如果有人有任何想法,我可以降低内存使用率,我很想听到你。 在此先感谢,并抱歉我的英语不好

菱形select交错的iso地图上

我有一个交错的等距瓷砖地图,想做一个select,与瓷砖的菱形形状alignment。 这就是我的意思: 所以我在屏幕上和他们的地图单元坐标上得到了两个点。 如何迭代select内的所有图块? 我得到的帮助是一个获取邻居瓷砖的方法。

二维地图,如何构造?

我是新来的。 而且我不太了解二维瓷砖地图。 我读过的教程使用了数组,但是当它们变大时,这难道难以管理? 而如果我想要不同的楼层,比如上下楼梯,我是否需要为游戏世界的每个“层次”设置一个arrays? 任何人都可以解释简单的瓷砖地图吗? 如果您包含代码,请使其成为Javascript或伪代码,因为这是我所知道的。

我如何创建一个灵活的系统平铺2D RPG地图?

在这里使用libgdx。 我刚刚学习了一些创建2D环境的基础知识,并使用OrthographicCamera进行查看。 然而,我经历的教程,硬编码他们的瓷砖地图,没有提到如何做任何其他方式。 通过平铺地图,我的意思是像最终幻想1,世界地图是一个正方形网格,每个具有不同的纹理。 例如,我有一个6瓦x 6瓦地图,使用下面的代码: Array<Tile> tiles = new Array<Tile>(); tiles.add(new Tile(new Vector2(0,5), TileType.FOREST)); tiles.add(new Tile(new Vector2(1,5), TileType.FOREST)); tiles.add(new Tile(new Vector2(2,5), TileType.FOREST)); tiles.add(new Tile(new Vector2(3,5), TileType.GRASS)); tiles.add(new Tile(new Vector2(4,5), TileType.STONE)); tiles.add(new Tile(new Vector2(5,5), TileType.STONE)); //… x5 more times. 考虑到环境的随机性,for循环并没有真正的帮助,因为我必须先开始并完成一个循环,然后才能够做足够的工作来使循环成为可能。 我可以看到一个循环对于像平铺一个海洋或其他什么东西可能是有帮助的,但不是在上面的情况。 上面的代码能让我得到我最终的期望输出,但是,如果我决定要移动一块或交换两块,哦,多么噩梦,即使只是一个6×6的testing,更不用说1000×1000的世界地图。 必须有一个更好的方法来做到这一点。 有人在某个地方发了post(当然现在找不到了)说要看看MapEditor 。 看起来合法。 问题是,如果这是答案,我怎样才能使MapEditor中的东西,并有输出映射插入到我的代码中的variables? 我需要瓷砖作为我的代码中的对象,因为例如,我确定瓷砖是否可以通过或基于我的TileTyle枚举variables相冲突。 是否有替代/语言“原生”(即不使用外部工具)的方法来做到这一点?

我如何在整个游戏世界中模拟AI交互而无需单独计算它们?

我使用SDL2在C ++中制作2D自上而下的基于tile的游戏。 游戏使用非常大的世界地图(想想矮人要塞)。 我的世界地形是使用噪声函数生成的,然后使用另一个函数来建立城镇,模型NPC等,然后将其保存到本地的SQLite数据库(我使用数据库,因为NPC状态,例如,相当复杂 – 数据库建模与其他NPC的关系,改变个性,目标等,也可能受到玩家与他们互动的影响。 在玩的任何时候,玩家都在世界地图的某个“部门”。 目前,只有玩家当前部门的互动模型(例如,NPC彼此交谈,NPC互相争斗等)。 我如何模拟整个世界地图上的交互,而没有发生每一次交互发生的明显的计算问题? 有一些可以推广交互的模式吗? 游戏使用时间很长(一分钟的游戏时间是实时的秒数,因此可以使用游戏中的分钟,几小时,几天,几个月和几年)。 我能以某种方式计算加class变动的大规模估计吗? 其中一些变化可以根据玩家进入该部门的时间来计算,基于玩家进入该部门的时间(例如,NPC变老,年龄的死亡等),但是应该发生一些变化,因为他们实际上“发生”(例如跨部门的事情,如一个军队或一个穿越地图的商人)。

Cocos2d savegame cctmxtiledmap

我的游戏具有几个最初从tmx文件加载并在游戏过程中进行修改的tilemaps。 我怎样才能保存更改的瓷砖地图保存游戏? 请问NSCoding在这里做的伎俩,或是CCTmxTiledMap对象太复杂? 示例实现将如何查找此问题?

使用透视投影缩放到地球上的鼠标

我正在尝试创建一个在地球上发生的战略游戏(即纹理化的球体)。 我想能够缩放到像谷歌地图上的鼠标。 我的相机总是指向地球的中心,其位置是以球坐标定义的。 我已经使用正交投影(技术上的缩放)来实现对鼠标的缩放,由于屏幕距离对应于世界距离,所以更容易。 我希望能够使用透视投影,但math似乎有点超越我。 到目前为止,我能够通过光线投射确定我的鼠标在屏幕上的哪个点,但是我不确定我的相机应该移动多远,以便在将相机点固定在屏幕上的同时保持相机朝向地球的中心。 我知道,缩放到鼠标的基本操作涉及到鼠标的位置,缩放,然后翻译回来,但是在透视的球体上翻译会导致大量的失真。 有没有人有任何运气使用透视投影实现缩放到地球上的鼠标? 或者这是徒劳的练习

Phaser中的Tilemap图层缩放和相机问题

我正在使用Phaser框架,当缩放tilemap图层以模拟我的项目中的缩放function时,我正在努力解决相机/渲染问题。 相机大小设置为1024×768像素(与舞台大小相同)然后创建一个3072x2304px的地图和地图图层。 // Create the tilemap and the tilelayer this.map = this.add.tilemap(); this.map.addTilesetImage('tiles'); this.layer1 = this.map.create('layer', 96, 72, 32, 32); this.layer1.resizeWorld(); 代码放大 this.layerScaleGroup = this.add.group(); this.layerScaleGroup.add(this.layer1); this.layerScaleGroup.add(this.marker); this.layerScale = 1; this.inputScale = 1; 在更新function if(this.input.keyboard.isDown(Phaser.Keyboard.Q)){ this.layerScale -= .2; this.inputScale += .2; } if(this.input.keyboard.isDown(Phaser.Keyboard.A)){ this.layerScale += .2; this.inputScale -= .2; } this.layerScale = Phaser.Math.clamp(this.layerScale, .33, 1); […]