为什么我的演员没有在LibGDX中使用正确的界限?

时间:2017-04-18 13:48:35

标签: java libgdx

我一直在努力让这个阶段的事情搞清楚。我基本上想要绘制一个填满整个舞台的背景图像。图像是1920x1080。问题是图像被绘制的宽度的一半和高度应该是它的一半。应用程序设置为全屏,图像的内角位于屏幕的中心。我测试了相机,视口和舞台的尺寸。全部正确。我究竟做错了什么?顺便说一句,我使用自定义游戏状态管理器来处理不同的屏幕,所以我为看似无用的额外代码道歉。

Application.java

public class Application extends ApplicationAdapter {

    public static boolean DEBUG = false;
    public static final String TITLE = "Hexatan";
    public static final int V_WIDTH = 720, V_HEIGHT = 480;
    public static final float SCALE = 2.0f;

    private GameStateManager gsm;
    private OrthographicCamera camera;
    private FitViewport vp;
    private SpriteBatch batch;
    private Stage stage;
    private float w, h;

    @Override
    public void create() {
        float w = Gdx.graphics.getWidth();
        float h = Gdx.graphics.getHeight();

        batch = new SpriteBatch();

        camera = new OrthographicCamera();
        camera.setToOrtho(true, w / SCALE, h / SCALE);
        vp = new FitViewport(w, h, camera);
        stage = new Stage(vp, batch);
        gsm = new GameStateManager(this);

    }

    @Override
    public void render() {
        gsm.update(Gdx.graphics.getDeltaTime());
        gsm.render();
    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void dispose() {
        gsm.dispose();
        batch.dispose();
    }

    @Override
    public void resize(int width, int height) {
        gsm.resize((int)(width / SCALE), (int)(height / SCALE));
    }

    public SpriteBatch getBatch() {
        return this.batch;
    }

    public OrthographicCamera getCamera(){
        return this.camera;
    }

    public Stage getStage(){
        return this.stage;
    }
}

GameStateManager.java

public class GameStateManager {

    private final Application app;
    private Stack<GameState> states;
    public enum State {
        SPLASH, MAINMENU, GAME
    }

    public GameStateManager(final Application app){
        this.app = app;
        this.states = new Stack<GameState>();
        this.setState(State.GAME);
    }

    public Application getApp(){
        return app;
    }

    public void update(float delta){
        states.peek().update(delta);
    }

    public void render(){
        states.peek().render();
    }

    public void dispose(){
        for(GameState gs : states){
            gs.dispose();
        }
        states.clear();
    }

    public void resize(int w, int h){
        states.peek().resize(w, h);
    }

    public void setState(State state){
        if(states.size() >= 1) {
            states.pop().dispose();
        }
        states.push(getState(state));
    }

    public GameState getState(State state){
        return new GameLoop(this);
    }
}

GameState.java

public abstract class GameState {

    protected GameStateManager gsm;
    protected Application app;

    protected SpriteBatch batch;
    protected OrthographicCamera camera;

    public GameState(GameStateManager gsm){
        this.gsm = gsm;
        this.app = gsm.getApp();
        batch = app.getBatch();
        camera = app.getCamera();

    }

    public void resize(int w, int h){
        camera.setToOrtho(true, w, h);
        camera.update();
    }

    public abstract void update(float delta);
    public abstract void render();
    public abstract void dispose();
}

GameLoop.java

public class GameLoop extends GameState {

private boolean DEV_MODE = true;
private int WIDTH, HEIGHT;
private float mouseX, mouseY;
private Stage stage;
private Game game;
private Application app;
Texture hexture, water, island, robber, highlight, scoreboard;
BitmapFont font = new BitmapFont(Gdx.files.internal("core/assets/Playbill.fnt"));
BitmapFont devFont = new BitmapFont(Gdx.files.internal("core/assets/Arial.fnt"));

public GameLoop(GameStateManager gsm){
    super(gsm);
    app = gsm.getApp();
    WIDTH = Gdx.graphics.getWidth();
    HEIGHT = Gdx.graphics.getHeight();
    stage = app.getStage();
    System.out.println(stage.getCamera().position.x);
    Gdx.input.setInputProcessor(stage);
    water = new Texture(Gdx.files.internal("core/assets/img/water.png"));
    island = new Texture(Gdx.files.internal("core/assets/img/island.png"));
    highlight = new Texture(Gdx.files.internal("core/assets/img/highlightVertex.png"));
    scoreboard = new Texture(Gdx.files.internal("core/assets/img/scoreboard.png"));

    Image waterImg = new Image(new TextureRegionDrawable(new TextureRegion(water)));
    waterImg.setWidth(WIDTH);
    waterImg.setHeight(HEIGHT);
    stage.addActor(waterImg);

}

@Override
public void render() {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    app.getStage().act(Gdx.graphics.getDeltaTime());
    app.getStage().draw();
}

@Override
public void update(float delta) {
}

@Override
public void dispose() {

}
@Override
public void resize(int w, int h){
    camera.setToOrtho(true, w, h);
    app.getStage().getViewport().update(w, h, true);
}

0 个答案:

没有答案