我正在开发一款类似于pokemon风格的libgdx-rpg桌面游戏(自上而下的视图)。在游戏中,我使用OrthographicCamera跟随玩家在使用Tiled创建的Tmx地图上行走。我遇到的问题是,当玩家在地图中移动时,玩家最终会跑出相机,让他跑出屏幕,而不是保持居中。我在谷歌和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;
}
}
问题如下:
player.render(delta);
它使用在Player
类中创建的SpriteBatch
这个SpriteBatch
不使用Camera
的Matrix
,因此它总是显示世界的同一部分,Player
从屏幕上消失
现在有两种可能性:
使用spriteBatch.SetProjectionMatrix(camera.combined)
。为此,您需要在Player
类中存储对camera
的引用
或者使用更干净的解决方案:将逻辑和视图分离。使用一个类来绘制地图和玩家
所以在WorldRenderer
中,你不应该调用player.render()
,而应该调用那里的播放器draw
。您可以使用renderer
的SpriteBatch
进行绘图(renderer.getSpriteBatch()
应该可以工作)。我猜这个SpriteBatch
allready使用了camera.combined
Matrix
,所以你不需要关心这个。
希望能有所帮助。