簡體   English   中英

場景2D與視口坐標和游戲坐標的分離

[英]Scene 2D Separation from viewport coordinates and game coordinates

為了練習Java技能,我一直在開發基本的Snake游戲。 使用Java,我正在使用LibGDX和Scene2d處理所有對象。

現在,將蛇游戲的邊界設置為視口尺寸。 每當蛇到達視口外部時,都會檢查碰撞。 我正在使用一個合並到舞台中的屏幕視口,如下所示。

private AudioSnake gameCore;
private Stage gameStage;
private Image background;
private Image snakeTip;
private Image food;
private ArrayList<Image> snakeTail = new ArrayList <Image>(); // all the snake tail bits
private ScreenViewport viewport;

public GameScreen(AudioSnake audioSnake) {
    gameCore = audioSnake;
    viewport = new ScreenViewport();
    gameStage = new Stage(viewport);
    Gdx.input.setInputProcessor(gameStage); 
    uiSkin = new Skin(Gdx.files.internal("Ui/uiskin.json"));
    scoreLabel = new Label(String.format("%.0f",score),uiSkin);
    generateUi();
    generateFood();
}

碰撞檢查代碼:

    public void collisionCheck(){ // method that checks rather the snake head is touching outside the border, or inside it's own body
    if(snakeTip.getX() >= gameStage.getWidth() || snakeTip.getY() >= gameStage.getHeight() || snakeTip.getX() <= 0 || snakeTip.getY() <= 0){
        System.out.println("death activated");
        activateDeath();
    }
    else{
        for(int i = 0; i < snakeTail.size(); i++){
            if(snakeTip.getX() == snakeTail.get(i).getX() && snakeTip.getY() == snakeTail.get(i).getY()){
                System.out.println("death activated");
                activateDeath();
            }
        }
    }
}

最大的問題是游戲機制受屏幕尺寸的影響很大。 我想擁有的是蛇在其中移動的虛擬區域(幾乎像它自己的坐標系一樣),與視口分開。 至於視口,我希望它盡可能保持屏幕視口。 最好的方法是什么?

ScreenViewport在這里不是很好,因為例如,您的游戲在smaprtphone的屏幕上會很好看,而在平板電腦屏幕的中心會是一個小多邊形。 您應該考慮使用FitViewport ,它會在屏幕上添加一個條形,但可以使每個設備保持相同的舞台大小。

要定義您的虛擬屏幕應該在視口的構造函數中通過的分辨率

    private FitViewport viewport;

    public GameScreen(AudioSnake audioSnake) {
        gameCore = audioSnake;
        viewport = new ScreenViewport(SCREEN_WIDTH_IN_PX, SCREEN_HEIGHT_IN_PX);
        gameStage = new Stage(viewport);

那么您還需要覆蓋resize()方法以使視口可更新

    @Override
    public void resize(int width, int height) {
        viewport.update(width, height);
    }

同樣在render()方法中,您需要在渲染舞台之前立即應用視口

    viewport.apply();
    stage.act(delta);
    stage.draw();

完成所有這些操作之后,您可以僅使用自定義的SCREEN_WIDTH_IN_PX而不是gameStage.getWidth()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM