如何使用 Init() 方法在 LibGDX 中重新启动屏幕?

2024-02-25

我在 LibGDX 中创建了一个具有多个屏幕的简单游戏。我想在触摸重启按钮后重新启动某个屏幕,但我不知道该怎么做。我对此做了一些研究,所有答案都导致不在 show() 中加载我的资产,而是在我不太熟悉的 init() 方法中加载。我想知道如何使用这个 init() 方法重新启动屏幕。到目前为止,我将大部分初始化放在构造函数中,有些是在 restartButton() 方法等方法中初始化的。我的代码中的任何其他更正或改进将受到高度赞赏。这是我的代码片段:

public class LevelOneScreen implements Screen {

public MainShooter app;
private Stage stage;
private Stage stageCoin;
private Stage stageScore;
private Stage stageEnemies;
private Stage stageFX;
private Stage stageButton;

public Image aImage;
public Image bImage;
public Image cImage;
public Image dImage;

public Array<AntAnimation> AntAnimate;
public Array<CrumbAnimation> CrumbAnimate;
public Array<CoinAnimation> CoinAnimate;

public Texture firstTex;
public Texture secTex;
public Texture thirdTex;
public Texture fourthTex;


 public LevelOneScreen(final MainShooter app){

 this.app = app;
 this.stage = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera));
 this.stageCoin = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera));
 this.stageScore = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera));
this.stageEnemies = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera));
this.stageFX = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera));
this.stageButton = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera));

AntAnimate = new Array<AntAnimation>();
CrumbAnimate = new Array<CrumbAnimation>();
CoinAnimate = new Array<CoinAnimation>();

restartButton();
levelOneBackground();
coinScore();


}


public void show() {


    inputMultiplexer = new InputMultiplexer();
    inputMultiplexer.addProcessor(stageCoin);
    inputMultiplexer.addProcessor(stageScore);
    inputMultiplexer.addProcessor(stageEnemies);
    inputMultiplexer.addProcessor(stageFX);
    inputMultiplexer.addProcessor(stageButton);

    Gdx.input.setInputProcessor(inputMultiplexer);

   }

   public void levelOneBackGround(){
   //code for the background 
   }


   public void coinScore(){
   //code for coinScore
   }

   public void restartButton(){
   firstTex = MainShooter.manager.get("button.png", Texture.class);
   aImage = new Image(firstTex);
   stageButton.addActor(aImage);
   aImage.addListener(new ActorGestureListener() {
        public void touchDown(InputEvent event, float x, float y, int pointer, int button) {

        // Creating new LevelOneScreen somehow affects the fps of my game.
        app.setScreen(new LevelOneScreen(app));


        }});
   }


//some other codes like dispose, hide, etc.

}

此编辑是对 IronMonkey 提供的答案的回应,该答案似乎解决了问题,但需要额外的代码。这里的问题是,每当游戏重新启动时,重新启动的屏幕中的演员都会位于前一个屏幕(重新启动之前的屏幕)上的演员之上。这是我的代码的新片段,展示了如何使用 GameInit() 重新启动游戏:

     public void GameInit(){
     levelOneBackground();
     scoreInt = 0;
     coinInt = 0;
}


public void levelOneBackground(){

        Runnable runAntAct1 = new Runnable(){
            public void run(){
                antAct1();
            }
        };
        Runnable runAntAct2= new Runnable(){
            public void run(){
                antAct2();
            }
        };
        Runnable runAntAct3 = new Runnable(){
            public void run(){
                antAct3();
            }
        };
        Runnable runCoins = new Runnable(){
            public void run(){
                coinScattered();
            }
        };
        levelOneTexture =  CoinAssets.manager.get("woodenTable.png",Texture.class);
        levelOneImage = new Image(levelOneTexture);
        levelOneImage.setSize(app.screenWidth,app.screenHeight);
        levelOneImage.setPosition(0,0);
        stage.addActor(levelOneImage);
        levelOneImage.addAction(sequence(run(runAct1),delay(2f),run(runAct2),delay(2f),run(runAct3),delay(2f),run(runCoins)));


}

public void restartButton(){
     //some code for the position, size, texture of the button.
     restartButton.addListener(new ActorGestureListener() {
            public void touchDown(InputEvent event, float x, float y, int pointer, int button) {
                GameInit();}});
}


