【问题标题】:Scene 2D Separation from viewport coordinates and game coordinates场景 2D 与视口坐标和游戏坐标的分离
【发布时间】:2016-05-23 17:45:38
【问题描述】:

为了练习我的 Java 技能,我一直在开发一个基本的蛇游戏。使用 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();
            }
        }
    }
}

这样做的大问题是游戏机制受到屏幕尺寸的极大影响。我想要的是蛇在其中移动的虚拟区域(几乎就像它自己的坐标系),它与视口分开。至于视口,如果可能的话,我宁愿它仍然是屏幕视口。最好的方法是什么?

【问题讨论】:

    标签: java android libgdx scene2d


    【解决方案1】:

    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()

    【讨论】:

    • 谢谢!我接受了您的建议,并选择了合适的视口
    猜你喜欢
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多