Java 游戏人物在不同屏幕大小下移动速度不同,libGDX
我正在尝试用libGDX制作一个游戏,其中一个游戏角色将在屏幕上水平移动。我用以下代码制作了一个样本,并在手机(较小宽度)和平板电脑(较大宽度)上进行了测试。演员在手机中移动和消失的速度比在平板电脑中快。我怎样才能解决这个问题Java 游戏人物在不同屏幕大小下移动速度不同,libGDX,java,android,libgdx,screen,Java,Android,Libgdx,Screen,我正在尝试用libGDX制作一个游戏,其中一个游戏角色将在屏幕上水平移动。我用以下代码制作了一个样本,并在手机(较小宽度)和平板电脑(较大宽度)上进行了测试。演员在手机中移动和消失的速度比在平板电脑中快。我怎样才能解决这个问题 public class SpriteMoveTestGame extends Game { private MyScreen screen; @Override public void create() { screen = new MyScreen();
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();
}
}
}正如奥斯卡所说,你不使用任何相机或视口,所以你使用屏幕分辨率。如果手机的宽度为800,桌面的宽度为1200,并且您每做一帧
actor.x+=20
,那么actor在手机上有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秒的帧数。因此平板电脑上的演员比手机上的演员要快一点 你认为:“我的演员可以在1秒内跑20个单位。”所以首先你要做:
actor.x+=20代码>
但问题是演员现在在一帧中运行20个单位,而不是在一秒钟内
要解决此问题,请将此帧与最后一帧之间的增量时间乘以20:actor.x+=20*delta代码>(delta
在act(float delta)
方法中):
现在你的演员总是在1秒内跑20个单位,在每台设备上你会看到一个200单位宽的世界。因此,在每台设备上,演员从左到右都有10秒的时间。您使用的是没有摄像头的fitviewport,因此它只取决于屏幕分辨率。因此,如果手机的宽度分辨率为800(例如),而桌面分辨率为1080,那么它在手机上到达屏幕边缘的速度会更快。您需要使用一个摄像头(正交摄像头),该摄像头将告诉libgdx您希望始终独立于屏幕显示多少像素/单位,并且为了避免扭曲,请使用ExtendViewport而不是Fitviewport.Unrelated,但不要将glclear调用放入您的演员中。这会清除整个屏幕,所以只能由游戏或屏幕执行一次,而不能由演员内部执行。@OscarO。请提供一个示例代码好吗?我不知道他们是如何知道您使用的视口类型的。尽管如此,听起来您似乎在错误地使用视口。LibGDX wiki中有很多示例,或者您可以向我们展示您使用视口的代码,我们可以告诉您有什么问题。@Tenfour04在他发布的示例代码中使用了FitViewport
@Override
public void act(float delta) {
x += 20 * delta;
}