如何在Libgdx中设置屏幕的宽度和高度?

4

抱歉,我无法清晰地描述我的问题。我重新说明一下:

  1. 我正在使用libgdx制作一个安卓游戏,并且现在已经完成了一个演示版:

演示版

它只有一个游戏视图,由GameScreen类实现,该类是libgdx中Screen的子类:

public class LaohuGame extends Game {

public static final int FRUIT_NUM = 24;
public static final String WORK_DIR = "Desktop/assets/";

@Override
public void create() {
    GameScreen gameScreen = new GameScreen(this);
    setScreen(gameScreen);

}

public class GameScreen extends LaohuScreen {

private final Stage stage;
public static int START_X = 11;
public static int START_Y = 199;

public GameScreen(Game game) {
    super(game);
    stage = new Stage(GAME_WIDTH,GAME_HEIGHT,true);
    //add actors to the stage
}

public class LaohuScreen implements Screen{

int GAME_WIDTH;
int GAME_HEIGHT;
protected Game game;
public LaohuScreen(Game game) {
    this.game = game;
    GAME_WIDTH = Gdx.graphics.getWidth();
    GAME_HEIGHT = Gdx.graphics.getHeight();
}

GAME_WIDTH,GAME_HEIGHT是手机屏幕的宽度和高度,所以游戏画面会填满整个手机屏幕。

  1. 现在我要继续开发我的游戏。我想要在游戏中有4个游戏视图。每个游戏视图通过libgdx的Screen子类实现。我认为完成后的游戏应该像这张图片一样:

Completed game

一个按钮条被添加到手机屏幕底部。当我点击其中之一的4个按钮时,游戏视图会切换,但按钮条不会切换。例如,如果玩家点击"Rank"按钮,游戏将把视图设置为排名视图(由排名屏幕实现),显示玩家得分,并且按钮仍然可见:

After pressing rank button

  1. 我能想到两种方法来保持按钮条的可见性:

    1. 将按钮条和游戏视图结合成一个libgdx的Screen。我认为这是一个浪费,因为我需要在每个屏幕中绘制4个按钮,在4个屏幕中总共需要16个按钮。

    2. 将手机屏幕分成两个区域;游戏视图区域和按钮条区域。游戏视图区域由libgdx的Screen实现,我可以通过setScreen方法切换游戏视图。问题是libgdx的Screen似乎总是填满整个手机屏幕;我无法设置屏幕的宽度和高度。我尝试使用resize(int width, int height)方法来减小屏幕高度,留出一个空白区域给按钮条,但它不起作用。

代码:

public class LaohuGame extends Game {

public static final int FRUIT_NUM = 24;
public static final String WORK_DIR = "Desktop/assets/";


@Override
public void create() {
    GameScreen gameScreen = new GameScreen(this);
    setScreen(gameScreen);

}

@Override
public void setScreen(Screen screen) {
    super.setScreen(screen);
    this.getScreen().resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight() * 5 / 10);
}

@Override
public void resize(int width, int height) {
    if (getScreen() != null) getScreen().resize(width, height * 5 / 10);
}
}

非常感谢您的建议。


嘿,如果你能和我们分享你尝试做什么或者卡在哪里了,那就太好了。 - Kumar Saurabh
你可能想要包含一些代码来展示你目前为止所做的。你也应该指出在代码的哪个点上遇到了困难。我假设你正在使用Java,但如果不是,那么你应该明确说明。可能还需要解释一下你对“游戏视图”和“屏幕”的概念,或者告诉我们你正在使用哪个开发环境。 - Mark
1
@Mark,我重新编辑了我的帖子,你能再看一下吗?提前感谢! - user2692131
@Kumar-Saurabh 我重新编辑了我的帖子,你能再看一下吗?提前感谢! - user2692131
我不是Java专家,但我认为你增加了获得答案的机会。这些图片无法使用,它们显示为文件路径。 - Mark
我是stackoverflow的新用户。我的声望还不足以在帖子中添加链接或图片,所以我只能添加图片URL。该图片URL可以在另一个浏览器选项卡中打开。对此给您带来的不便深感抱歉。 - user2692131
1个回答

1
所有的libgdx东西都假定宽度和高度始终等于“窗口”大小。在桌面机器上,这可能小于整个屏幕大小,但它仍将填充整个渲染区域。在手机上,它很可能总是手机的显示大小。
将其设置为较小的值将没有帮助,因为它不会仅使用部分渲染区域。相反,你会得到奇怪拉伸的结果。
不要更改从resize方法中获取的值。而是采用你的第一个解决方案,在游戏屏幕的底部部分渲染按钮。
你不需要在这里复制任何代码。实现类似于“ButtonBarGUI”的东西,它使用舞台和scene2d.ui工具在屏幕底部渲染四个按钮,然后只需重用此辅助类通过Stage.draw()在任何屏幕上呈现按钮栏即可。

谢谢你的回答!第一种解决方案是实现我的游戏的唯一方式吗? - user2692131
@user2692131 我非常确定这是正确的方法。可能有一些奇怪的技巧可以将屏幕渲染区域分成两部分,涉及复制帧缓冲等操作,但这只会引起很多问题。我描述的方法是有效的,并且其他人也是这样做的。 - noone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接