代码之家  ›  专栏  ›  技术社区  ›  Forest

LibGDX Box2D平铺贴图工件

  •  3
  • Forest  · 技术社区  · 9 年前

    我在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);
    }
    
    ...
    

    我读到平铺集中的间距有帮助。但它仍然不能正常工作。


    编辑:

    TmxMapLoader.Parameters par = new TmxMapLoader.Parameters();
      par.textureMinFilter = TextureFilter.Nearest;
      par.textureMagFilter = TextureFilter.Nearest;
    
    map = mapLoader.load("testmap1.tmx", par);
    

    我编辑了我的代码,但仍然无法工作。在几天内寻找解决方案。


    编辑2

    我再试一次。代码:

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

    这加载了我的地图。我有“.txt”文件:

    enter image description here

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

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


    最后我使用了OrthoCachedTiledMapRendered。

    1 回复  |  直到 9 年前
        1
  •  2
  •   m.antkowicz    9 年前

    你应该用 最近的 纹理过滤器被设置。

    如果您正在使用 线性的 一个是GL使用周围的像素来平均边界像素,这会导致这样的问题。

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