Xna 重复二维世界

Xna 重复二维世界,xna,2d,infinite-loop,repeat,Xna,2d,Infinite Loop,Repeat,如何制作一个固定大小的2d世界,当到达地图的任何一边时,它会重复自身 当你到达地图的某一侧时,你会看到地图的另一侧与这一侧合并在一起。这个想法是,如果你没有一个小地图,你甚至不会注意到地图重复本身的转变 我有一些想法如何做到这一点: 1) 一直保持3x3的总世界都是这样的,完全一样,更新方式也一样,只是玩家只存在其中一个。 2) 另一种方法是将地图分成更小的和平区,并在需要时将其添加到所需的位置。 无论哪种方式,完成它都可能很复杂。我记得10年前我玩过这样的游戏,士兵们在一个重复的世界里互相跟踪

如何制作一个固定大小的2d世界,当到达地图的任何一边时,它会重复自身

当你到达地图的某一侧时,你会看到地图的另一侧与这一侧合并在一起。这个想法是,如果你没有一个小地图,你甚至不会注意到地图重复本身的转变

我有一些想法如何做到这一点: 1) 一直保持3x3的总世界都是这样的,完全一样,更新方式也一样,只是玩家只存在其中一个。 2) 另一种方法是将地图分成更小的和平区,并在需要时将其添加到所需的位置。 无论哪种方式,完成它都可能很复杂。我记得10年前我玩过这样的游戏,士兵们在一个重复的世界里互相跟踪,射击其他AI士兵。
大多数人都想听听你对这个想法以及如何实现它的想法。我正在用XNA(C#)编码。

如果游戏是基于瓷砖的,我想你应该做的是:

  • 仅为游戏区域保留一个阵列。
  • 在游戏区域mod w和h的大小上使用模运算确定可见区域,其中这些是桌子的宽度和高度。
    例如,如果表格为80x100(0,0)左上角坐标,宽度为80,高度为100,视口的矩形为(70,90),宽度为40,高度为20,则索引时,x坐标为[70-79][0-29],y坐标为[90-99][0-9]。这可以通过以下公式计算指数来实现:
    idx=(n+i)%80
    (或%100),其中
    n
    是矩形的顶部坐标(x或y),而
    i
    在视口的宽度/高度范围内
  • 这假设移动的一个步骤使用非分数坐标移动摄影机
这是你的第二个选择,更详细一点。如果只想重复地形,则应分离平铺的内容。在这种情况下,内容很可能是动态生成的,因为您不存储它们。


希望这有帮助。

如果游戏是基于瓷砖的,我想你应该做的是:

  • 仅为游戏区域保留一个阵列。
  • 在游戏区域mod w和h的大小上使用模运算确定可见区域,其中这些是桌子的宽度和高度。
    例如,如果表格为80x100(0,0)左上角坐标,宽度为80,高度为100,视口的矩形为(70,90),宽度为40,高度为20,则索引时,x坐标为[70-79][0-29],y坐标为[90-99][0-9]。这可以通过以下公式计算指数来实现:
    idx=(n+i)%80
    (或%100),其中
    n
    是矩形的顶部坐标(x或y),而
    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切换