Оптимизация 2D тайловых игр в Java

Я работаю над 2D-игрой сверху вниз на чистой Java, и до сих пор у меня есть система отображения шума, которая работает с фрагментами плиток (и сущностями), как Minecraft.

Я храню тайлы, создавая массив int[s * s], где s — это размер (в тайлах), который имеет сторона фрагмента. Затем у меня есть статический массив плиток, который содержит все возможные плитки в игре, проиндексированные целым числом. Это целые числа, хранящиеся в int[s * s] в каждом фрагменте. Теперь я хочу иметь возможность накладывать плитки, такие как невидимые плитки возрождения, стены, деревья и плитки перехода (например, когда трава меняется на песок: над песком должна быть граница травы, которая будет новой плиткой).

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

Что было бы хорошим способом сделать это?


person Thiago    schedule 19.03.2013    source источник


Ответы (1)


Обычно вы разделяете хранилище для тайлов и объектов.

  • У вас будет int [w*h] или что-то подобное для самих плиток, что позволит использовать только одну плитку на квадрат.
  • Отдельно у вас может быть ArrayList [w*h], в котором хранится список сущностей в каждом квадрате. Этот массив будет содержать null для пустых квадратов, поэтому дополнительные затраты на хранение большинства квадратов (в которых нет сущностей) минимальны.

Конечно, есть и другие подходы, но у этого есть то преимущество, что он и прост, и довольно эффективен.

Единственным реальным недостатком является то, что вам придется писать отдельный код для обработки плиток и сущностей, но, поскольку вы все равно обычно обрабатываете плитки и сущности по-разному, это вряд ли будет большой проблемой.

person mikera    schedule 19.03.2013
comment
Итак, делая это, я должен был бы превратить свои деревья, спавнеры и т. д. в объекты, что на самом деле не было бы проблемой. Это мило. Но что, если я хочу смешать плитки? Примером может служить переход от травы к песку: мне нужна была бы граница травы внутри тайла песка. Что я хотел сделать, так это сделать эту границу новой плиткой и просто нарисовать ее по песку, для чего потребовалось бы 2 плитки в одном и том же месте (или нет?). - person Thiago; 19.03.2013
comment
Вы можете реализовать границы несколькими способами: а) просто обнаружить их и нарисовать во время рендеринга; б) использовать их как объекты; в) реализовать наложения плиток (несколько плиток на квадрат, как сущности); г) автоматически генерировать несколько версий плиток с границами. Я, вероятно, предпочел бы а) обычно, но YMMV, и это немного зависит от вашего общего дизайна двигателя и степени художественной гибкости, которую вы хотите иметь. - person mikera; 19.03.2013