【问题标题】:LibGDX Box2D Tiled map artifactsLibGDX Box2D 平铺地图工件
【发布时间】:2016-07-08 18:40:30
【问题描述】:

我在 LibGDX 中渲染平铺地图时遇到问题。当我移动相机时出现伪影。

这是我的带有边距和间距(片段)的图块集: 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);
}

...

我读到了tileset 中的间距有帮助。但它仍然无法正常工作。


编辑:

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”文件:

在平铺编辑器中,我将属性添加到名为“atlas”的地图中,值“TilesetBig.txt”。

现在,地图不显示图块。 box2d 的障碍物仍然可见。我能做错什么?


最后我使用了 OrthoCachedTiledMapRendered。

【问题讨论】:

    标签: java libgdx box2d artifacts tiled


    【解决方案1】:

    您应该在设置了 最近 纹理过滤器的情况下打包您的图块集。

    如果您使用 Linear 之一,则 GL 会使用周围的一个平均边界像素,这会导致此类故障。

    Read this article 获取有关 LibGDX 中纹理过滤器的更多信息。

    【讨论】:

    • 谢谢。我编辑我的问题。我尝试使用最近的过滤器,但它仍然不起作用。
    • 你在 Texture Packer 中也使用过“减少边框伪影”吗?
    • 我不使用纹理打包器。我在 Gimp 中准备了一个在瓷砖之间有空格的图形。我知道我必须使用它?
    • 是的,您绝对应该使用 TexturePacker - 它比手动制作要方便得多:) 免费版本应该足以满足您的目的。我想在您准备好的图形中,边界上有一些几乎透明的伪影,它们会引起问题
    • 这很简单,Gimp 有一个插件可以做到这一点:)。好的,我试试这个解决方案。但是我有一张瓷砖的大图,所以我把它放到纹理打包器中,他会为我创建一个现成的图形(带空格)和一个数据文件?
    猜你喜欢
    • 2016-01-24
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多