如何使用libgdx创建正确缩放我的精灵/纹理的正交相机?

时间:2011-10-15 21:11:04

标签: android libgdx

我正在创建一个使用libgdx的游戏,我希望在桌面上以更高的分辨率运行,但是当我在较低分辨率的android上运行它时,我希望它能正确地缩小所有内容。我已经读过,最好的方法是不要使用像素完美的相机,而是使用世界坐标,但我不知道如何正确地做到这一点。

这是我现在的代码:

@Override
public void create() {
    characterTexture = new Texture(Gdx.files.internal("character.png"));
    characterTextureRegion = new TextureRegion(characterTexture, 0, 0,  100, 150);
    batch = new SpriteBatch();


    Gdx.gl10.glClearColor(0.4f, 0.6f, 0.9f, 1);

    float aspectRatio = (float)Gdx.graphics.getWidth() / (float)Gdx.graphics.getHeight();
    camera= new OrthographicCamera(aspectRatio, 1.0f);

}

@Override
public void render() {
    GL10 gl = Gdx.graphics.getGL10();

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    camera.update();
    camera.apply(gl);
    batch.setProjectionMatrix(camera.combined);

    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    draw();
}

private void draw() {
    //batch.getProjectionMatrix().set(camera.combined);
    batch.begin();

    batch.draw(characterTextureRegion, 0, 0, // the bottom left corner of the box, unrotated
            1f, 1f, // the rotation center relative to the bottom left corner of the box
            0.390625f, 0.5859375f, // the width and height of the box
            1, 1, // the scale on the x- and y-axis
            0); // the rotation angle


    batch.end();
}

我使用的纹理是256x256,实际图像是100x150。

这是我在运行游戏时获得的结果:http://i.imgur.com/HV9Bi.png

渲染的精灵是巨大的,考虑到这是原始图像:http://i.imgur.com/q1cZT.png

制作它的最佳方法是什么,以便精灵以原始大小渲染,同时仍能保持在不同分辨率下玩游戏时能够正确缩放的能力?

我只找到了两个我不喜欢的解决方案。

  1. 如果我使用相机的像素坐标,图像会显示出来的情况,但是当我把它放在不同分辨率的手机上时,它根本没有缩放。
  2. 我可以在绘制时缩小纹理区域,但似乎有一种更好的方法,因为尝试找出正确的数字以进行缩放是非常繁琐的。

2 个答案:

答案 0 :(得分:4)

你有没有使用过Libgdx设置工具?使用它创建项目时,它会显示一个示例图像。无论你将屏幕更改为什么尺寸,它似乎都能保持正确的比例。

public class RotationTest implements ApplicationListener {
private OrthographicCamera camera;
private SpriteBatch batch;
private Texture texture;
private Sprite sprite;
Stage stage;
public boolean leonAiming = true;

@Override
public void create() {      
    float w = Gdx.graphics.getWidth();
    float h = Gdx.graphics.getHeight();

    camera = new OrthographicCamera(1, h/w);
    batch = new SpriteBatch();

    texture = new Texture(Gdx.files.internal("data/libgdx.png"));
    texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

    TextureRegion region = new TextureRegion(texture, 0, 0, 512, 275);

    sprite = new Sprite(region);
    sprite.setSize(0.9f, 0.9f * sprite.getHeight() / sprite.getWidth());
    sprite.setOrigin(sprite.getWidth()/2, sprite.getHeight()/2);
    sprite.setPosition(-sprite.getWidth()/2, -sprite.getHeight()/2);   }....

@Override
public void render() {      
    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    sprite.draw(batch);
    batch.end();

答案 1 :(得分:0)

首先,你需要修复世界的界限(我的意思是你的游戏)。在那个世界中,只有你的演员(游戏角色)应该玩。如果您正在跨越边界,请使用相机进行管理,例如向上,向下,向左和向右显示。