Что лучший способ состоит в том, чтобы представить уровни в 2D скроллере стороны?

Обычно я нахожу, создают пользовательскую функцию журнала, которая в состоянии экономить на файле, сохранить информацию об отладке, и в конечном счете переиздавать на общем нижнем колонтитуле.

можно также переопределить общий Класс исключений, так, чтобы этот тип отладки был полуавтоматическим.

15
задан Anthony Mastrean 16 July 2009 в 14:11
поделиться

12 ответов

Thanks to the ROM hacking scene the file format for Super Mario World (and I'd imagine most other popular games of the era) is well known and basically fully understood. There are also documents out there which will describe it all in painful detail. Unfortunately because it means going to less-than-legal sites I'm can't supply you any links from work, but if you google for the .MWL file extension and an editing application called Lunar Magic it may point you in the right direction.

The basic principle though, is fairly simple. First you need your graphics, so you make a single image with tiles for the landscape at a defined size - smaller is more memory efficient, larger gives you more detail, so let's say ours are 32 X 32 pixels. So you end up with something like this (Characters representing different tiles):

    ! " £ $ %
    ^ & * ( )

You can make one title set per "style" of level, so fire world, ice world, cave world etc. This saves you loading in tiles that you aren't going to use.

Next you need a level file, this starts off as consisting of which tile set you want to load and numbers representing each graphic, like so:

   fireworld.img
   2 2 2 2 2 2 2 2
   3 3 2 2 2 2 3 3
   3 3 3 3 3 3 3 3

Merged with the tileset above you'd have (depending on how you number the tiles)

   " " " " " " " "
   £ £ " " " " £ £
   £ £ £ £ £ £ £ £

Obviously you then need to layer more information on top of this: Which tiles are solid, which are deadly etc. This can be done at the image level (a 3 is always solid) or, for more flexibility but larger files, at the map level. Bit flags will do, first number is solid, second is deadly:

   fireworld.img
   200 200 200 200 200 200 200 200
   310 310 200 200 200 200 310 310
   310 310 310 310 310 310 310 310

On top of all of this you need to suffix the level file with a start and end point (a couple of coordinates) and enemies (which graphic they use, which AI routine they use, where they start).

Once all this is done you can look into compression. There are a number of ways to save space and obviously it doesn't matter as much now as it did in the 16 and 8 bit eras, but even so our format above is massively wasteful.

As always these are just the basic principles. Your results may vary...

23
ответ дан 1 December 2019 в 00:50
поделиться

For most 2D games, I imagine the level is stored like a bitmap of tiles.

It works like this:

  • First, you have whole lot of tiles of a fixed say, let's say 16x16 pixels. These tiles are like the pieces of a jigsaw puzzle. You can fit them together in all sorts of ways to form a level. For example, here is a tileset, although this looks to be for some kind of top-down game the principles are the same: http://silveiraneto.net/wp-content/uploads/2009/04/free_tileset_version_9.png

  • Once your set of tiles is known, you give every tile a number. You can store this number in a byte if you have less than 256 tiles, or in a word or dword if you have more. It's also useful at this point to add some semantics to these numbers. Let's say for example that tiles 1-100 represent the "obstacles", which you cannot walk through. This will come in handy later.

  • Now it's time to define the map. We can simply do that by putting the jigsaw pieces on a large grid! We define a maximum size for the map. For a sidescroller, let's say the map is 1000 tiles wide and 50 tiles high. You can choose whatever you want. You can now represent the map in memory (and on disk) as a bix matrix of width * height numbers. Every "cell" in the grid contains a number that represents the tile that should be drawn at that location.

Drawing the map is easy now:

for (y = 0; y < height; y++) {
   for (x = 0; x < width; x++) {
      draw_tile(x * 16, y * 16, map[y][x]);
   }
} 

As is other stuff. Remember that we defined the tiles 1-100 to be obstacles? We can use the map to detect whether it's possible for the player to move to a certain position:

bool moveable(int x, int y) {
   return map[y / 16][x / 16] > 100;
}

This is the most basic explanation of a tiled map. There are loads more fancy things you can do by extending this simple concept. Here are some ideas:

  • multiple layers, to represent objects on top of the background
  • parallax scrolling for cool background effects

I'm fairly sure that most 2D games use some variant of the tiled game map technique.

3
ответ дан 1 December 2019 в 00:50
поделиться

Я использовал сценарии Lua для создания уровней для игр Physle . Они не так быстро загружаются, как двоичный формат, но значительно упрощают отладку и интеграцию с другими инструментами. Уровни загрузки также обычно не там, где скорость действительно окупается.

1
ответ дан 1 December 2019 в 00:50
поделиться

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

Я бы создал простой файл формат, который может быть основан на XML. В этом случае я, вероятно, определил бы размер игровой зоны и другие метаданные, такие как имя и ограничение по времени. Тогда у меня будет список объектов, которые появятся в игровой зоне с их координатами x / y и типом объекта, например, начальная позиция игрока, выход с уровня и т. Д.). Я мог бы даже иметь раздел, который сохраняет время, когда в игре происходят события.

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

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

