简体   繁体   English

LibGDX Box2D平铺地图工件

[英]LibGDX Box2D Tiled map artifacts

I have a problem with rendering tiled map in LibGDX. 我在LibGDX中渲染平铺地图时遇到问题。 When I move the camera appear artifacts. 当我移动相机时出现伪影。

This is my tileset with margin and spacing (fragment): tileset 这是我的tileset,边距和间距(片段): tileset

When I move the camera appear artifacts: artifacts 当我移动相机时出现伪影: 文物

And here is my rendering world class. 这是我的渲染世界课。

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);
}

...

I read that the spacing in the tileset help. 我读到了tileset中的间距有帮助。 But it still does not work properly. 但它仍然无法正常工作。


EDIT: 编辑:

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

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

I edit my code, but still not work. 我编辑我的代码,但仍然无法正常工作。 Seeking solutions for a few days. 寻求解决方案几天。


EDIT2 EDIT2

I try again. 我再试试。 Code: 码:

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

This load my map. 这加载了我的地图。 I have ".txt" file: 我有“.txt”文件:

在此输入图像描述

In Tiled Editor I add property to a map called "atlas" value "TilesetBig.txt". 在Tiled Editor中,我将属性添加到名为“atlas”值“TilesetBig.txt”的地图中。

Now, the map does not display tiles. 现在,地图不显示图块。 Obstacles with box2d are still visible. box2d的障碍仍然可见。 What can I do wrong? 我该怎么办?


Finally i used OrthoCachedTiledMapRendered. 最后我使用了OrthoCachedTiledMapRendered。

You should pack your tileset with Nearest texture filter being set. 您应该使用最近的纹理过滤器打包您的tileset。

If you are using Linear one the GL is averaging border pixels using surrounding one what causes glitches like this. 如果你使用的是线性,那么GL使用周围的像素平均边界像素会导致像这样的毛刺。

Read this article to get more information about texture filters in LibGDX. 阅读本文以获取有关LibGDX中纹理过滤器的更多信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM