如何在FitViewport视图中绘制精灵。 libgdx

时间:2016-03-08 14:46:11

标签: java libgdx sprite viewport resolution

  • 这里的基本问题是:如何始终将精灵保存在Fitviewport中?如何保持对视图的引用,以便有关于绘制位置的正确坐标?

我正试图将敌人产生到游戏界面。但这是由FitViewport处理的,敌人甚至玩家都可以在某些屏幕分辨率下移出FitViewport。到目前为止,问题似乎是在Y轴上。

FitViewport是这样的:

gameCamera = new OrthographicCamera();
gameCamera.setToOrtho(false);
gameViewport = new FitViewport(MyGame.WORLD_WIDTH,MyGame.WORLD_HEIGHT,gameCamera);
gameViewport.setScreenBounds(0,0,MyGame.WORLD_WIDTH,MyGame.WORLD_HEIGHT);

然后在resize()方法中像这样更新相机位置:

gameViewport.update(width,height);  //not used when using the virtual viewport in the render method.
gameCamera.position.set(player.position.x + 200,player.position.y, 0);

然后update()方法调用Player自己的update()方法,该方法包括以下几行:

//POSITION UPDATE
if (this.position.x<0) this.position.x=0;
if (this.position.x>Gdx.graphics.getWidth() - width) this.position.x= Gdx.graphics.getWidth() - width;
if (this.position.y<0) this.position.y = 0;
if (this.position.y>PlayScreen.gameViewport.getScreenHeight() - height) this.position.y = PlayScreen.gameViewport.getScreenHeight()- height;

注意X轴我还在使用Gdx.graphics维度,因为我还没有使用PlayScreen.gameViewport.getScreenHeight()(为此目的,gameViewport已设置为静态)。

同样关于敌人的spawn(这里的相关问题是它们在我看到的内部在屏幕Y之外产生)我在屏幕的update()方法中实现所有这些视口的代码:

//Alien Spawn
    if (System.currentTimeMillis() - lastZSpawn >= SpawnTimer){
        count++;
        lastZSpawn= System.currentTimeMillis();
        for (int i=0;i<count;i++){
            int x = Gdx.graphics.getWidth();
            int y = random.nextInt((int)gameViewport.getScreenHeight() - Alien.height);
            if (entities.size()<6){
               entities.add(new Alien(new Vector2(x,y),1, alienImages,(float)((0))));
            }
        }

    }

另外在这里使用gameViewport.getScreenHeight()导致Gdx.graphics没有给出正确的结果(它给了我同样的问题)。

render()方法在批处理和应用视口方面正确实现:

MyGame.batch.setProjectionMatrix(gameCamera.combined);
gameViewport.apply();
MyGame.batch.begin();

for (int i = entities.size()-1; i>=0;i--){
    entities.get(i).render();
}

2 个答案:

答案 0 :(得分:0)

在调整大小时,你永远不应该改变你的玩家或敌人的位置,这就是视口的用途,删除所有首先执行该操作的代码,使视口按预期工作,你需要创建一个新的相机实例当你调整大小时传递新的视口宽度和高度,我更喜欢让我的相机静止,所以我可以从我想要的任何地方获取它的属性,你应该做这样的事情:

public static OrthographicCamera update(int width,int height){
        instance = new OrthographicCamera(width, height);
        instance.setToOrtho(false);
        return instance;
    }

答案 1 :(得分:0)

我的问题的答案由我自己发布在我的另一个问题中,这也是由FitViewports的实现中的混乱以及在将对象绘制到游戏中时使用WorldWidth和WorldHeight属性作为参考坐标所驱动的,并且还正确设置摄像机的位置也要考虑这些值。 答案就在这里,即使它的文本而不是代码,主要是我已经在这篇文章中写的内容。 FitViewport doesnt scale properly Libgdx