我正在开发一个类似于 pokemon 风格的 libgdx rpg 桌面游戏(自上而下视图)。在游戏中,当玩家在使用 Tiled 创建的 Tmx 地图周围走动时,我使用 OrthographicCamera 跟随玩家。我遇到的问题是,当玩家在地图中移动时,玩家最终会跑出镜头,让他跑出屏幕而不是保持居中。我搜索了 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);
}
}
播放器类
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;
}
}