我正在尝试使用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();
}
}
}
答案 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;
(delta
在act(float delta)
方法中):
@Override
public void act(float delta) {
x += 20 * delta;
}
现在,演员总是在1秒内运行20个单位,并且在每个设备上您都会看到200个单位宽度的世界。因此,在每个设备上,演员从左到右都有10秒的时间。