Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-LibGDX-渲染平铺贴图过程中的问题 问题_Java_Android_Libgdx_Tiled_Tmx - Fatal编程技术网

Java-LibGDX-渲染平铺贴图过程中的问题 问题

Java-LibGDX-渲染平铺贴图过程中的问题 问题,java,android,libgdx,tiled,tmx,Java,Android,Libgdx,Tiled,Tmx,我似乎无法使平铺贴图正确渲染。我使用LibGDX作为加载地图的库(1.6.0版) 视频演示 我制作了一个视频,向您展示实际问题,并通过跳过整个解释过程使事情变得更简单。去吧 我用过的代码 我尝试过的解决方案 我试过用不同的数字来表示相机的x和y,但运气不好。我还尝试将相机转换到正确的位置(硬编码),以及使用另一个贴图(不同的瓷砖贴图和尺寸),但这也不起作用 结论 我似乎找不到解决这个问题的办法。非常感谢您的帮助。非常感谢。快速介绍 好的,过了一段时间,我通过硬编码解决了这个问题。但是它工作正常,

我似乎无法使平铺贴图正确渲染。我使用LibGDX作为加载地图的库(1.6.0版)

视频演示 我制作了一个视频,向您展示实际问题,并通过跳过整个解释过程使事情变得更简单。去吧

我用过的代码 我尝试过的解决方案 我试过用不同的数字来表示相机的xy,但运气不好。我还尝试将相机转换到正确的位置(硬编码),以及使用另一个贴图(不同的瓷砖贴图和尺寸),但这也不起作用

结论 我似乎找不到解决这个问题的办法。非常感谢您的帮助。非常感谢。

快速介绍 好的,过了一段时间,我通过硬编码解决了这个问题。但是它工作正常,所以我对它很满意

我做了什么来解决这个问题
  • 首先,我找到了放大平铺地图所需的确切数字,即:
    3.125f
  • 然后,我用自己的单位(我从一开始就应该这样做),而不是用像素作为相机
  • 在做了这两件事之后,我注意到地图被放大了很多。因此,通过使用
    InputProcessor
    中的
    scrolled
    方法,我设法找到了地图必须“取消缩放”的确切数字
  • 我还发现,如果我从
    Orthographic Camera
    对象调用
    setToorTo(false)
    方法,它会出于某种奇怪的原因将地图放大19倍。如果未调用该方法,则仅将贴图放大一次
我当前使用的代码 笔记
  • 我用于
    宽度
    高度
    变量的数字工作正常,严格地平铺贴图的宽度为80个平铺,高度为45个平铺
  • 如果你面临同样的问题,你必须根据你使用的单位数量,找到适当的数字来放大/缩小你的地图试错是您唯一的指南。如果我们忽略堆栈溢出,当然

  • “平铺贴图未正确渲染”是什么意思?我看了视频,但看不出有什么问题。@JoOko它被放置在整个窗口的一个随机位置,正如您在视频中看到的,地图的角不在窗口的角上。换句话说,地图不会拉伸以适应屏幕的尺寸,而只是“坐”在那里,不管我把相机的x和y坐标放在哪里。我希望这件事能澄清。非常感谢您的帮助。提前谢谢。
    protected Level level;
    protected OrthogonalTiledMapRenderer mapRenderer;
    protected OrthographicCamera camera;
    protected TiledMap map;
    protected MainGameLoop game;
    protected SpriteBatch batch;
    private BitmapFont font;
    private int w, h;
    
    public Level1(MainGameLoop game) {
        this.game = game;
    }
    
    @Override
    public void show() {
        w = Gdx.graphics.getWidth();
        h = Gdx.graphics.getHeight();
        int CAMERA_WIDTH = 800;
        int CAMERA_HEIGHT = 450 * (w / h);
        camera = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT);
        camera.setToOrtho(false);
        camera.update();
        map = new TmxMapLoader().load("maps/map1.tmx");
        mapRenderer = new OrthogonalTiledMapRenderer(map);
        Gdx.input.setInputProcessor(this);
        font = new BitmapFont();
        font.setColor(Color.BLUE);
        batch = new SpriteBatch();
    }
    
    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        camera.update();
        mapRenderer.setView(camera);
        mapRenderer.render();
        batch.begin();
        font.draw(batch, "Camera zoom: " + camera.zoom, 40, 40);
        batch.end();
    }
    
    @Override
    public void resize(int width, int height) {
        camera.viewportWidth = width;
        camera.viewportHeight = height;
        camera.update();
    }
    
    @Override
    public void dispose() {
        mapRenderer.dispose();
        map.dispose();
        background.dispose();
        Gdx.input.setInputProcessor(null);
    }
    
    @Override
    public boolean scrolled(int amount) {
        camera.zoom += amount;
        camera.update();
        return true;
    }
        // Here go the rest of the methods, such as pause, resume, hide, keyDown, keyUp, keyTyped, touchDown, touchUp, touchDragged & mouseMoved.
    
    TiledMap tiledMap;
    OrthographicCamera camera;
    TiledMapRenderer tiledMapRenderer;
    
    final float WIDTH = 8000;
    final float HEIGHT = 4500;
    final float num = 3.125f;
    @Override
    public void show() {
        tiledMap = MapLoader.realm1_level1;
        tiledMapRenderer = new OrthogonalTiledMapRenderer(tiledMap, num);
        camera = new OrthographicCamera(WIDTH, HEIGHT);
        Gdx.input.setInputProcessor(this);
        camera.zoom += 1f;
        camera.update();
    }
    
    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        tiledMapRenderer.setView(camera);
        tiledMapRenderer.render();
    }
    // This method was just used for testing to see where 
    // the map was or should have been placed.
    @Override
    public boolean keyDown(int keycode) {
        if (keycode == Input.Keys.LEFT)
            camera.translate(-32, 0);
        if (keycode == Input.Keys.RIGHT)
            camera.translate(32, 0);
        if (keycode == Input.Keys.UP)
            camera.translate(0, 32);
        if (keycode == Input.Keys.DOWN)
            camera.translate(0, -32);
        if (keycode == Input.Keys.NUM_1)
            tiledMap.getLayers().get(0).setVisible(!tiledMap.getLayers().get(0).isVisible());
        return true;
    }
    
    @Override
    public void resize(int width, int height) {
        camera.position.set(WIDTH, HEIGHT, 0);
        camera.update();
    }
    
    @Override
    public boolean scrolled(int amount) {
        camera.zoom += amount;
        camera.update();
        return true;
    }
    
    @Override
    public void dispose() {
        tiledMap.dispose();
    }
    // And here go the rest of the methods that come from the 
    //Screen and the InputProcessor interfaces.