2014-12-31 214 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)總是要進行比較。