Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 游戏人物在不同屏幕大小下移动速度不同,libGDX_Java_Android_Libgdx_Screen - Fatal编程技术网

Java 游戏人物在不同屏幕大小下移动速度不同,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();

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

}

正如奥斯卡所说,你不使用任何相机或视口,所以你使用屏幕分辨率。如果手机的宽度为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;
}