将游戏动态从竖屏变为横屏

3

我有多个实现 Screen 的类。

我想要在主菜单屏幕中设置portrait,然后在游戏屏幕中设置landscape。有没有办法动态改变orientation

我原以为可以启动另一个Activity,并让游戏屏幕扩展Game。新的Activity将初始化Play Screen。但显然不能调用startActivity或类似的方法,因为LibGDX是跨平台的。

我使用Gdx.graphics.getWidth()Gdx.graphics.getHeight()来对齐SpritesActors,使其在不同设备上看起来“正确”。

我还尝试交换Gdx.graphics.getWidth()Gdx.graphics.getHeight(),但无法正确获取精灵和演员的位置。

此外,在我的清单中,我将orientation="landscape"

下面是一些图片,可能更容易理解:

这是我的landscape模式下的主菜单enter image description here

这是我的portrait模式下的主菜单

enter image description here

ActorsSprites的位置和大小都基于Gdx.graphics.getWidth()Gdx.graphics.getHeight()。两个图像之间唯一变化的是我的清单中的orientation="landscape"orientation="portrait"

现在我希望我的主菜单portrait,但Play Screen,即游戏屏幕应该是landscape

最初,我开始工作于Play Screen,并且基于orientation="landscape"设置了大小和位置,现在我正在处理主菜单,它基于orientation="portrait"。因此,我希望动态更改方向。

4个回答

3
这是一个好问题 :) 我没有给出任何人的答案(因为都是正确的)
如何使用Android SDK特定的类设置横向屏幕?
如何在libgdx项目中导入Android类?
首先,请注意Android类只能在Android项目中导入,不能在核心中导入。所以我们会将Activity保存在平台相关的对象中。这是我的AndroidLauncher:
import android.os.Bundle;

import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import com.mygdx.game.MyGdxGame;
import com.mygdx.game.util.Platform;

public class AndroidLauncher extends AndroidApplication {
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
        PlatformAndroid platform = new PlatformAndroid();
        platform.setActivity(this);
        initialize(new MyGdxGame((Platform) platform ), cfg);
}

}

PlatformAndroid实现了平台接口Platform。这两个类用于访问特定于平台的对象。让我们来看一下它们:

public interface Platform {
   public void SetOrientation(String string);
}

and

package com.mygdx.game.android;
import android.app.Activity;
import android.content.pm.ActivityInfo;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.android.AndroidApplication;
import com.mygdx.game.util.Platform;

public class PlatformAndroid extends AndroidApplication implements Platform {
    private Activity activity;
    @Override
    public void SetOrientation(String string) {
       if (string == "landscape"){
       activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
       }
    }
    public void setActivity(Activity activity){ this.activity = activity;   }
}  

您还可以创建一个名为PLatformDesktop的桌面启动器。无论如何,将平台变量保留在您的类中,当您想将屏幕设置为横向时,只需调用:

 platform.SetOrientation("landscape");

2
您不应该有多个Activities。如果想要学习如何以编程方式切换方向,您可以参考这个链接
正如您所说,LibGDX是跨平台的。这就是为什么您不能从“核心”代码访问Android-Activity的原因。如果想要了解如何解决这个问题,请参考与平台特定代码进行接口交互
当您在进行Screen转换时调用您的接口来更改方向时,LibGDX将自动使用新值调用resize(width, height),您可以根据新值对齐您的Stage等内容。

嗯,我使用Gdx.graphics.getWidth()Gdx.graphics.getHeight()来获取根据屏幕方向正确的宽度和高度。 - user959631
也许我没有完全理解您所面临的实际问题。您能否编辑您的问题并告诉我到底哪里出了问题? - noone
在这种情况下,我认为我的答案仍然有效。第一个链接展示了如何在从主菜单到游戏屏幕时切换方向。第二个链接展示了如何使用LibGDX实现它。 - noone
是的,我看了那些链接,但似乎无法理解如何与特定平台的代码进行 接口。不过,我知道如何在 Android 中动态更改 orientation。感谢您的帮助。 - user959631
不客气。我很高兴你成功了。接口有点棘手。 - noone

0

只需在核心项目中创建一个接口,声明一个任意名称的方法,然后在您的AndroidLauncher类中实现该接口。给出您的方法定义。

对我来说,GameOrien.java是具有方法声明的接口。

public interface GameOrien {

    public static final int PORTRAIT=1;

    public static final int LANDSCAPE=2;

    void setOrientation(int orientation);
}

在 Android 项目中的 AndroidLauncher.java 类中。
public class AndroidLauncher extends AndroidApplication implements GameOrien {

**...**

    @Override
    public void setOrientation(int orientation) {

        if(orientation==PORTRAIT)
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        else if(orientation==LANDSCAPE)
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }

}

当您想要更改游戏玩法的方向时,只需调用接口的setOrientaion()方法即可。您的方向将会改变。


0

我之前也遇到了同样的问题,这个方法解决了:

@Override
public void resize(int width, int height) {
    stage.getViewport().setScreenSize(width, height);
}

由于某些原因,尽管屏幕分辨率发生了变化,舞台并不知道。所以我已经告诉了舞台。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接