Подсветка плитки с прозрачностью

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

Мои рамки

Чтобы сделать подсветку возможной, я использую цикл for:

for(int s = 0;s<7;){ for (int i = 0;i<7;i++) { if ((inField(clickx + i,clicky + s)) && !(tileWithPlayer(clickx + i,clicky + s))) { highlight_layer.getCell(clickx + i, clicky+s).setTile(mark); } } s++; }

В этом я использую один тайл из второго слоя карты, чтобы сделать границу для определенного тайла. На данный момент эта плитка представляет собой только 2-пиксельную границу прозрачной плитки 32x32. Чтобы подсветка исчезла, я использую аналогичный цикл for, в котором плитке присваивается значение null. Выбор/отмена выбора тайлов прекрасно работает, но это, вероятно, не самый эффективный способ сделать это. Я хотел бы заменить синие рамки на цветные прозрачные коробки, что-то вроде Advance wars во время движения или как это видно ниже:

Желаемый образ

Я пытался сделать полупрозрачную плитку на втором слое в плитке, но безуспешно. Было бы неплохо, если бы была возможность применять только полупрозрачный цвет к определенным тайлам, не используя тайл второго слоя. Итак, мой вопрос: как я могу заменить эти уродливые границы на полностью цветные (полу) прозрачные плитки, чтобы добиться такого же результата, как на картинке выше?


person Dick Tracy    schedule 28.11.2014    source источник


Ответы (1)


Ну ладно. Я не специалист по плитке. Я никогда особо с ним не работал, но разве он не поддерживает импорт тайловых карт PNG? Как в... сделать полупрозрачную текстуру плитки, а затем использовать ее на своей карте на втором слое и активировать только те, которые вам действительно нужны?

В качестве альтернативы вы можете сделать это программно. Где для каждой плитки, которую вам нужно выделить, вы просто создаете новую TextureRegion с координатами вашей плитки:

    float x = tileWidth * col;
    float y = tileHight * row;

    final TextureRegion region = Assets.getRegion(...);

Таким образом, вы загружаете область текстуры, которая будет отображаться в нужном месте, когда вам это нужно. Вы даже можете (если диапазон никогда не изменится) хранить их в коллекции, а затем при каждом перемещении сдвигать их координаты на единицу в любом направлении.

По крайней мере, это был бы мой подход, ничего не знающий о Tiled.

Раньше я использовал карту HexagonTile, однако мне пришлось написать свою собственную реализацию (на основе LibGDX). Вот код, если он поможет вам лучше понять идею: https://github.com/2RSoftworks/interstellarempires/blob/master/IEMaster/IEClient/src/main/de/r2soft/empires/client/maps/hex/R2HexMapRenderer.java#L167

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

person AreusAstarte    schedule 28.11.2014
comment
Я использую этот способ прямо сейчас, чтобы показать сетку. Однако это решение не самое лучшее, так как я должен сначала нарисовать тайл, затем назначить его TiledMapTile, а затем установить значение null. отметка = highlight_layer.getCell(0, 1).getTile(); highlight_layer.getCell(0, 1).setTile(null); работает нормально, но в коде выглядит грязно :) Попробую TextureRegion. Я как-то пропустил существование этого класса :) - person Dick Tracy; 29.11.2014