首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java定时A触发器

Java定时A触发器
EN

Stack Overflow用户
提问于 2012-08-07 09:41:17
回答 3查看 2.4K关注 0票数 2

我想在一段时间后触发一个动作,我一直在谷歌上搜索我将如何做到这一点,但我没有运气,我猜这只是我的游戏的编码方式。无论如何,我需要在代码a1被触发30分钟后,代码a2被触发。

a1:

代码语言:javascript
复制
if (itemId == 608) {
        c.sendMessage("The scroll has brought you to the Revenants.");
        c.sendMessage("They are very ghastly, powerful, undead creatures.");
        c.sendMessage("If you defeat them, you may receive astounding treasures.");
        c.sendMessage("If you donate you may visit the Revenants anytime without a scroll.");
        c.getPA().movePlayer(3668, 3497, 0);
        c.gfx0(398);
        c.getItems().deleteItem(608, 1);
}

a2:

代码语言:javascript
复制
c.getPA().movePlayer(x, y, 0);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-07 10:07:50

由于此代码使用Project Insanity,因此您应该使用server.event.EventManager提供的内置计划事件工具。

以下是示例代码:

代码语言:javascript
复制
if (itemId == 608) {
  c.sendMessage("The scroll has brought you to the Revenants.");
  c.sendMessage("They are very ghastly, powerful, undead creatures.");
  c.sendMessage("If you defeat them, you may receive astounding treasures.");
  c.sendMessage("If you donate you may visit the Revenants anytime without a scroll.");
  c.getPA().movePlayer(3668, 3497, 0);
  c.gfx0(398);
  c.getItems().deleteItem(608, 1);

  /* only if the parameter Client c isn't declared final */
  final Client client = c;
  /* set these to the location you'd like to teleport to */
  final int x = ...;
  final int y = ...;

  EventManager.getSingleton().addEvent(new Event() {

    public void execute(final EventContainer container) {
      client.getPA().movePlayer(x, y, 0);
    }
  }, 1800000); /* 30 min * 60 s/min * 1000 ms/s = 1800000 ms */
}
票数 1
EN

Stack Overflow用户

发布于 2012-08-07 09:48:55

在Java语言中有很多方法可以实现计时器,但是要介绍一个很好的框架,请查看http://quartz-scheduler.org/。另外,如果你使用Spring的话,它还集成了quartz。

但更重要的是,如果您正在创建游戏,您将需要一种称为event loop的游戏编程核心技术

这似乎是对how to create a game architecture的一个很好的讨论

票数 2
EN

Stack Overflow用户

发布于 2012-08-07 09:53:13

您可以使用Thread.sleep(),但是如果您在主线程中调用它,它将冻结您的应用程序,因此,请创建另一个线程并将您的代码放入其中。这样做,您将不会停止主应用程序。

这里有一个简单的例子。

代码语言:javascript
复制
public class MyThread implements Runnable {

    @Override
    public void run() {

        try {

            System.out.println( "executing first part..." );
            System.out.println( "Going to sleep ...zzzZZZ" );

            // will sleep for at least 5 seconds (5000 miliseconds)
            // 30 minutes are 1,800,000 miliseconds
            Thread.sleep( 5000L );

            System.out.println( "Waking up!" );
            System.out.println( "executing second part..." );

        } catch ( InterruptedException exc ) {
            exc.printStackTrace();
        }

    }

    public static void main( String[] args ) {
        new Thread( new MyThread() ).start();
    }

}

这将只运行一次。要多次运行,您需要一个包含run方法体的无限循环(或一个由标志控制的循环)。

您还可以选择其他一些选项,例如:

  • java.util.Timer
  • javax.swing.Timer
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11838229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档