在libGDX中设置延迟

5
我现在已经尝试了三种不同的方法在libGDX中设置延迟。
首先,我尝试使用一个计时器,但是如果我重新启动活动,计时器就不会再次启动。当使用GestureDetector时,这是一个已知的问题: https://github.com/libgdx/libgdx/issues/2274 然后我尝试在我的render方法中使用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错误?

3个回答

2

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

0
你可以使用一个RunnableAction和一个DelayAction。以下是您需要执行的步骤:
  1. 实例化RunnableAction并为其提供可运行的内容:
  2. RunnableAction runnableAction = Actions.run(new Runnable(){

    public void run(){

    // 在这里放置任何您想要执行的内容

    }

    }

  3. 实例化DelayAction并将其提供给您的RunnableAction:
  4. DelayAction delayAction = Actions.delay(延迟秒数, runnableAction);

  5. 现在,在render或update方法中,您需要告诉delayAction去'act':
  6. delayAction.act(delta);

一旦延迟过去,您的runnable中的代码就会运行。如果语法不完全正确,请见谅,但这应该是最简单的方法。如果有什么不适用于您,我可以提供帮助。

这在我的渲染方法中行不通,因为我的渲染是非连续的,对吧? - anonymos
1
哦,不好意思,我想你需要像这里代码片段中所示的那样做一些事情:https://github.com/libgdx/libgdx/wiki/Threading你可以在其中封装一个计时器,以便它在不同的线程中运行,而不影响你的手势监听器。我不知道那是否能解决你提到的计时器错误,但值得一试。 - Barodapride
这似乎也与渲染方法有关,在下一帧调用一些东西,因此对于我这种非连续渲染的情况不起作用。 - anonymos
1
你确定吗?你是怎么看出它与渲染方法有关的? - Barodapride
是的,你说得对,这与渲染方法无关。然而,将计时器放在另一个线程中并没有解决计时器错误问题。 - anonymos

0

我刚刚创建了这样一个接口:

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秒等),对象是我想通过事件处理的目标对象的实例。

 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;
        }
    }
    [...]

在实体的渲染方法中调用handleTime,事件将仅在设置的每个timeSeconds执行一次。


非常感谢您的回答,但对我来说变得有点复杂了,我想您需要更详细地阐述和说明哪些类应该包含什么,哪些类实现了什么。此外,如果您能够明确指定我在我的LIBGDX类中调用一个带有延迟的方法,那将是非常好的。对于没有看到可能非常明显的内容,我深表歉意,但我仍然是个初学者。 - anonymos
你能告诉我你究竟想做什么吗?如果你想聊天,我也会在libgdx的freenode聊天室中。 - Hllink
当然啦,非常感谢你一直陪伴着我。我真的很感激。在我的MyGdxGame类中,偶尔需要调用我的foo()方法,但是这个方法必须有几秒钟的延迟。在等待这个方法运行的同时,我仍然要能够检测屏幕上的触摸等操作。实际上就是这些了。 - anonymos
在你的MyGdxGame类中声明:private float timeSeconds = 0; 在你的渲染方法中设置timeSeconds += Gdx.graphics.getRawDeltaTime(); 如果timeSeconds > 4,那么执行foo()。这段代码将准确地等待4秒并调用foo()。每次将timeSeconds设置为0时,它将再次等待4秒并调用foo。 - Hllink
就在我测试之前。如果我有非连续渲染,这个方法还能用吗?也就是说,它只在屏幕发生变化时调用渲染方法,这种频率不足以将该方法作为可靠的“循环”。 - anonymos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接