重复2d世界

时间:2012-02-02 12:14:58

标签: xna 2d infinite-loop repeat

如何创建一个固定大小的二维世界,当它到达地图的任何一侧时会重复?

当您到达地图的一侧时,您会看到地图的另一侧与此地图合并。这个想法是,如果你没有迷你地图,你甚至不会注意到地图重复的过渡。

我有一些想法如何制作: 1)保持总共3x3这样的世界一直都是完全相同并且以相同的方式更新,只有玩家只存在于其中一个。 2)另一种方法是将地图分成较小的和平,并在被问到时将它们添加到所需的位置。 无论哪种方式,完成它都会很复杂。我记得更多的是,10年前,我玩过一些类似的游戏,士兵们在重复拍摄其他AI战士时互相追随。 大多数人都听不到你对这个想法的看法以及如何实现这个想法。我在XNA(C#)编码。

2 个答案:

答案 0 :(得分:1)

另一种方法是使用libnoise库生成噪声。这样做的好处是你可以在理论上无限的空间内产生噪音。

看看以下内容: http://libnoise.sourceforge.net/tutorials/tutorial3.html#tile

上面还有一个XNA端口:http://bigblackblock.com/tools/libnoisexna

如果你最终使用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是调用以获取每个方向的部分的功能,它将与您的世界其他地方无缝连接。

答案 1 :(得分:0)

如果游戏是基于平铺的,我认为你应该做的是:

  • 只为游戏区域保留一个阵列。
  • 使用模数算术确定可见区域,超过游戏区域mod w和h的大小,其中这些是桌子的宽度和高度。
    例如。如果表格是80x100(0,0)左上角坐标,宽度为80,高度为100,视口的矩形位于(70,90),宽度为40,高度为20,则使用[70- 79] [0-29]为x坐标,[90-99] [0-9]为y。这可以通过使用以下公式计算指数来实现:
    idx = (n+i)%80(或%100)其中n是rect的顶部坐标(x或y),i位于视口宽度/高度的范围内。
  • 这假设一步移动会使用非小数坐标移动相机。

所以这是您更详细的第二种选择。如果您只想重复地形,则应该分隔图块的内容。在这种情况下,由于您不存储内容,因此很可能会动态生成内容 希望这有帮助。