我有多个实现Screen
的类。
我想要,例如,主菜单屏幕portrait
,然后是播放屏幕 landscape
。有没有动态更改orientation
?
我想我可以开始另一个Activity
并让播放屏幕扩展Game
。新的Activity
会intialize
播放屏幕。但是,由于startActivity
与平台无关,因此您似乎无法拨打LibGDX
或类似内容。
我使用Gdx.graphics.getWidth()
和Gdx.graphics.getHeight()
来对齐Sprites
和Actors
,因此它在不同的设备上看起来“正确”。
我也尝试分别交换Gdx.graphics.getWidth()
和Gdx.graphics.getHeight()
,但似乎无法让精灵和演员的位置正确。
另外,在我的清单中,我有orientation="landscape"
。
以下是一些更有意义的图片。
这是landscape
中的主菜单:
这是portrait
中的主菜单:
Actors
和Sprites
的位置和大小均基于Gdx.graphics.getWidth()
和Gdx.graphics.getHeight()
。在我的清单中,两张图片之间唯一的变化是orientation="landscape"
和orientation="portrait"
。
现在我想要portrait
中的主菜单,但游戏所在的播放屏幕应该在landscape
。< / p>
我最初开始处理播放屏幕以及基于orientation="landscape"
设置的尺寸和位置,现在我正在处理主菜单它基于orientation="portrait"
。因此,为什么我要动态更改方向。
答案 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()方法。你的方向改变了。