Обновление положения камеры с помощью 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);
 }
}

person Zifendale    schedule 26.09.2012    source источник


Ответы (3)


SpriteBatch управляет собственными матрицами проецирования и преобразования. Итак, вы должны установить его матрицы (если возможно, до вызова begin()).

Если вам не требуется отдельный доступ к вашим матрицам (проекция и представление модели, например, в шейдерах), будет достаточно установить матрицу проекции на матрицу представления проекции модели.

В любом случае, это должно работать в вашем коде:

oCam.update();
spriteBatch.setProjectionMatrix(oCam.combined);
person aacotroneo    schedule 26.09.2012

попробуйте позвонить oCam.apply(Gdx.gl10); после вашего oCam.update();

update() только выполняет вычисления, но вы никогда их не применяли.

person idanakav    schedule 26.09.2012
comment
Я пробовал это немного, но не мог заставить его работать. Использование «oCam.apply(Gdx.gl10);» заставляет мою программу иметь NullPointerException в строке применения, когда я пытаюсь скомпилировать. - person Zifendale; 26.09.2012

Что касается ответа idaNakav, я больше не вижу функцию применения на камерах в LibGDX, на случай, если кто-то еще наткнется на это! Так что update() должно быть достаточно сейчас, я думаю.

Моя проблема была немного в другом, я пытался поместить свою камеру в определенные положения / взгляды с перспективной камерой, и для ее работы нужно было дважды выполнить действие.

Я звонил:

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

Первый вызов заставил камеру обновиться до действительно странного преобразования. Я должен был делать:

camera.position.set(xyz), camera.lookAt(xyz), camera.up.set(xyz)
person CMash    schedule 08.10.2015