【问题标题】:Conditions in while loopwhile循环中的条件
【发布时间】:2015-02-27 14:32:01
【问题描述】:

为什么这段代码有效(窗口在退出按钮时关闭)?


看来我的帖子主要是代码,我不知道要添加什么细节。看来我的帖子主要是代码,我不知道要添加什么细节。

public class Main
{
    public static void main (String[] args)
        {
            start(); //Create a window
            render(); //Run the game
            close(); //End the game
        }

    private static void start()
    {
        Window SD = new Window();
        SD.Launch();
    }

    private static void render()
    {
        while(!Display.isCloseRequested() && !Keyboard.isKeyDown(Keyboard.KEY_ESCAPE))
        {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        Display.update();
        }
    }

    private static void close()
    {
        Display.destroy();
    }
}

但是这段代码没有:

//
while(!Display.isCloseRequested() && !Input.ESC)
//

public class Input
{
    public static boolean ESC = Keyboard.isKeyDown(Keyboard.KEY_ESCAPE);
}

【问题讨论】:

    标签: java while-loop conditional-statements lwjgl


    【解决方案1】:

    在您的第二个版本中,Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) 被评估一次,其值被分配给 ESC,它保持不变。它要么总是对的,要么总是错的(更有可能)。

    您的第一个版本在循环的每次迭代中评估 !Keyboard.isKeyDown(Keyboard.KEY_ESCAPE),因此它可以检测实际按下 ESC 的时间。

    如果您将 ESC 更改为静态方法而不是静态变量,您的表达式将在每次调用 ESC() 时进行计算,并且两个循环都可以工作。

    while(!Display.isCloseRequested() && !Input.ESC())
    //
    
    public class Input
    {
        public static boolean ESC() 
        {
            return Keyboard.isKeyDown(Keyboard.KEY_ESCAPE);
        }
    }
    

    【讨论】:

    • 谢谢!这是最好的方法吗?
    • @DaSH 这两个选项没有太大区别(在你修复第二个之后)。
    • @DaSH 这与您在代码的第一个版本中使用的方式相同。在这种情况下,需要为只执行一行的方法保留一点内存。
    【解决方案2】:

    您将 Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) 的值分配给 Input.ESC 一次,然后在您始终与相同的值进行比较时。

    您需要评估 Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) 总是要进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 2015-09-29
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多