Xna 重复二维世界
如何制作一个固定大小的2d世界,当到达地图的任何一边时,它会重复自身 当你到达地图的某一侧时,你会看到地图的另一侧与这一侧合并在一起。这个想法是,如果你没有一个小地图,你甚至不会注意到地图重复本身的转变 我有一些想法如何做到这一点: 1) 一直保持3x3的总世界都是这样的,完全一样,更新方式也一样,只是玩家只存在其中一个。 2) 另一种方法是将地图分成更小的和平区,并在需要时将其添加到所需的位置。 无论哪种方式,完成它都可能很复杂。我记得10年前我玩过这样的游戏,士兵们在一个重复的世界里互相跟踪,射击其他AI士兵。Xna 重复二维世界,xna,2d,infinite-loop,repeat,Xna,2d,Infinite Loop,Repeat,如何制作一个固定大小的2d世界,当到达地图的任何一边时,它会重复自身 当你到达地图的某一侧时,你会看到地图的另一侧与这一侧合并在一起。这个想法是,如果你没有一个小地图,你甚至不会注意到地图重复本身的转变 我有一些想法如何做到这一点: 1) 一直保持3x3的总世界都是这样的,完全一样,更新方式也一样,只是玩家只存在其中一个。 2) 另一种方法是将地图分成更小的和平区,并在需要时将其添加到所需的位置。 无论哪种方式,完成它都可能很复杂。我记得10年前我玩过这样的游戏,士兵们在一个重复的世界里互相跟踪
大多数人都想听听你对这个想法以及如何实现它的想法。我正在用XNA(C#)编码。如果游戏是基于瓷砖的,我想你应该做的是:
- 仅为游戏区域保留一个阵列。
- 在游戏区域mod w和h的大小上使用模运算确定可见区域,其中这些是桌子的宽度和高度。
例如,如果表格为80x100(0,0)左上角坐标,宽度为80,高度为100,视口的矩形为(70,90),宽度为40,高度为20,则索引时,x坐标为[70-79][0-29],y坐标为[90-99][0-9]。这可以通过以下公式计算指数来实现:
(或%100),其中idx=(n+i)%80
是矩形的顶部坐标(x或y),而n
在视口的宽度/高度范围内i
- 这假设移动的一个步骤使用非分数坐标移动摄影机
希望这有帮助。如果游戏是基于瓷砖的,我想你应该做的是:
- 仅为游戏区域保留一个阵列。
- 在游戏区域mod w和h的大小上使用模运算确定可见区域,其中这些是桌子的宽度和高度。
例如,如果表格为80x100(0,0)左上角坐标,宽度为80,高度为100,视口的矩形为(70,90),宽度为40,高度为20,则索引时,x坐标为[70-79][0-29],y坐标为[90-99][0-9]。这可以通过以下公式计算指数来实现:
(或%100),其中idx=(n+i)%80
是矩形的顶部坐标(x或y),而n
在视口的宽度/高度范围内i
- 这假设移动的一个步骤使用非分数坐标移动摄影机
希望这能有所帮助。另一种选择是使用libnoise库生成噪波。这样做的美妙之处在于,你可以在理论上无限的空间中产生噪音 请看以下内容: 上面的XNA端口也位于: 如果最终使用XNA端口,可以执行以下操作:
Perlin perlin = new Perlin();
perlin.Frequency = 0.5f; //height
perlin.Lacunarity = 2f; //frequency increase between octaves
perlin.OctaveCount = 5; //Number of passes
perlin.Persistence = 0.45f; //
perlin.Quality = QualityMode.High;
perlin.Seed = 8;
//Create our 2d map
Noise2D _map = new Noise2D(CHUNKSIZE_WIDTH, CHUNKSIZE_HEIGHT, perlin);
//Get a section
_map.GeneratePlanar(left, right, top, down);
GeneratePlanar是用于调用的函数,用于获取各个方向上与世界其他部分无缝连接的部分。另一种方法是使用libnoise库生成噪波。这样做的美妙之处在于,你可以在理论上无限的空间中产生噪音 请看以下内容: 上面的XNA端口也位于: 如果最终使用XNA端口,可以执行以下操作:
Perlin perlin = new Perlin();
perlin.Frequency = 0.5f; //height
perlin.Lacunarity = 2f; //frequency increase between octaves
perlin.OctaveCount = 5; //Number of passes
perlin.Persistence = 0.45f; //
perlin.Quality = QualityMode.High;
perlin.Seed = 8;
//Create our 2d map
Noise2D _map = new Noise2D(CHUNKSIZE_WIDTH, CHUNKSIZE_HEIGHT, perlin);
//Get a section
_map.GeneratePlanar(left, right, top, down);
GeneratePlanar是一个可以调用的函数,用于获取各个方向上与世界其他地方无缝连接的部分。是否必须连续滚动显示地图?或者屏幕在转换点切换?地图只有一个屏幕宽,还是一次只显示一部分?或者
与此合并。
表示您希望在到达边缘后缩小并再次显示?井图不会自动滚动。玩家只是自由地四处奔跑,如果他靠近地图的一侧,他可以看到对面的开始。摄像机固定在球员位置,但地图比摄像机屏幕大得多。我不知道地图是否应该在地图或相机的边界处切换,以及这些东西应该如何工作。不管怎样,当到达边缘时,我希望能够看到对面,同时也能越过。下面这张图片可能有助于理解这个想法:所以摄像机在跟踪球员,而他总是在中间?游戏是基于瓷砖的?很可能是基于瓷砖的。哦,忘了提一下相机是从上面来的。我不知道这个词的意思,但你们就像是在战略游戏或其他什么游戏中从天空观看。是的,摄像机紧随其后,并且始终在播放器的中心。你必须连续滚动显示地图吗?或者屏幕在转换点切换?地图只有一个屏幕宽,还是一次只显示一部分?或者与此合并。
表示您希望在到达边缘后缩小并再次显示?井图不会自动滚动。玩家只是自由地四处奔跑,如果他靠近地图的一侧,他可以看到对面的开始。摄像机固定在球员位置,但地图比摄像机屏幕大得多。我想不出地图是否应该在bor切换