public void antAct1(){
         for(int i = 1; i < 4; i++){AntAnimate.add(new AntAnimation(app));}

         AntAnimate.get(1).setPosition(x,y);
         stageEnemies.addActor.(AntAnimate.get(1));
         AntAnimate.get(1).addAction(//some actions);

          AntAnimate.get(2).setPosition(x,y);
         stageEnemies.addActor.(AntAnimate.get(2));
         AntAnimate.get(2).addAction(//some actions);

          AntAnimate.get(3).setPosition(x,y);
         stageEnemies.addActor.(AntAnimate.get(3));
         AntAnimate.get(3).addAction(//some actions);

}

public void antAct2(){
     //almost the same with antAct1()
}

public void antAct3(){
     //almost the same with antAct1()
}

public void coinScattered(){
     //almost the same with antAct1()
}

当屏幕第一次显示时,show() 会被自动调用。

init() 方法是您自己创建的方法。 你可以随意称呼它。 您不应该在 init() 中加载所有资源,只需设置所有内容,score = 0、player.setPosition(0,0) 等。

因此,当您第一次调用 init() 时,您设置了所有变量。当您再次调用 init() 时,您会再次设置它们。 (reset)

问题编辑后:

在从 GameInit() 调用的方法中,您加载已加载的文件并将参与者添加到这些参与者已经存在并因此现在重叠的阶段。您还可以添加操作并创建已创建的对象。

GameInit() 应该做的就是为那些已经创建的对象设置值。 所以基本上:

private void GameInit(){
      AntAnimate.get(1).setPosition(x,y);
      AntAnimate.get(2).setPosition(x,y);
      AntAnimate.get(3).setPosition(x,y);
      levelOneImage.setPosition(0,0);
      scoreInt = 0;
      coinInt = 0;
}

对象的加载和创建不应多次执行。尝试添加我的 GameInit() 方法,将其称为 GameReset() 并从重置按钮调用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Init() 方法在 LibGDX 中重新启动屏幕? 的相关文章

  • Libgdx SpriteBatch.draw() 指定 4 个顶点

    我正在使用 libGdx 创建一个 2d 游戏 并尝试使用这个特殊的方法来绘制一个简单的 2d 纹理 分别指定 4 个顶点 draw Texture texture float spriteVertices int offset int l
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • 在 ViewPager Fragments 中使用 Master/Detail 模板(下载链接)

    工作代码 https github com lukeallison ViewPagerMasterDetail https github com lukeallison ViewPagerMasterDetail Android 主 详细流
  • 如何以编程方式检查 AndroidManifest.xml 中是否声明了服务?

    我正在编写一个库 该库提供了一项服务 其他开发人员可以通过将其包含在他们的项目中来使用该服务 因此 我无法控制 AndroidManifest xml 我在文档中解释了要做什么 但一个常见的问题是人们忽略了将适当的 标记添加到其清单中 或者
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Android 模拟器插件无法初始化后端 EGL 显示

    我在 Cloudbees 上设置了 Jenkins 作业 并且可以在那里成功签出并编译我的 Android 项目 现在我想在 android 模拟器中运行一些 JUnit 测试并添加 Android 模拟器插件 我将 显示模拟器窗口 选项设
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 是否有 ADB 命令来检查媒体是否正在播放

    我想使用 ADB 命令检查根植于终端的外部设备中是否正在播放音频 视频 我无法找到任何 ADB 命令 如果有 我尝试过 adb shell dumpsys media player 我想要一个命令来指定视频是否正在运行 您可以使用以下命令查
  • 如何发布Android .aar源以使Android Studio自动找到它们?

    我正在将库发布到内部 Sonatype Nexus 存储库 Android Studio 有一个功能 可以自动查找通过 gradle 引用的库的正确源 我将 aar 的源代码作为单独的 jar 发布到 Nexus 但 Android Stu
  • 如何使用InputConnectionWrapper?

    我有一个EditText 现在我想获取用户对此所做的所有更改EditText并在手动将它们插入之前使用它们EditText 我不希望用户直接更改中的文本EditText 这只能由我的代码完成 例如通过使用replace or setText
  • 如何默认在 ActionOpenDocument 意图中显示“内部存储”选项

    我需要用户选择一个自定义文件类型的文件 并将其从 Windows 文件资源管理器拖到 Android 设备上 但默认情况下内部存储选项不可用 当我使用以下命令启动意图时 var libraryIntent new Intent Intent
  • 尝试在 ubuntu 中编译 android 内核时出错

    我正在尝试从源代码编译 Android 内核 并且我已经下载了所有正确的软件包来执行此操作 但由于某种原因我收到此错误 arm linux androideabi gcc error unrecognized command line op
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • 我的设备突然没有显示在“Android 设备选择器”中

    我正在使用我的三星 Galaxy3 设备来测试过去两个月的应用程序 它运行良好 但从今天早上开始 当我将设备连接到系统时 它突然没有显示在 Android 设备选择器 窗口中 我检查过 USB 调试模式仅在我的设备中处于选中状态 谁能猜出问
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Android向menuItem添加子菜单,addSubMenu()在哪里?

    我想根据我的参数以编程方式将 OptionsMenu 内的子菜单添加到 menuItem 中 我检查了android sdk中的 MenuItem 没有addSubMenu 方法 尽管你可以找到 hasSubMenu 和 getSubMen
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef

随机推荐