【问题标题】:Libgdx Viewport with stage not working带有舞台的 Libgdx 视口不工作
【发布时间】:2015-07-29 22:27:46
【问题描述】:

2 个月前,我偶然发现我正在开发的游戏无法在其他设备上扩展的问题。 所以我决定实现视口,因为人们说这是最好的方法,也是一种简单的方法。 但是自从我开始以来已经大约 2 个月了,仍然没有一个有效的例子。我已经阅读了我能找到的每一页,多次阅读 wiki 并询问了几个人,但从未得到帮助我让它发挥作用的答案。

所以问题是我需要做 3 件事,首先我有一个舞台,这是我将所有演员都放在上面(按钮和其他东西),然后我需要我的摄像头(在这种情况下是 OrthographicCamera),然后我需要一个视口来缩放所有内容。

这是我最近的测试:http://pastebin.com/ZvZmeHLs

我的创作

@Override
    public void create () {
            cam = new OrthographicCamera(800, 600);
            viewport = new FillViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), cam);
            viewport.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
            stage = new Stage(viewport);

            atlas = new TextureAtlas("LoadingScreen.pack");
            Logo = new Image(atlas.findRegion("VeslaLogo"));
            stage.addActor(Logo);
    }

和我的调整大小

@Override
    public void resize(int Width, int Height) {
            viewport.update(Width, Height, true);

            Logo.setSize(700, 500);
            Logo.setX(Width / 2 - Logo.getWidth() / 2);
            Logo.setY(Height / 2 - Logo.getHeight() / 2);
            Logo.setOrigin(Logo.getWidth() / 2, Logo.getHeight() / 2);
    }

我最初认为它可以正常工作,在 nexus 上看起来不错,屏幕上显示了所有内容,但是当我在 s4 mini 上对其进行测试时,它变得非常大。现在我不知道这是因为我只是不了解视口还是我的想法太复杂了。我唯一知道的是我完全迷失了,不知道我还能尝试什么。因此,如果有人可以将我推向正确的方向,或者可以向我解释为什么这不起作用,那就太好了。

ps:我也用固定尺寸对其进行了测试,但由于某种原因这没有任何区别

固定大小一号样例:http://pastebin.com/mpjkP9ru

private int VIRTUAL_WIDTH = 600; 
private int VIRTUAL_HEIGHT = 900; 

@Override
    public void create () {
            stage = new Stage(new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT));
            cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT); 
    }

和我的调整大小

@Override
    public void resize(int Width, int Height) {
            Width = VIRTUAL_WIDTH;  
            Height = VIRTUAL_HEIGHT; 

            stage.getViewport().update(Width, Height, true); 
    }

如果需要更多示例或任何内容,请告诉我,我处于一种状态,我会尝试任何事情来让它发挥作用

编辑:我设法在 @donfuxx 的帮助下让它工作。对于那些对代码感兴趣的人:http://pastebin.com/8v2PB2t9

【问题讨论】:

  • 请在您的问题中直接发布您的代码,而不是在外部网站上。这也将鼓励您仅发布代码的相关部分。
  • 很抱歉你完全正确。将编辑它,谢谢

标签: java android libgdx viewport scene2d


【解决方案1】:

我个人为 1920x1080 设计了我的应用程序,只是在较小的屏幕上缩小所有内容。我的 spritebatch 相机:

camera = new OrthographicCamera(screen_width, screen_height);
batch.setProjectionMatrix(camera.combined);

确保每个屏幕上的精灵都在 -screen_width/2.0 和 screen_width/2.0 之间绘制(高度相同)

使用默认的舞台构造函数绘制 0 到 screen_width 之间的每个演员

stage = new Stage();

然后我将比例设置为:

float global_scale = 1920.0f/screen_height;
actor.setScale(global_scale);

显然还有其他方法可以做到这一点,例如使用视口。

【讨论】:

  • 看起来很有趣,让我试一试。你有理由不使用视口吗?或者只是没有理由使用它。
  • 我从来没有理由这样做,因为这种方法对我很有效。
  • 我明白了,即使我能够获得工作副本,我也会尝试一下:pastebin.com/3SrWKcEg
【解决方案2】:

在您发布的代码中,您似乎使用了错误的调整大小方法,因为您正在使用 constant (!) 值更新视口(因此您始终将宽度/高度设置为 600/900,毫不奇怪,您没有看到对不同屏幕尺寸的调整):

@Override
public void resize(int Width, int Height) {
        Width = VIRTUAL_WIDTH;  
        Height = VIRTUAL_HEIGHT; 

        stage.getViewport().update(Width, Height, true); 
}

您应该按照viewports wiki 中的建议进行操作,并设置适当的宽度/高度值:

@Override
public void resize(int width, int height) {
    // use true here to center the camera
    // that's what you probably want in case of a UI
    stage.getViewport().update(width, height, false);
}

顺便说一句:在你的 resize 方法中也去掉那个 Logo 大小的代码!

更新:我还注意到你应该更好地初始化你的视口和相机(使用具有相机参数的视口构造函数):

 cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
 viewport = new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, cam); //notice cam param here!
 stage = new Stage(viewport);

代替:

 stage = new Stage(new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT));
 cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT);

【讨论】:

  • 太好了,我让它一直工作到图片将始终保持在同一个位置。现在我有一个问题,它看起来像 width / 2 不是我的屏幕中间,这可能与我设置的虚拟宽度有关吗?
  • 关于在你的舞台中定位 ui 演员,我建议使用TableLayout
  • 谢谢 看看它似乎很有希望。顺便说一句,你介意看一下我的代码吗,因为我认为我的屏幕只占总宽度的 45% 左右是不对的。它可能与我的 V_Width 或凸轮尺寸有关?即使这在我看来也不合逻辑。 pastebin.com/pzF2YUZW
  • 您可以像在视口中一样在 cam 中设置不同的宽度/高度。尝试设置相同的值。
  • 很抱歉打扰您,这可能是我遗漏了一些明显的东西。但是将其设置为相同的 W/H 并没有改变它,正如您在此处看到的那样:hostr.co/OwWZZchZnA1Z 我确实设置了我的原点,所以它应该居中图片的中间
猜你喜欢
  • 1970-01-01
  • 2015-09-14
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多