Как убрать пробелы между плиточными текстурами?
Я использую 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, отключив сглаживание.