使用Libgdx更新相机位置

时间:2012-09-26 15:47:20

标签: java libgdx

我试图让OrthographicCamera跟随用户控制的精灵。我根本无法让相机正确更新位置。我似乎无法看到我的代码与其他人所做的相比有什么问题。

我还在学习,在这一点上,我认为问题是由一些我现在还不完全理解的简单问题引起的。

感谢任何帮助,谢谢。

这是我的渲染器:

public class WorldRenderer {

private static final float CAMERA_WIDTH = 10;
private static final float CAMERA_HEIGHT = 7;

private World world;
private OrthographicCamera oCam;
private Hero hero;
ShapeRenderer debugRenderer = new ShapeRenderer();

/** TEXTURES **/
private Texture heroTexture;
private Texture tileTexture;

private SpriteBatch spriteBatch;
private int width, height;
private float ppuX; // Pixels per unit on the X axis
private float ppuY; // Pixels per unit on the Y axis

public void setSize (int w, int h) {
    this.width = w;
    this.height = h;
    ppuX = (float)width / CAMERA_WIDTH;
    ppuY = (float)height / CAMERA_HEIGHT;
}

public WorldRenderer(World world, boolean debug) {
    hero = world.getHero();
    this.world = world;
    spriteBatch = new SpriteBatch();        
    oCam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());   
    oCam.update();  
    loadTextures();
}


private void loadTextures() {
    tileTexture = new Texture(Gdx.files.internal("images/tile.png"));
    heroTexture = new Texture(Gdx.files.internal("images/hero_01.png"));
}

public void render() {
    oCam.update();
    spriteBatch.begin();
    spriteBatch.disableBlending();
    drawTiles();
    spriteBatch.enableBlending();
    drawHero();
    spriteBatch.end();
}

 private void drawHero() {
    spriteBatch.draw(heroTexture, hero.getPosition().x * ppuX, hero.getPosition().y * ppuY, Hero.SIZE * ppuX, Hero.SIZE * ppuY);
    oCam.position.set(hero.getPosition().x, hero.getPosition().y, 0);
 }
}

3 个答案:

答案 0 :(得分:4)

SpriteBatch管理自己的投影和转换矩阵。因此,您必须设置其矩阵(如果可能,在调用begin()之前)。

除非您需要单独访问矩阵(投影和模型视图,例如着色器),否则将投影矩阵设置为投影模型视图矩阵就足够了。

无论如何,这应该适用于您的代码:

oCam.update();
spriteBatch.setProjectionMatrix(oCam.combined);

答案 1 :(得分:1)

尝试在oCam.apply(Gdx.gl10);

之后致电oCam.update();

update()只进行计算,但你从未应用过它们。

答案 2 :(得分:0)

关于idaNakav的回答,我再也看不到LibGDX中相机的应用功能了,万一其他人偶然发现了这个问题!所以我想象的更新()应该足够了。

我的问题有点不同,我试图将相机放在某个位置/使用透视相机进行观察,并且必须采取行动两次才能工作。

我在打电话:

camera.lookAt(xyz), camera.position.set(xyz), camera.up.set(xyz)

第一次调用使相机更新为一个非常奇怪的变换。我应该这样做:

camera.position.set(xyz), camera.lookAt(xyz), camera.up.set(xyz)