libgdx - камера не следит за плеером - убегает с экрана

Я занимаюсь разработкой настольной игры libgdx rpg, похожей на стиль покемонов (вид сверху вниз). В игре я использую OrthographicCamera, чтобы следить за игроком, когда он ходит по карте Tmx, созданной с использованием Tiled. Проблема, с которой я сталкиваюсь, заключается в том, что когда игрок перемещается по карте, игрок в конечном итоге выходит, запускает камеру, заставляя его убегать с экрана, а он остается в центре. Я искал Google и YouTube, не найдя ничего, что решает проблему.

WorldRenderer.class

public class WorldRenderer {

private TiledMap map;
private OrthogonalTiledMapRenderer renderer;
public OrthographicCamera camera;
private Player player;

TiledMapTileLayer layer;


public WorldRenderer() {
    map = new TmxMapLoader().load("maps/testMap2.tmx");
    renderer = new OrthogonalTiledMapRenderer(map);

    player = new Player();
    camera = new OrthographicCamera();
    camera.viewportWidth = Gdx.graphics.getWidth()/2;
    camera.viewportHeight = Gdx.graphics.getHeight()/2;
}
public void render (float delta) {
    camera.position.set(player.getX() + player.getWidth() / 2, player.getY() + player.getHeight() / 2, 0);
    camera.update();
    renderer.setView(camera);
    renderer.render();
    player.render(delta);
}
}   

Player.class

public class Player {

public Vector2 position; 
private float moveSpeed;
private SpriteBatch batch;

//animation
public Animation an;
private Texture tex;
private TextureRegion currentFrame;
private TextureRegion[][] frames;
private float frameTime;

public Player(){
    position = new Vector2(100, 100);
    moveSpeed = 2f;
    batch = new SpriteBatch();
    createPlayer();
}

public void createPlayer(){
    tex = new Texture("Sprites/image.png");
    frames = TextureRegion.split(tex, tex.getWidth()/3, tex.getHeight()/4);
    an = new Animation(0.10f, frames[0]);
}

public void render(float delta){
    handleInput();

    frameTime += delta;
    currentFrame = an.getKeyFrame(frameTime, true);

    batch.begin();
    batch.draw(currentFrame, position.x, position.y, 50, 50);
    batch.end();
}

public void handleInput(){
    if(Gdx.input.isKeyPressed(Keys.UP)){
        an = new Animation(0.10f, frames[3]);
        position.y += moveSpeed;
    }
    if(Gdx.input.isKeyPressed(Keys.DOWN)){
        an = new Animation(0.10f, frames[0]);
        position.y -= moveSpeed;
    }
    if(Gdx.input.isKeyPressed(Keys.LEFT)){
        an = new Animation(0.10f, frames[1]);
        position.x -= moveSpeed;
    }
    if(Gdx.input.isKeyPressed(Keys.RIGHT)){
        an = new Animation(0.10f, frames[2]);
        position.x += moveSpeed;    
    }
    if(!Gdx.input.isKeyPressed(Keys.ANY_KEY)){
        an = new Animation(0.10f, frames[0]);
    }
}

public void dispose(){
    batch.dispose();
}

public float getX(){
    return position.x;
}

public float getY(){
    return position.y;
}

public int getWidth(){
    return 32;
}

public int getHeight(){
    return 32;
}

}

1 ответ

Решение

Проблема заключается в следующем:

player.render(delta);

Который использует SpriteBatch создан в Player учебный класс.
это SpriteBatch не использует Matrix из Camera и поэтому он всегда показывает ту же часть мира, где Player выбегает из экрана.
Теперь есть 2 возможности:
использование spriteBatch.SetProjectionMatrix(camera.combined), Для этого вам необходимо сохранить ссылку на camera внутри Player учебный класс.
Или используйте более чистое решение: разделите логику и представление. Используйте один класс для рисования карты и игрока.
Так что в WorldRenderer вместо звонка player.render() вам следует draw игрок там. Вы могли бы использовать renderers SpriteBatch для рисования (renderer.getSpriteBatch() должно сработать). Я думаю, что это SpriteBatch уже использует camera.combinedMatrix так что вам не нужно заботиться об этом.

Надеюсь, поможет.

Другие вопросы по тегам