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
игрок там. Вы могли бы использовать renderer
s SpriteBatch
для рисования (renderer.getSpriteBatch()
должно сработать). Я думаю, что это SpriteBatch
уже использует camera.combined
Matrix
так что вам не нужно заботиться об этом.
Надеюсь, поможет.