【问题标题】:Game character move different speed in different screen size, libGDX游戏角色在不同的屏幕尺寸下移动不同的速度,libGDX
【发布时间】:2026-01-29 12:55:01
【问题描述】:

我正在尝试使用 libGDX 制作游戏,其中游戏角色将在屏幕上水平移动。我使用以下代码制作了一个示例,并在手机(宽度较小)和平板电脑(宽度较大)上进行了测试。演员在手机中的移动和消失速度比在平板电脑中更快。我该如何解决这个问题?

public class SpriteMoveTestGame extends Game {

private MyScreen screen;

@Override
public void create() {
    screen = new MyScreen();
    setScreen(screen);
}

@Override
public void dispose() {
}

private class MyActor extends Actor {

    private Texture texture;
    private float x;

    public MyActor() {
        texture = new Texture(Gdx.files.internal("badlogic.jpg"));
        x = 0.0f;
    }

    @Override
    public void act(float delta) {
        super.act(delta);
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {
        super.draw(batch, parentAlpha);
        Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
        Gdx.gl20.glClearColor(0, 1, 0, 0);
        batch.draw(texture, x, 200);
        x += 4.5f;
    }
}

private class MyScreen extends ScreenAdapter {

    private Stage stage;
    private FitViewport fitViewport;
    private MyActor actor;

    public MyScreen() {
        stage = new Stage();
        actor = new MyActor();
        stage.addActor(actor);
    }

    @Override
    public void render(float delta) {
        super.render(delta);
        stage.act();
        stage.draw();
    }
}

}

【问题讨论】:

  • 您使用的是不带摄像头的 fitviewport,因此它仅取决于屏幕分辨率。所以如果手机有800宽度分辨率(比如),桌子有1080,在手机上会更快到达屏幕边缘。您需要使用一个相机(OrthographicCamera),它会告诉 libgdx 您希望始终独立于屏幕显示多少像素/单位,并且为避免出现划痕,请使用 ExtendViewport 而不是 Fitviewport。
  • 不相关,但不要将 glclear 调用放在你的演员中。这会清除整个屏幕,因此游戏或屏幕只能执行一次,而不是演员内部。
  • @OscarO。能否提供示例代码?
  • 我不知道他们怎么知道你使用的是什么类型的视口。尽管如此,听起来您正在错误地使用视口。 LibGDX wiki 中有很多示例,或者您可以向我们展示您使用视口的代码,我们可以告诉您它有什么问题。
  • @Tenfour04 在他发布的示例代码中使用了 FitViewport

标签: java android libgdx screen


【解决方案1】:

正如 Oscar 所说,您不使用任何相机或视口,因此您使用屏幕分辨率。如果手机的宽度是 800 并且桌子的宽度是 1200 并且您所做的每一帧 actor.x += 20 演员在手机上有 40 帧,在平板电脑上有 60 帧以穿过孔宽度。

使用 Fitviewport 初始化 Stage:

private OrthographicCamera camera;
private FitViewport viewport;
private Stage stage;

@Override
public void show() {
    camera = new OrthographicCamera();
    viewport = new FitViewport(200, 200, camera);
    stage = new Stage(viewport);
}

@Override
public void resize(int width, int height) {
    stage.getViewport().update(width, height);
}

现在您有了一个视口为 200 x 200 单位的舞台。 当您现在运行应用程序时,演员将在手机和平​​板电脑这两个设备上从左到右 10 帧。

最后一个问题是您的手机可能很旧,而且速度有点慢。你的旧手机需要 0.02 秒一帧,而你的平板电脑只需要 0.016 秒一帧。
所以平板电脑上的演员比手机上要快一点。

您认为:“我的演员可以在 1 秒内运行 20 个单位。”所以首先你要做:actor.x += 20;

但问题是演员现在在一帧而不是一秒钟内运行 20 个单位。
要解决这个问题,您将 20 乘以这一帧和最后一帧之间的增量时间:actor.x += 20 * delta;deltaact(float delta) 方法中):

@Override
public void act(float delta) {
    x += 20 * delta;
}

现在您的演员总是在 1 秒内运行 20 个单位,并且在每台设备上您会看到一个 200 单位宽度的世界。所以在每台设备上,演员从左到右都有 10 秒的时间。

【讨论】:

    最近更新 更多