动态地将游戏从纵向更改为横向

时间:2014-03-02 16:52:46

标签: java android orientation libgdx

我有多个实现Screen的类。

我想要,例如,主菜单屏幕portrait,然后是播放屏幕 landscape。有没有动态更改orientation

我想我可以开始另一个Activity并让播放屏幕扩展Game。新的Activityintialize 播放屏幕。但是,由于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中的主菜单,但游戏所在的播放屏幕应该在landscape。< / p>

我最初开始处理播放屏幕以及基于orientation="landscape"设置的尺寸和位置,现在我正在处理主菜单它基于orientation="portrait"。因此,为什么我要动态更改方向。

4 个答案:

答案 0 :(得分:3)

这是一个很好的问题:)我开发了没人的答案(这是正确的)

如何使用Android sdk特定类设置lanscape屏幕?

如何在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);
}

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");

答案 1 :(得分:2)

您不应该有多个Activities。要了解如何以编程方式切换方向,您可以查看this link

正如您所说,LibGDX与平台无关。这就是您无法从“核心”代码访问Android - Activity的原因。要了解如何解决此问题,请查看Interfacing with platform specific code

当您在进行Screen转换时调用界面更改游戏方向时,LibGDX会自动使用新值调用resize(width, height),您可以调整Stage等根据新的价值观。

答案 2 :(得分:0)

我有同样的问题,这解决了它:

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

出于某种原因,即使屏幕分辨率发生变化,舞台也不知道。所以我已经把它告诉了舞台。

答案 3 :(得分: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);
    }

}

当你想改变GamePlay的方向时,只需调用接口的setOrientaion()方法。你的方向改变了。