繁体   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