有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java动态改变游戏从纵向到横向

我有多个实现Screen的类

我想,比如说,拥有主菜单屏幕portrait,然后是播放屏幕landscape。是否存在动态更改orientation的方法

我想我可以再开始一次Activity,让播放屏幕扩展Game。新的Activityintialize播放屏幕。但是显然,您不能调用startActivity或类似的函数,因为LibGDX是独立于平台的

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

我还尝试分别交换了Gdx.graphics.getWidth()Gdx.graphics.getHeight(),但似乎无法正确地确定精灵和演员的位置

另外,在我的清单中我有orientation="landscape"

以下是一些更有意义的图片

这是我在^{中的主菜单: enter image description here

这是我在^{中的主菜单:

enter image description here

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

现在我希望我的主菜单portrait中,但游戏所在的播放屏幕应该在landscape

我最初开始处理播放屏幕以及基于orientation="landscape"设置的大小和位置,现在处理主菜单是基于orientation="portrait"。因此,我希望动态更改方向


共 (4) 个答案

  1. # 1 楼答案

    这是一个很好的问题:)我得到了noone的答案(这是正确的)

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

    以及如何在libgdx项目中导入android类

    首先请注意,Android类只能在Android项目中导入,不能在核心中导入。因此,我们将活动保存在依赖于平台的对象中。这是我的男朋友:

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

    平台android实现了平台。这两个类用于访问特定于平台的对象。让我们来看看它们:

    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");
    
  2. # 2 楼答案

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

    正如您所说,LibGDX是独立于平台的。这就是为什么您不能从“核心”代码访问Android-Activity。要了解如何解决这个问题,请查看Interfacing with platform specific code

    当您在执行Screen转换时调用界面更改游戏方向时,LibGDX将自动使用新值调用resize(width, height),您可以根据新值对齐Stage

  3. # 3 楼答案

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

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

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

  4. # 4 楼答案

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

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

    public interface GameOrien {
    
        public static final int PORTRAIT=1;
    
        public static final int LANDSCAPE=2;
    
        void setOrientation(int orientation);
    }
    

    AndroidLauncher中。Android项目中的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);
        }
    
    }
    

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