【问题标题】:Set a delay in libGDX在 libGDX 中设置延迟
【发布时间】:2016-05-05 15:55:34
【问题描述】:

我现在尝试以三种不同的方式在 libGDX 中设置延迟。

首先我尝试使用Timer,但如果我重新启动活动,计时器将不会再次启动。这是使用GestureDetector时的一个已知问题:https://github.com/libgdx/libgdx/issues/2274

然后我尝试在我的渲染方法中使用Gdx.graphics.getDeltaTime 设置一个计时器,但这对我不起作用,因为我已将其设置为非连续渲染。在答案#2 set a delay in libgdx game中描述

最后我尝试使用 while 循环和 System.getCurrentTimeMilliseconds,但这会阻止应用程序在 while 循环循环时识别点击。

我也听说过DelayAction,但是如何在代码中实现它呢? https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/actions/DelayAction.html

还有其他设置延迟的方法吗?如何实现DelayAction?或者如何修复 libGDX 中的 Timer 错误?

【问题讨论】:

    标签: java android libgdx


    【解决方案1】:

    Barodapride 的评论启发,我找到了一个解决方案,我创建了一个新线程,并将while 循环放在这里。此代码将等待 1000 毫秒,然后在主线程上运行 foo()

    new Thread(new Runnable() {
                @Override
                public void run() {
                    long time = System.currentTimeMillis();
                    while (System.currentTimeMillis() < time + 1000){}
                    Gdx.app.postRunnable(new Runnable() {
                        @Override
                        public void run() {
                            foo();
                        }
                    });
                }
            }).start();
    

    【讨论】:

      【解决方案2】:

      我只是创建一个这样的界面:

      public interface TimeEvents {
          public void handleTime(float secondsToEvent,Events event, Object obj);
          public void resetTimer();
          public void handleEvent(Events event,Object obj);
      }
      

      并为我想要的游戏实体创建一个实现它的类,我的事件是一个带有要处理的事件的枚举(比如等待 x 秒,步行 x 秒,触发 x 秒......), object 是我要按事件处理的目标对象的实例..

       public class FooTimeEvents implements TimeEvents{
           [...]
              private float timeSeconds = 0;
              @Override
              public void handleTime(float secondsToEvent,Events event, Object obj){
                  timeSeconds +=Gdx.graphics.getRawDeltaTime();
                  if(timeSeconds > secondsToEvent){
                      timeSeconds-=secondsToEvent;
                      handleEvent(event,obj);
                  }
              }
      
          @Override
            public void handleEvent(Events event,Object obj){
              switch (event) {
                  case EVENT_FOO_1:
                      executeEventFoo1((Foo1Obj)obj);
                      break;
                  case EVENT_FOO_2:
                       executeEventFoo2((Foo2Obj)obj);
                      break;
                  default:
                      break;
              }
          }
          [...]
      

      你在实体的render方法上调用handleTime,事件只会在每次设置的timeSeconds时执行..

      【讨论】:

      • 非常感谢您的回答,但这对我来说有点太复杂了,我想您必须详细说明并进一步说明应该在哪些类和哪些类中执行什么。此外,如果您可以准确指定我将在我的 LIBGDX 类中调用的内容以延迟调用方法,那将是非常棒的。很抱歉没有看到可能非常明显的内容,但我仍然是初学者。
      • 你能告诉我你到底想做什么吗?如果您想聊天,我也可以在 libgdx freenode 聊天中使用..
      • ofc,非常感谢您的支持。对此,我真的非常感激。有时,在我的 MyGdxGame 类中,我需要调用我的方法 foo(),但这必须有几秒钟的延迟。在等待此方法运行时,我必须仍然能够检测到屏幕上的触摸等。实际上,这应该就是全部了。
      • 在您的 MyGdxGame 类中声明:私有浮点 timeSeconds = 0;,在您的渲染方法中设置 timeSeconds += Gdx.graphics.getRawDeltaTime(); if(timeSeconds > 4){ foo();} 这个代码会等待 4 秒然后调用 foo()。每次将 timeSeconds 设置为 0 时,它将等待 4 秒并再次调用 foo。
      • 就在我测试它之前。当我有非连续渲染时这会起作用吗?也就是说,它只在屏幕发生变化时才调用render方法,这不足以将该方法用作可靠的“循环”
      【解决方案3】:

      您可以将 RunnableAction 与 DelayAction 一起使用。以下是您将采取的步骤:

      1. 实例化一个 RunnableAction 并为其提供一个 Runnable:

        RunnableAction runnableAction = Actions.run(new Runnable(){

        公共无效运行(){

        // 把你想做的放在这里

        }

        }

      2. 实例化一个 DelayAction 并将它与您的 RunnableAction 一起提供:

        DelayAction delayAction = Actions.delay(secondsOfDelay, runnableAction);

      3. 现在在您的渲染或更新方法中,您需要告诉您的 delayAction 为“行动”:

        delayAction.act(delta);

      一旦延迟通过,您的可运行文件中的代码就应该运行了。如果这种语法不完全正确,我很抱歉,但这应该是最简单的方法。如果有什么不适合你的,请告诉我,我可以提供帮助。

      【讨论】:

      • 这在我的渲染方法中不起作用,因为我有非连续渲染,是吗?
      • 哦不,我猜不是。我认为您必须在此处的代码 sn-p 中执行类似操作:github.com/libgdx/libgdx/wiki/Threading 您可能会在其中封装一个计时器,以便它在不同的线程中运行而不会影响您的手势侦听器。我不知道这是否能解决您提到的 Timer 错误,但值得一试。
      • 这似乎也与渲染方法有关,并在例如调用东西下一帧,因此它不适用于我的非连续渲染。
      • 你确定吗?您是如何看到它与渲染方法相关联的?
      • 是的,你是对的,与渲染方法无关。但是,将 Timer 放在另一个线程中并不能修复 Timer 错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      相关资源
      最近更新 更多