Игра LibGDX установлена ​​в альбомную ориентацию, но отображается как портретная только на определенных устройствах - PullRequest
0 голосов
/ 05 августа 2020

Я делаю игру LibGDX (1.9.9), которая должна быть исправлена ​​в ландшафтном режиме, но когда я запускаю ее на некоторых устройствах, она отображается в портретном режиме.

У меня протестировал его на нескольких физических и виртуальных устройствах в диапазоне от Android 4 до 11, а также на симуляторе iPhone через RoboVM (2.3.9). Это происходит на виртуальном планшете android (Android 11) и симуляторе iPhone. Он пару раз застревал в портретном режиме на физическом устройстве, но мне не удалось воспроизвести его. Я не мог понять, почему это могло быть.

У меня есть ландшафт (android: screenOrientation = "landscape"), установленный в android манифесте.

Gdx.input .getRotation () возвращает 90, когда он правильно установлен в альбомной ориентации, но 0, когда в портретной ориентации, поэтому, возможно, я могу попробовать проверить, равно ли он 0, и динамически изменить поворот, но я не смог узнать, как это сделать. .

Я пробовал обходной путь, где я проверяю, меньше ли ширина экрана высоты экрана, и поворачиваю камеру на 90 градусов, если это правда, чтобы поместить ее в альбомную ориентацию вручную, но это приводит к искажению камеры таким образом. показано ниже, хотя я знаю, что правильно изменил соотношение сторон для поворота.

Как камера искажается при попытке повернуть в альбомную ориентацию

Я использую OrthographicCamera без любые окна просмотра.

    // Screen dimensions
    width = ((float) Gdx.graphics.getWidth() / (float) Gdx.graphics.getHeight()) * GameSpecs.WORLD_HEIGHT;
    height = GameSpecs.WORLD_HEIGHT;

    System.out.println("width: " + width);
    System.out.println("height: " + height);
    System.out.println("orientation: " + Gdx.input.getNativeOrientation());
    System.out.println("rotation: " + Gdx.input.getRotation());

    // If showing portrait and needs to be rotated
    rotateForProperLayout = width < height;

    if (rotateForProperLayout) {
        height = ((float) Gdx.graphics.getHeight() / (float) Gdx.graphics.getWidth()) * GameSpecs.WORLD_HEIGHT;
        width = GameSpecs.WORLD_HEIGHT;
    }

    cam = new OrthographicCamera(width, height);

    // Rotate camera to be in landscape
    if (rotateForProperLayout) {
        cam.rotate(-90);
    }
    cam.translate(cam.viewportWidth / 2f, cam.viewportHeight / 2f);
    cam.update();

Мой Android Манифест ...

<?xml version="1.0" encoding="utf-8"?>

1 Ответ

0 голосов
/ 07 августа 2020

Поскольку пока никто вам не помог, я отправлю свой android манифест, вам, возможно, стоит опубликовать свой, поскольку почти наверняка здесь проблема. Я давно ставил go и, честно говоря, не могу точно вспомнить, почему все поставлено как есть, но у меня это работает. Примечание. Я использую вращение устройства для управления своей игрой в некоторых режимах.

Что касается проблем с ручным вращением экрана, вы можете получить доступ к матрице проекции камеры и соответственно масштабировать ее, чтобы она выглядела нормально. Я не рекомендую это делать, так как сложно отследить, как вызовы изменения размера экрана должны изменить ваш макет, когда вам также нужно отслеживать поворот экрана. Вам нужно будет подумать, действительно ли изменение ширины следует рассматривать как изменение высоты в портретном режиме и наоборот (в зависимости от сложности вашей игры). Я бы рекомендовал просто разобраться в вашем манифесте. Удачи.

        android:screenOrientation="fullSensor"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/GdxTheme" >
        <activity
            android:name="com.funferret.tr.AndroidLauncher"
            android:label="@string/app_name" 
            android:screenOrientation="sensorLandscape"
            android:configChanges="keyboard|keyboardHidden|navigation|orientation|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
...