游戏角色在不同屏幕大小下移动不同的速度,libGDX

时间:2018-08-31 14:32:28

标签: java android libgdx screen

我正在尝试使用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();
    }
}

}

1 个答案:

答案 0 :(得分:0)

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

要使用Fitviewport初始化舞台,请执行以下操作:

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秒。
因此,平板电脑上的actor比手机上要快一点。

您认为:“我的演员可以在一秒钟内运行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秒的时间。