Игровой персонаж движется с разной скоростью в зависимости от размера экрана - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь создать игру с 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 голосов
/ 03 сентября 2018

Как сказал Оскар, вы не используете камеру или видовой экран, поэтому вы используете разрешение экрана. Если ширина телефона равна 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 х 200 единиц. Когда вы сейчас запустите приложение, актер будет иметь на обоих устройствах, телефоне и планшете 10 кадров слева направо.

Последняя проблема в том, что у вас может быть очень старый телефон, и он немного медленный. Вашему старому телефону требуется 0,02 с для кадра, а планшету - 0,016 с для кадра.
Таким образом, актер на планшете немного быстрее, чем на телефоне.

Вы думаете: «Мой актер может запустить 20 юнитов за 1 секунду». Итак, сначала вы делаете: actor.x += 20;

Но проблема в том, что теперь актер запускает 20 кадров в кадре, а не в секунду.
Чтобы решить проблему, нужно умножить 20 на время дельты между этим и последним кадром: actor.x += 20 * delta; (delta в методе act(float delta)):

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

Теперь ваш актер всегда запускает 20 единиц в 1 секунду, и на каждом устройстве вы видите мир шириной 200 единиц. Таким образом, на каждом устройстве у актера есть 10 секунд слева направо.

...