Как убрать пробелы между плиточными текстурами?

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

Больше деталей:

  • Плитки имеют размер 32x32, и я пробовал 32x32 и 64x64.
  • Плитки расположены на расстоянии 32 пикселя друг от друга (например, первая плитка будет иметь вид x = 0 y = 0, вторая x = 32 y = 0 и т.д. В направлениях x и y).
  • Пробелы не являются артефактами текстуры, так как я проверил это.
  • Я использую TexturePacker с TexturePacker.

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

У кого-нибудь была такая же проблема или знаете как это исправить?

Ответ 1

Я получил его решить, установив duplicatePadding поле TexturePacker.Settings класса true.

Пример кода:

import com.badlogic.gdx.tools.texturepacker.TexturePacker;
import com.badlogic.gdx.tools.texturepacker.TexturePacker.Settings;

Settings settings = new Settings();
settings.maxWidth = 1024;
settings.maxHeight = 1024;
settings.duplicatePadding = true;

TexturePacker.process(settings, "source", "destination", "name");

Ответ 2

Хорошо, я здесь, чтобы спасти ваш день!

Решение называется "Edge padding". Теперь, если вы работаете с наборами таблиц, я могу заверить вас, что это сработает.

Лично я использую Tiled, который позволяет мне настраивать маржи и интервалы в моих наборах. Единственным недостатком этого является то, что вам придется использовать GIMP с этим плагином: http://registry.gimp.org/node/26044

Этот плагин позволит вам применить дополнение к вашему набору и voila! Нет более уродливых артефактов.

Ответ 3

Bleeding

Пробелы

Короткий ответ заключается в том, что это может быть ваш фильтр, который, вероятно, должен быть установлен в NEAREST.

Возможно, вы также захотите проверить рабочие руководства на Libgdx.

Ответ 4

Он назвал "кровотечение текстуры". Вам нужно добавить отступы к вашим плиткам, чтобы, когда текстура истекает кровью, она может собирать правильные пиксельные данные, чтобы заполнить пробел.

Ответ 5

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

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

Я просто добавил бросок к очень длинным десятичным знакам, которые я получил для позиции игрока:

camera.position.set((int)robot.position.x, (int)robot.position.y, 0);

Это заставило игрока двигаться очень странно и заставить его двигаться плавно снова. Я добавил бросок к его методу рендеринга, а также:

batcher.draw(robotSprite, (int)robot.position.x, (int)robot.position.y, 16, 16);

Et voilà! Отлично работает для меня.

Ответ 6

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

-

T1. Сделайте оригинальную таблицу спрайтов (без файла атласа), которая была загружена откуда-то в заполнитель 2.

A1. Это было бы невозможно для переупаковки таблицы спрайтов, у которой нет атласа, даже если вы найдете инструмент срезов/сплиттеров, это должна быть куча изображений, которые необходимо правильно упаковать для TiledMap (.tmx)

A1 (Обновлено). Сценарий, предоставленный @Nine Magics, будет лучшим способом сделать это! (Я использую это как мое окончательное решение)

-

T2. Используйте TiledMapPacker, предоставленный libgdx-nighty или gdx-toolg. Код пакета должен быть:

java -classpath "gdx.jar";"gdx-natives.jar";"gdx-backend-lwjgl.jar";"gdx-backend-lwjgl-natives.jar";"gdx-tiled-preprocessor.jar";"extensions/gdx-tools/gdx-tools.jar" com.badlogic.gdx.tiledmappacker.TiledMapPacker "PathToYourProject\android\assets\RawMap" "PathToYourProject\android\assets\Map" --strip-unused

A2. Выходной файл .tmx, который не может быть прочитан Tiled, если вы используете сложный путь к папке для категории ваших файлов .png. И выходной файл может быть не удалось загрузить с помощью AtlasTmxMapLoader.

-

T3. Коррекция положения камеры, сделать положение камеры целым числом. Код понравился @Julian или @strangecat из мерцания плиточной карты libgdx с ближайшей фильтрацией

A3. Я использую это решение без проблем, а также публикую свой код, отличный от них.

    float cameraX = (int)(mainCamera.position.x * Game.PPM_X) / Game.PPM_X;
    float cameraY = (int)(mainCamera.position.y * Game.PPM_X) / Game.PPM_X;
    float cameraZ = mainCamera.position.z;
    mainCamera.position.set(cameraX, cameraY, cameraZ);

А также загрузить его с TmxMapLoader.Parameters

    TmxMapLoader.Parameters params = new TmxMapLoader.Parameters();
    params.textureMinFilter = Texture.TextureFilter.Linear;
    params.textureMagFilter = Texture.TextureFilter.Nearest;
    params.generateMipMaps = true;
    assetManager.load(TILED_MAP_SETS.FIRST_MAP, TiledMap.class, params);

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

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

Редактировать (2018/04/21) Я обнаружил, что в Unity также возникла та же проблема, но я не проверял, есть ли в Libgdx настройка сглаживания 2x по умолчанию. Libgdx может решить проблему как Unity, отключив сглаживание.