2014-12-31 216 views
0

为什么此代码有效(窗口在退出按钮上关闭)?while循环中的条件


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

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

回答

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); 
    } 
} 
+0

谢谢!这是最好的方法吗? – DaSH

+0

@DaSH这两个选项之间没有太大的区别(在修复第二个选项之后)。 – Eran

+0

@DaSH这与您在第一版代码中使用的方式相同。在这种情况下,需要为只执行一行的方法保留一点内存。 – imarban

0

您分配给一次,然后Input.ESC Keyboard.isKeyDown(键盘。KEY_ESCAPE)的价值你总是比较相同值的一段时间。

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