0

我正在开发一个类似于 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;
}

}
4

1 回答 1

1

问题如下:

player.render(delta);

它使用类中SpriteBatch创建的Player
SpriteBatch不使用 theMatrixCamera,因此它总是显示世界的同一部分,Player屏幕用完。
现在有 2 个可能性:
使用spriteBatch.SetProjectionMatrix(camera.combined). 为此,您需要存储对类camera内部的引用Player
或者使用更简洁的解决方案:分离逻辑和视图。使用一个类来绘制地图和玩家。
因此,WorldRenderer与其打电话给player.render()你,不如draw让玩家在那里。您可以使用renderersSpriteBatch进行绘图(renderer.getSpriteBatch()应该可以)。我想这已经SpriteBatch使用camera.combined Matrix所以你不需要关心这个。

希望能帮助到你。

于 2014-10-09T07:13:00.597 回答