Повторяя 2-й мир - PullRequest
       5

Повторяя 2-й мир

1 голос
/ 02 февраля 2012

Как создать двухмерный мир с фиксированным размером, который бы повторялся, когда достигал любой стороны карты?

Когда вы достигаете стороны карты, вы видите противоположную сторону карты, которая слилась с этой. Идея состоит в том, что если бы у вас не было мини-карты, вы бы даже не заметили, что переход карты повторяется.

У меня есть несколько идей, как это сделать: 1) Сохранение всего мира 3х3, подобного этому, который все время одинаков и обновляется одинаково, только игроки существуют только в одном из них. 2) Другим способом было бы разделить карту на более мелкие миры и добавить их в требуемое место, когда их попросят. В любом случае это может быть сложно завершить. Я помню, что более 10 лет назад я играл в такую ​​игру, когда солдаты следовали друг за другом в повторяющейся пустоте, стреляя в других солдат ИИ. В основном хотелось услышать ваши мысли об этой идее и о том, как ее можно достичь. Я кодирую в XNA (C #).

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Другой альтернативой является генерация шума с использованием библиотек 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 - это функция, вызываемая для получения разделов в каждом направлении,легко соединиться с остальным миром.

0 голосов
/ 02 февраля 2012

Если игра основана на тайлах, думаю, вам следует:

  • Оставьте только один массив для игровой зоны.
  • Определите видимую область, используя арифметику по модулю, по размеру игровой области 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 - верхняя координата (x или y) для прямоугольника, а i находится в диапазоне ширины / высоты области просмотра.
  • Это предполагает, что один шаг движения перемещает камеру с не дробными координатами.

Так что это ваша вторая альтернатива, немного более детальная. Если вы хотите повторить только ландшафт, вы должны отделить содержимое тайла. В этом случае содержимое, скорее всего, будет сгенерировано на лету, поскольку вы не сохраняете его.

Надеюсь, это помогло.

...