3

我试图让一个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);
 }
}
4

3 回答 3

4

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

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

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

oCam.update();
spriteBatch.setProjectionMatrix(oCam.combined);
于 2012-09-26T18:53:04.350 回答
1

oCam.apply(Gdx.gl10);尝试在你之后打电话 oCam.update();

update() 仅进行计算,但您从未应用它们。

于 2012-09-26T17:12:54.793 回答
0

关于 idaNakav 的回答,我再也看不到 LibGDX 相机上的应用功能,以防其他人偶然发现!所以 update() 现在我想应该就足够了。

我的问题有点不同,我试图用透视相机将我的相机放在某些位置/lookAts,它必须被操作两次才能工作。

我在打电话:

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

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

camera.position.set(xyz), camera.lookAt(xyz), camera.up.set(xyz)
于 2015-10-08T08:16:16.627 回答