Я прошу прощения за субъективное "лучшее" ключевое слово.
Мы с другом начали создавать 2D приключенческую игру. Это будет сверху вниз в стиле покемонов или зельда (просто перспектива). Мы обсуждали методы создания большой карты мира, по которой игрок может перемещаться, не напрягая возможности памяти нашей машины.
Нашим первым импульсом было создать большую карту и круг вокруг игрока, в который будет загружаться контент. Мы решили, что это не продлится долго, и решили разбить карту на части. Сначала у нас было четыре больших раздела, но мы поняли, что можем просто разбить его на множество крошечных разделов.
Я играл в Zelda из SNES и увидел, что во время смены карты контент может быть загружен именно тогда. Я имею в виду, что вместо того, чтобы просто проверять прямоугольную область для загрузки данных, мы просто делим карту на множество крошечных кусочков, которые загружают и выгружают данные при переходе от части карты к части карты.
Сегодня он сказал мне, что хочет создать простую карту двумерного массива [WIDTH] [HEIGHT], которая содержит данные о каждой сетке в игре и является постоянной операцией сохранения на диск для данных, которые нам не нужны.
Я не уверен насчет этих идей и подумал, что мог бы как то здесь. Будем весьма благодарны за любые ссылки, ресурсы или учебные материалы по этой теме, а также за прямые ответы на наш вопрос о том, как это сделать эффективно.
источник
Ответы:
Прежде всего, оцените размер вашей карты. Не просто предполагайте, что «большой мир» не уместится в памяти. В настоящее время карта, занимающая в памяти более 10 мегабайт, является абсолютно приемлемой, и вы можете набрать ЛОТ в 10 мб в простом 2D-мире на основе тайлов.
Если у вас действительно большой мир, самое надежное решение - использовать куски карты. Разделите ваш мир на куски фиксированного размера (скажем, 64x64). Загружайте куски на лету, когда игрок перемещается, сохраняя, по крайней мере, один кусок загруженным во всех направлениях (т.е. загружайте блок, в котором находится игрок, и всех его соседей).
Что касается выгрузки кусков, вы можете выбирать между несколькими стратегиями. Стремительная выгрузка означает, что вы выгружаете и сохраняете на диск все куски в тот момент, когда игрок перемещается достаточно далеко; но вы также можете отложить выгрузку для повышения производительности (сохранение чанка, как и любого доступа к диску, является дорогостоящей операцией).
источник
Лично я бы построил карту, используя специальный редактор плиток, такой как TileEd . Этот подход дает несколько преимуществ:
Я советую вам избегать загрузки битов карты во время игры, чтобы избежать задержки. Как упоминалось ранее, в этом не должно быть необходимости, поскольку вы, вероятно, сможете хранить лист плитки в памяти. Когда персонаж входит в другую часть "мира", вы можете поменять лист плитки другим (например, снежные плитки заменены пустынными).
Размывание плиток на экране, вероятно, самый быстрый способ визуализации вашей карты. Я не знаю SFML, но из документации на их сайте вы должны заглянуть в
Sprite
класс или использоватьCopy
функциюImage
класса.Обновление: я только что прочитал некоторые документы SFML, и вам определенно следует использовать
Drawable
илиSprite
вместо манипулирования изображениями для повышения производительности. По-видимому, есть загрузчик Tiled SFML . Это, вероятно, хороший способ быстро запустить что-то.источник
Начните с создания карты, размер которой необходим, чтобы рассказать историю, которую вы хотите рассказать в игре. Проведите тестирование на машине с минимальными требованиями, необходимыми для того, чтобы люди могли играть в вашу игру Если это слишком медленно, профилируйте и оптимизируйте.
источник
На мой взгляд, лучше всего использовать 2D-массив отдельных плиток. Вы можете иметь всю большую большую карту в виде одного 2D-массива и рисовать только ту ее часть, которая должна отображаться в любой момент времени. Ниже приведен пример использования массива 2D-карт с библиотекой игр HTML5 tabageos (tbgs.js); http://actiontad.com/tabageosHTML5/Examples/BlitMathCameraAndTravelers/
источник
Если вы не планируете перестроить Ultima-Online (Fallout 3 или Oblivion), нет никаких причин, по которым мир должен быть цельным. Baldur's Gate и Icewind Dale - две игры, которые приходят на ум и реализуют эффективные карты, которые не отвлекают от игрового процесса.
Конечно, у вас гораздо больше вычислительной мощности, чем у них, поэтому загрузка экранов должна быть минимальной, но даже в Fallout и Oblivion есть экраны загрузки для некоторых вещей.
Все, что я могу вам сказать, это то, что я пишу небольшую библиотеку Obj-C для iPhone, которая берет набор плиток 32x32 и рисует его в NSImage. Я получаю около 10 кадров в секунду таким образом, и мне, вероятно, следует использовать OpenGL, но мне нужно перерисовать только, если персонаж выходит из прямоугольника.
Вы должны разбить карту на 9 размеров экрана (для меня это 960x640 блоков), поэтому, если персонаж выходит из центрального блока, я перерисовываю 9 экранов в большое изображение (около 1,2 МБ - дает много комната под лимитом 20 МБ на iPhone 3G). Это происходит довольно медленно (намного медленнее, чем 10 кадров в секунду), поэтому перерисовка не заметна во время игры.
Я, скорее всего, перейду на OpenGL ES в какой-то момент, но сейчас он работает нормально.
[РЕДАКТИРОВАТЬ]
Позвольте мне уточнить.
Алгоритм рисования для 9-экранного фона занимает 0,1 секунды (10 кадров в секунду). Если ваш игрок не может пройти весь экран менее чем за одну десятую секунды, перерисовка должна быть незаметной во время игры.
источник