Я новичок в LibGDX и пытался реализовать фон параллакса. Все шло хорошо, пока я не столкнулся с такой проблемой: при прокрутке фона я получаю полосы. Вы можете увидеть его в прилагаемом изображении:Проблема с выпуском текстуры LibGDX
Так что я смотрел глубже в проблему и выяснил, что это какое-то текстура кровотечения. Но дело в том, что у моих текстур уже установлен фильтр [Linear, Nearest], а TexturePacker использует duplicatePadding
. На самом деле, я не знаю других методов решения этой проблемы. Пожалуйста помоги!
Вот некоторые из моего кода:
TexturePacker
TexturePacker.Settings settings = new TexturePacker.Settings();
settings.minWidth = 256;
settings.minHeight = 256;
settings.duplicatePadding = true;
TexturePacker.process(settings, "../../design", "./", "textures");
AssetLoader
textureAtlas = new TextureAtlas(Gdx.files.internal("textures.atlas"));
for (int i = 0; i < 2; i++) {
Background.skies.add(textureAtlas.findRegion("background/sky", i));
Background.skies.get(i).getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Nearest);
}
for (int i = 0; i < 2; i++) {
Background.clouds.add(textureAtlas.findRegion("background/cloud", i));
Background.clouds.get(i).getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Nearest);
}
for (int i = 0; i < 8; i++) {
Background.cities.add(textureAtlas.findRegion("background/city", i));
Background.cities.get(i).getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Nearest);
}
Background.moon = textureAtlas.findRegion("background/moon");
Background.forest = textureAtlas.findRegion("background/forest");
Background.road = textureAtlas.findRegion("background/road");
Background.moon.getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Nearest);
Background.forest.getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Nearest);
Background.road.getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Nearest);
BackgroundDrawer
private void drawParallaxTextureList(Batch batch, List<TextureAtlas.AtlasRegion> list,
float moveX, float posY) {
for (int i = 0; i < list.size(); i++) {
boolean needDraw = false;
float shift = GameScreen.VIEWPORT_WIDTH * i;
float drawX = 0.0f;
if (shift - moveX <= -(GameScreen.VIEWPORT_WIDTH)) { // If it's behind the screen
if (i == 0) { // If it's first element
if (moveX >= GameScreen.VIEWPORT_WIDTH * (list.size() - 1)) { // We need to show first after last
needDraw = true;
drawX = (GameScreen.VIEWPORT_WIDTH) - (moveX - ((GameScreen
.VIEWPORT_WIDTH) * (list.size() - 1)));
}
}
} else if (shift - moveX < (GameScreen.VIEWPORT_WIDTH - 1)) {
needDraw = true;
drawX = shift - moveX;
}
if (needDraw) {
batch.draw(list.get(i), (int) drawX, (int) posY);
}
}
}
ПРИМЕЧАНИЕ: Я не использую камеру для рисования прямо сейчас. Я использую только FitViewport
с размером 1920x1280
. Кроме того, кровотечение иногда появляется даже при разрешении FullHD.
UPDATE: Установка обоих Nearest
фильтров для минификация и magification с увеличением paddingX
и отключение сглаживания решить проблему, но окончательное изображение становится слишком некрасиво! Есть ли способ избежать отключения сглаживания? Потому что без него, скудные выглядят ужасно.
Помогает ли отключить сглаживание, если вы оставите фильтр линейным? Почему вы все равно используете сглаживание в 2D-игре? – Tenfour04