摄像机无法正确跟踪播放器-在屏幕外运行



我正在开发一款类似于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不使用CameraMatrix,因此它总是显示世界的同一部分,Player从屏幕上消失
现在有两种可能性:
使用spriteBatch.SetProjectionMatrix(camera.combined)。为此,您需要在Player类中存储对camera的引用
或者使用更干净的解决方案:将逻辑和视图分离。使用一个类来绘制地图和玩家
所以在WorldRenderer中,你不应该调用player.render(),而应该调用那里的播放器draw。您可以使用rendererSpriteBatch进行绘图(renderer.getSpriteBatch()应该可以工作)。我猜这个SpriteBatch allready使用了camera.combined Matrix,所以你不需要关心这个。

希望能有所帮助。

相关内容

  • 没有找到相关文章

最新更新