2016-03-22 2 views
3

У меня проблема с отображением черепичной карты в LibGDX. Когда я перемещаю камеру, появляются артефакты.LibGDX Box2D Tiled map artifacts

Это мой Tileset с маржинальной и расстояние между ними (фрагмент): tileset

Когда я двигаю камеру появляются артефакты: artifacts

А вот мой рендеринг мирового класса.

private GameApp game; 

private OrthographicCamera gameCamera; 
private Viewport viewport; 

private TiledMap map; 
private TmxMapLoader mapLoader; 
private OrthogonalTiledMapRenderer mapRenderer; 

private MainCharacter character; 

private World world; 
private Box2DDebugRenderer worldRenderer; 

public GameplayScreen(GameApp game) { 
    this.game = game; 

    gameCamera = new OrthographicCamera(); 

    viewport = new FitViewport(
      game.getDisplayWidth()/GameApp.PPM, 
      game.getDisplayHeight()/GameApp.PPM, 
      gameCamera 
     ); 

    mapLoader = new TmxMapLoader(); 
    map = mapLoader.load("testmap1.tmx"); 
    mapRenderer = new OrthogonalTiledMapRenderer(map, 1/GameApp.PPM); 

    gameCamera.position.set(new Vector2(600/GameApp.PPM, 200/GameApp.PPM), 0); 
    gameCamera.zoom -= 0.5; 

    world = new World(new Vector2(0, -10), true); 
    worldRenderer = new Box2DDebugRenderer(); 

    BodyDef bDef = new BodyDef(); 
    PolygonShape shape = new PolygonShape(); 
    FixtureDef fDef = new FixtureDef(); 
    Body body; 

    for (MapObject mapObject : map.getLayers().get("obstacles").getObjects().getByType(RectangleMapObject.class)) { 
     Rectangle rectangle = ((RectangleMapObject) mapObject).getRectangle(); 

     bDef.type = BodyDef.BodyType.StaticBody; 
     bDef.position.set(
       (rectangle.getX() + rectangle.getWidth()/2)/GameApp.PPM, 
       (rectangle.getY() + rectangle.getHeight()/2)/GameApp.PPM 
     ); 

     body = world.createBody(bDef); 

     shape.setAsBox(rectangle.getWidth()/2/GameApp.PPM, rectangle.getHeight()/2/GameApp.PPM); 
     fDef.shape = shape; 

     body.createFixture(fDef); 
    } 

    character = new MainCharacter(world); 
} 

@Override 
public void show() { 

} 

public void handleInput(float delta) { 
    if (Gdx.input.isKeyJustPressed(Input.Keys.UP)) { 
     character.getBody().applyLinearImpulse(new Vector2(0, 3.8f), character.getBody().getWorldCenter(), true); 
    } 

    if (Gdx.input.isKeyPressed(Input.Keys.RIGHT) && character.getBody().getLinearVelocity().x <= 1) { 
     character.getBody().applyLinearImpulse(new Vector2(0.05f, 0), character.getBody().getWorldCenter(), true); 
    } 

    if (Gdx.input.isKeyPressed(Input.Keys.LEFT) && character.getBody().getLinearVelocity().x >= -1) { 
     character.getBody().applyLinearImpulse(new Vector2(-0.05f, 0), character.getBody().getWorldCenter(), true); 
    } 
} 

public void update(float delta) { 
    handleInput(delta); 

    world.step(1/60f, 6, 2); 

    gameCamera.position.x = character.getBody().getPosition().x; 
    gameCamera.position.y = character.getBody().getPosition().y; 

    gameCamera.update(); 
    mapRenderer.setView(gameCamera); 
} 

@Override 
public void render(float delta) { 
    update(delta); 

    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    mapRenderer.render(); 
    worldRenderer.render(world, gameCamera.combined); 
} 

@Override 
public void resize(int width, int height) { 
    viewport.update(width, height); 
} 

... 

Я читал, что интервал в тайнике позволяет. Но он все еще работает неправильно.


EDIT:

TmxMapLoader.Parameters par = new TmxMapLoader.Parameters(); 
    par.textureMinFilter = TextureFilter.Nearest; 
    par.textureMagFilter = TextureFilter.Nearest; 

map = mapLoader.load("testmap1.tmx", par); 

я изменить свой код, но до сих пор не работает. Поиск решений на несколько дней.


EDIT2

я попробовать еще раз. Код:

atlasMapLoader = new AtlasTmxMapLoader(); 
testMap = atlasMapLoader.load("testmap1.tmx"); 

Эта нагрузка моя карта. У меня есть файл «.txt»:

enter image description here

В Плиточном Editor добавить недвижимость на карту под названием „Атлас“ значение „TilesetBig.txt“.

Теперь на карте не отображаются плитки. Препятствия с box2d все еще видны. Что я могу сделать неправильно?


И наконец, я использовал OrthoCachedTiledMapRendered.

ответ

2

Вы должны упаковать свои плитки с помощью Ближайшие Фильтр текстуры.

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

Read this article, чтобы получить более подробную информацию о фильтрах текстур в LibGDX.

+0

спасибо. Я редактирую свой вопрос. Я пытаюсь использовать фильтр Nearest, но он все равно не работает. – Forest

+0

Вы также использовали «уменьшить артефакт границы» в Texture Packer? –

+0

Я не использую упаковщик текстуры. Я подготовил графику с пробелами между плитами в Gimp. Я понимаю, что я должен использовать его? – Forest