0
ответ дан 1 December 2019 в 00:50
поделиться

В блоге одного из наших уважаемых руководителей есть несколько связанное с этим сообщение Почему форматы файлов Microsoft Office такие сложные? (И некоторые обходные пути)

0
ответ дан 1 December 2019 в 00:50
поделиться

Я очень часто видел используемые массивы со значениями, привязанными к типам ландшафта / заливки. Вот отличный урок от Тони Па по созданию игр на основе флеш-тайлов:

Хранение игровой карты

Затем создатель уровня просматривает и создает файл. Поищите на Kongregate игры, которые позволяют создавать игры на уровне пользователя; они хранят весь уровень, который передается в виде переменных POST при ссылке на игру. Это прозрачный процесс, который не часто кодируется, поэтому на нем легко учиться (и есть много типов игр, которые делают это)

0
ответ дан 1 December 2019 в 00:50
поделиться

Не очень актуально, но знаете ли вы, что облака в Марио - это тот же спрайт, что и кусты, только со смещенной цветовой палитрой? Память тогда действительно была дорогой!

На самом деле невозможно узнать, как они хранятся, но, вероятно, с подходом «объекты на сетке» с несколькими трюками экономии памяти здесь + там. Реализация неизбежно будет сильно различаться от игры к игре и в значительной степени зависит от разработчика - на самом деле нет никакого стандартного подхода.


Обновление: я бы представил представление всего уровня в виде (очень широкой) сетки. быть лучшим подходом. В каждую ячейку сетки вы должны поместить спрайт со свойствами (спавн, земля, стена, сундук, злодей, шипы и т. Д.). Затем движок будет рисовать спрайт в правильном месте, но также будет иметь связанные с ним свойства. Если вы разместите 10 частей пола в ряд, вам придется закодировать движок, чтобы распознать соединение, где поставить правильный конец и т. Д. Очевидно, что все, кроме сетки, будет небом!

Как вы кодируете эту информацию? в значительной степени зависит от вас, и поскольку память больше не имеет большого значения, эффективность не имеет большого значения. Просто список объектных кодов x, y, вероятно, подойдет.

9
ответ дан 1 December 2019 в 00:50
поделиться

Поскольку хранит структур данных .

Задайте слишком общий вопрос. вопрос, получите слишком широкий ответ. :)

1
ответ дан 1 December 2019 в 00:50
поделиться

Это слишком много.

Хранение игрового уровня ШИРОКО варьируется в зависимости от движка.

0
ответ дан 1 December 2019 в 00:50
поделиться

Обычно в каком-то настраиваемом формате файла, который анализирует игра.

Возможен XML, как и простые текстовые файлы. Однако попробуйте открыть файл уровня из одной из своих игр, и вы, скорее всего, увидите искаженный текст. Вам нужно найти документацию о специальных форматах файлов, которые использует игра.

Посмотрите на сайты моддинга вашей игры, и вы найдете больше.

0
ответ дан 1 December 2019 в 00:50
поделиться

В случае упомянутых (предположительно старых и 2D) игр Mario и Sonic, возможно, это какой-то непонятный сжатый и оптимизированный формат, позволяющий обойти ограничения по хранению и обработке данных консолей, для которых они были созданы. .

0
ответ дан 1 December 2019 в 00:50
поделиться

Все, кто утверждает, что игры Mario сохраняют свои уровни в структуре 2D-массива что-то вроде выключено: помимо первых двух игр GB Mario (и, возможно, третьей), игры Super Mario основаны на объектах .

Каждый уровень разделен на несколько экранов с одинаковым общим размером для каждого уровня. Каждый экран содержит список объектов переменной длины, каждый из которых имеет тип, положение и (в зависимости от типа) другие свойства. В начале уровня первый или два экрана интерпретируются и преобразуются в обычную структуру 2D-массива, которая используется для рисования экрана и взаимодействия. По мере прохождения уровня карта перестраивается на лету, выбросить части, которые выходят за пределы досягаемости.

Вот почему враги могут возродиться, если вы отступите, особенно на одном из лесных уровней в SMW, где вы можете использовать плащ, чтобы прыгать назад и вперед на три экрана шириной от одной гусеницы к другому. Что, кстати, потому что вы никогда не касаетесь пола, это дает много жизней.

Особенности этой системы различаются в зависимости от игры.

В остальном Мартин Харрис полностью прав.

5
ответ дан 1 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: