2013-03-19 1 views
1

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

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

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

Что было бы хорошим путем для этого?

ответ

1

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

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

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

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

+0

Хорошо, поэтому, сделав это, мне пришлось бы превратить мои деревья, производителей и т. Д. В сущности, что на самом деле не было бы проблемой. Это мило. Но что, если я хочу «смешать» плитки? Примером является переход от травы к песку: мне нужна была бы граница травы внутри песчаной черепицы. Что я хотел сделать, так это сделать эту границу новой плиткой и просто нарисовать ее над песком, для чего потребуется 2 плитки в одном и том же месте (или нет?). – Thiago

+0

несколько способов реализации границ: a) просто обнаружить их и нарисовать их при рендеринге; b) использовать их как сущности; c) реализовать наложения черепицы (несколько фрагментов на квадрат, например сущности); d) автоматически генерировать несколько версий плиток с границами. Я бы предпочел а), как правило, но YMMV, и это немного зависит от вашего общего дизайна движка и количества художественной гибкости, которую вы хотите иметь. – mikera

+0

Я попробую первый способ, спасибо. – Thiago