如何使课程不断运行

时间:2014-03-30 19:19:26

标签: java lwjgl

我创建了一个类,使用这样的方法控制lwjgl中游戏的所有键:

        if (Keyboard.isKeyDown(Keyboard.KEY_A)) {

            System.out.println(".....");
        }

除了规模大得多。我的问题是,当这个类被调用时它只运行一次,所以看到代码效果的唯一方法是在游戏启动时在A按钮上有一个拇指痉挛......

我的代码:

public class KeyBindings {

    public static void run() {

        try {

            Keyboard.create();

        } catch (LWJGLException e) {

            e.printStackTrace();
        }

        if (Keyboard.isKeyDown(Keyboard.KEY_F1)) {

            System.out.println(".............................");
        }
   }

然后我从另一个班级打电话给KeyBindings.run();

2 个答案:

答案 0 :(得分:2)

你必须选择:

  • 轮询关键状态。
  • 对异步键事件做出反应。

要实现第一个选项,您应该安排Timer任务,而要实现第二个选项,这是最好的,您可以使用key-listeners

这段代码可以帮助您了解如何使用定时器安排重复性任务:

Timer t = new Timer();
long period = 5*60*1000; //For example 5 minutes
long delay = 1*60*1000; //For example 1 minute
t.schedule(new TimerTask() {
            @Override
            public void run() {
               //To do: Your code to be repeated each period ms
            }
        }, delay, period);

您可以将此代码包含在您的课程中:

public class KeyBindings {

    private Timer t;

    KeyBindings() {
        t = new Timer();
        long period = 5*60*1000; //For example 0.5 seconds
        long delay = period;
        t.schedule(new TimerTask() {
                @Override
                public void run() {
                   run();
                }
            }, delay, period);
    }

    public static void run() {

        try {

            Keyboard.create();

        } catch (LWJGLException e) {

            e.printStackTrace();
        }

        if (Keyboard.isKeyDown(Keyboard.KEY_F1)) {

            System.out.println(".............................");
        }
   }

}

完成对键盘输入的监听后,应该考虑停止Timer线程。另一个选择是,如果您的应用程序必须在其执行过程中轮询键盘状态,则将您的计时器标记为daemon,这样就不会阻止应用程序完成。

答案 1 :(得分:0)

在循环中重复键识别的逻辑。

public class KeyBindings {
    private volatile boolean shoutDown;

    public void setShoutDown(boolean shoutDown) {
        this.shoutDown = shoutDown;
    }

    public static void run() {

        try {

            Keyboard.create();

        } catch (LWJGLException e) {

            e.printStackTrace();
        }

        while (!shutDown) {
            if (Keyboard.isKeyDown(Keyboard.KEY_F1)) {
                System.out.println(".............................");
            }
        }
    }

}