Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.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 1.5,如何拉伸以适应宽度_Java_Android_Libgdx_Sprite_Viewport - Fatal编程技术网

Java LibGDX 1.5,如何拉伸以适应宽度

Java LibGDX 1.5,如何拉伸以适应宽度,java,android,libgdx,sprite,viewport,Java,Android,Libgdx,Sprite,Viewport,在过去的几天里,我开始研究libGDX,我能够设置项目并使用SpriteBatch绘制一些精灵,但现在我被卡住了 我在屏幕上画了一些精灵,它们都在一个64x64像素宽的盒子里,我想拉伸它们以适应屏幕大小,这样就可以保留纵横比。我想我应该使用视口,但我真的不知道如何使用它。我的代码如下: @Override public void create () { cam = new OrthographicCamera(); viewport = new FitViewport(64,

在过去的几天里,我开始研究libGDX,我能够设置项目并使用SpriteBatch绘制一些精灵,但现在我被卡住了

我在屏幕上画了一些精灵,它们都在一个64x64像素宽的盒子里,我想拉伸它们以适应屏幕大小,这样就可以保留纵横比。我想我应该使用视口,但我真的不知道如何使用它。我的代码如下:

@Override
public void create () {

    cam = new OrthographicCamera();
    viewport = new FitViewport(64, 64, cam);

    batch = new SpriteBatch();
    ballTex = new Texture("Ball.png");
    balls = new Ball[6];

    balls[0] = new Ball(64 / 2 - BALLSIZE / 2, 64 - BALLSIZE, BALLSIZE, BALLSIZE);
    balls[1] = new Ball(64 - BALLSIZE, 4 * 64 / 5 - BALLSIZE, BALLSIZE, BALLSIZE);
    balls[2] = new Ball(64 - BALLSIZE, 64 / 5, BALLSIZE, BALLSIZE);
    balls[3] = new Ball(64 / 2 - BALLSIZE / 2, 0, BALLSIZE, BALLSIZE);
    balls[4] = new Ball(0, 64 / 5, BALLSIZE, BALLSIZE);
    balls[5] = new Ball(0, 4 * 64 / 5 - BALLSIZE, BALLSIZE, BALLSIZE);

    Gdx.app.setLogLevel(Application.LOG_DEBUG);
}

@Override
public void render () {

    if (Gdx.input.isTouched()) {
        Gdx.app.debug("DEBUG", "touched on coordinates " + Gdx.input.getX() + ", " + Gdx.input.getY());
        Gdx.app.debug("DEBUG", "ball size: " + balls[0].getX());
    }

    Gdx.gl.glClearColor(0.3f, 0.3f, 0.3f, 0);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.begin();
    batch.setColor(Color.RED);
    batch.draw(ballTex, balls[0].getX(), balls[0].getY(), balls[0].getWidth(), balls[0].getHeight());
    batch.setColor(Color.ORANGE);
    batch.draw(ballTex, balls[1].getX(), balls[1].getY(), balls[1].getWidth(), balls[1].getHeight());
    batch.setColor(Color.YELLOW);
    batch.draw(ballTex, balls[2].getX(), balls[2].getY(), balls[2].getWidth(), balls[2].getHeight());
    batch.setColor(Color.GREEN);
    batch.draw(ballTex, balls[3].getX(), balls[3].getY(), balls[3].getWidth(), balls[3].getHeight());
    batch.setColor(Color.CYAN);
    batch.draw(ballTex, balls[4].getX(), balls[4].getY(), balls[4].getWidth(), balls[4].getHeight());
    batch.setColor(Color.MAGENTA);
    batch.draw(ballTex, balls[5].getX(), balls[5].getY(), balls[5].getWidth(), balls[5].getHeight());
    batch.end();
}

@Override
public void resize(int width, int height) {
    viewport.update(width, height);
}
当我以不同于64x64的分辨率运行它时,精灵不会被拉伸,但它们会保持在相同的原始大小,而如果我从64x64分辨率开始,然后调整它的大小,则其行为与预期的一样,正如您在这些图片中所看到的(第一个桌面大小为128x256,第二个桌面大小为64x64,最后一个是64x64拉伸,具有我想要的行为):


另外,我发现关于libGDX的信息有点混乱,可能是由于版本之间的差异,特别是关于相机、屏幕、视口,我还不能完全理解,我将非常感激。

在渲染精灵时,您似乎没有使用视口。 您应该在
create
方法中使用

batch.setProjectionMatrix(cam.combined);

如果您没有使用
游戏
屏幕
调整大小(…)
可能不会在您的场景中调用,除非您手动执行。请在
创建()末尾添加
调整大小(Gdx.graphics.getScreenWidth(),Gdx.graphics.getScreenHeight())
方法。此外,您必须设置投影矩阵,就像Lucien在回答中所写的那样。我必须添加这两行:
cam.position.set(cam.viewportWidth/2f,cam.viewportHeight/2f,0)
cam.update()
。现在它似乎工作正常