2014-03-31 68 views
0

我正在嘗試按照教程here試圖瞭解代碼的邏輯:

我具備的功能moveBall()這是一個精簡版:

if (x + xa > getWidth() - 30) { 
    xa = -1; 
    y = y + 10; 
} 
if (x + xa < 0) { 
    xa = 1; 
} 
x = x + xa; 

理想的觸摸屏幕的邊界球需要扭轉方向,這是真的後,它確實發生。但是,如果我把System.out.println("in if")放在if的任何一個條件中,每次在球接觸到邊界之前都會被調用,理想情況下xa的值應該在接觸邊界時只設置一次,或者我錯了嗎?我不可能獲得完整的邏輯,任何人都可以請幫忙嗎?

主要功能:

public static void main(String[] args) throws InterruptedException{ 
     JFrame frame = new JFrame("Mini Tennis"); 
     FirstClass Fr = new FirstClass(); 
     frame.add(Fr); 


     frame.setSize(300, 400); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     while(true){ 
      Fr.moveBall(); // executes the last 
      Fr.repaint(); //executes first 
      Thread.sleep(10); //executes second 
     } 



    } 
+0

您是否嘗試在* * * if'子句中添加*不同*調試輸出? –

+0

是的,但它只是讓我更困惑,部分原因是操作很快進行。 – User3

+2

關閉主題,但我會殺了誰寫的代碼... –

回答

0

的原因,它被稱爲是因爲你所描述的方法是不斷運行。它經常檢查它是否在指定的邊界線內,這是println不斷調用的原因,因爲該函數被設計爲始終被調用,並且以這種方式總是檢查它是否超出邊界。

想想這個方法..方法總是問「我是否越界?」 「我超越界限嗎?」一旦發生,它就會反轉。

您認爲代碼只會在觸及邊界時運行,但這是錯誤的。它會一直檢查它是否已經觸及邊界,即使它沒有觸及邊界......這是計算機知道何時達到邊界並將其自身逆轉(或者代碼指示它做什麼)的唯一方式)。

您還在評論why is the System.out.println在if條件未滿足時運行。這是因爲Java允許在身體周圍沒有大括號的循環。

while(condition) statement1; statement2; //只有第一條語句在循環體

學生假設身體語句在身體中。同樣,

while(condition) statement1;聲明2

這兩個陳述似乎是循環,但只有第一個是。 上述示例不會在其他語言中編譯。

+0

是的,但調用方法並不意味着進入if塊,除非和直到邊界被觸摸。可能是我錯了,因爲我對這段代碼感到困惑。 – User3

+0

啊。我懂了。我會編輯我的答案。請稍後閱讀。 –

+0

我編輯答案。這可能有幫助。 –

0

當球觸及邊界x + xa == getWidth() - 30。此時,對應XA沒有改變和球上

移動但這x + xa > getWidth() - 30後的步驟得到TURE和XA設置爲-1(這意味着標題用於反向x方向)

+0

真的,我明白這一點,理想的情況下,如果它不應該進入if條件,直到它再次接觸到牆。 – User3

+0

@ user2822178如果你的意思是?我建議編輯這個問題:'if(x + xa> getWidth() - 30)後y不會改變' – Yongfeng

+0

這兩個中的任何一個,但是放置斷點和調試幫助了我更多,並且我意識到它的工作原理如預期。只有當球觸及邊界時纔會調用if。 – User3

1

由於Lutz Horn,調試了一整天之後,我想我已經明白了在上面的代碼中發生的事情,我會盡我所能來解釋:

在上面的精簡版,該方案有兩個變量開始

int x = 0; int xa = 1;

在移動功能中,檢測到與任何邊框的碰撞,但在上面的代碼中我只對x平面感興趣。

的功能是:

void move() { 
     System.out.println("x + xa is: "+(x+xa)); 
     System.out.println("Game Width: "+(game.getWidth() - 30)); 
     if (x + xa < 0) 
      xa = 1; 
     if (x + xa > game.getWidth() - 30) 
      xa = -1; 
     x = x + xa; 

    } 

SO x的開始爲0,和XA其等於1被添加了,所以x是1,球向右移動,重新繪製被調用,並在上述一遍又一遍地發生。然後在一個實例中x變爲269(調試消息:getWIdth() - 30 = 268)。現在第二的主體如果執行條件:

if (x + xa > game.getWidth() - 30) // holds true when x+xa = 269 
       xa = -1; // Hence setting the variable xa to -1 

上面繼續直到x變成小於0(因爲-1被添加到269由於上述)亦值得注意的這裏是減去每次調用paint時都會返回1,意味着if條件不會被重複調用。

現在當x變爲-1我們造成真如下:

if (x + xa < 0) 
      xa = 1; 

因此再次遞增x直到269繼續進行處理。