2014-12-10 3 views
2

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

Вот видео, показывая белые вертикальные линии: https://www.youtube.com/watch?v=34V64WacMo4 Вот один, показывающий горизонтальные линии поволноваться: https://www.youtube.com/watch?v=LiozBZzxmy0

Для сравнения, вот проект, который я работал ранее в этом году без GDX. Вы можете видеть, что черепица движется плавно и без каких-либо заметных выглядит: https://www.youtube.com/watch?v=VvdPdA_253k

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

Мой партнер и я оба исследовали причину этого, и хотя мы нашли несколько возможных ответов, ничего не сработало. Решение, которое мы имеем в настоящий момент, кажется очень неправильным. Я использую Photoshop для создания листа плитки. Я держу его очень организованным, так что, когда он импортируется в Tiled, он эффективен для работы. Вот контрольный лист я работал с того, что один используется для создания вышеуказанных примеров:
enter image description here

В качестве эксперимента, мой друг создал несколько простой 32x32 плитки и использовал TexturePacker упаковать их и затем использовать те, в Плиточный. Конечный результат был этот файл:

enter image description here

Если открыть этот файл в редакторе изображений вы увидите, что он не имеет никакого смысла, плитки даже не однородны. Синяя и зеленая плитки 34х34, а красные и желтые - 35х34. Он сказал, что в TexturePacker он определил отступы и интервалы между ними до 2. Поэтому в первую очередь я смущен тем, как 32x32 плитки получают выходные данные разных размеров. Затем он сказал, что он импортировал это в Tiled и установил параметры импорта на 33x33 с интервалом и дополнением обоих 1. Карта, созданная с использованием этих плит, кажется, работает в нашем движке. Это вызывает несколько проблем.

Прежде всего, я не хочу использовать TexturePacker, потому что я не создаю свою графику плитки за один раз, у меня есть ручка мастер-плитки, созданная в организованном макете. Вывод TexturePacker является неработоспособным беспорядком при импорте в черепицу. Я чувствую, что должен уметь создавать организованные плиточные листы и не полагаться на TexturePacker. Кроме того, использование TexturePacker означало бы, что мне пришлось бы экспортировать мою основную листу, а затем вручную вырезать ее на отдельные изображения, объем работы, который включает в себя экспоненциально увеличивающую нагрузку, поэтому избежать этого было бы лучше.

Я также считаю, что выход, превращая 32x32 плитки в 34x34 и 35x34 плитки исказил бы мою графику. Это не может быть правильным способом. Как создать лист плитки, который при использовании на карте плитки и используется в GDX, который отображается так же гладко, как тот, который я продемонстрировал в своей второй видеосвязи выше?

Если интересно, вот текущая рабочая вилка нашего приложения: https://github.com/vinbreauX/DULES

ответ

9

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

public static void fixBleeding(TextureRegion[][] region) { 
    for (TextureRegion[] array : region) { 
     for (TextureRegion texture : array) { 
      fixBleeding(texture); 
     } 
    } 
} 

public static void fixBleeding(TextureRegion region) { 
    float fix = 0.01f; 

    float x = region.getRegionX(); 
    float y = region.getRegionY(); 
    float width = region.getRegionWidth(); 
    float height = region.getRegionHeight(); 
    float invTexWidth = 1f/region.getTexture().getWidth(); 
    float invTexHeight = 1f/region.getTexture().getHeight(); 
    region.setRegion((x + fix) * invTexWidth, (y + fix) * invTexHeight, (x + width - fix) * invTexWidth, (y + height - fix) * invTexHeight); // Trims 
                                       // region 
} 

Эти методы (один для массива текстур и один для только одной текстуры) слегка скорректировать изображение так, чтобы кровотечение не происходит. Регулировка настолько мала (0.01f), что он не находится вблизи видимого, но он отлично справляется с устранением вертикальных линий. Когда вы загружаете свои текстуры, просто запускайте их через метод fixBleeding(), и ваши проблемы должны быть решены.

+0

Это сделало трюк! Фантастический, и спасибо. Это элегантное решение. –

+0

спасибо! Это работает как шарм. Просто потратил полчаса, пытаясь найти способ применить прописку к моим плиткам, но это намного лучше <3 –

+0

Только решение в Интернете, которое помогло моему делу. Благодаря! –