2017-07-19 26 views
1

我試圖用相同的鍵實現草圖的暫停/播放,例如,如果按p草圖應該停止,如果再次按p,草圖應該重新開始。到目前爲止,我使用noLoop()/ loop()來做到這一點,但有兩個不同的鍵(p代表暫停,r代表啓動)。如果我使用keyPressed()和keyReleased(),它確實有效,但這意味着要按住鍵,但這不能回答我的問題。同樣在暫停模式下,我使用redraw()作爲單一步驟,而noLoop()並且工作良好。 下面是一些代碼,我試過到目前爲止有兩個不同的密鑰:如何用相同的按鈕暫停/播放草圖?

public void draw(){ 
    background(random(255)); 
} 

public void keyPressed(){ 
    if (key == 'p') 
     noLoop(); 
    if (key == 'r') 
     loop(); 
    if (key == 's') 
     redraw(); 
} 

這是使用相同的密鑰代碼:

public void draw(){ 
    background(random(255)); 
} 

public void keyPressed(){ 
    if (key == 'p') 
     noLoop(); 
    if (key == 'p') 
     loop(); 
    if (key == 's') 
     redraw(); 
} 

在這種情況下,當我按下它不關鍵」沒有任何作用。 ,最後一個我想是這樣的:

public void draw(){ 
    background(random(255)); 
} 
public void keyPressed(){ 
    if (key == 'p') 
     noLoop(); 
    else 
     loop(); 
    if (key == 's') 
     redraw(); 
} 

在這種情況下,當我按「P」停止草圖,但不會再次發揮。因爲'別的'它會再次播放時,我按任何鍵,包括's',假設只是一個單一的步驟。 任何幫助都是值得歡迎的。 謝謝!

回答

0

請嘗試發佈一個MCVE,我們可以複製並粘貼自己運行。您發佈的代碼幾乎是一個MCVE,但請包含一個draw()函數,以便我們可以看到與您完全相同的內容。

這裏有一個簡單的MCVE演示您遇到的問題:

void draw() { 
    background(random(255)); 
} 

public void keyPressed() { 

    if (key == 'p') { 
    noLoop(); 
    } 
    if (key == 'p') { 
    loop(); 
    } 
} 

該代碼會顯示一個隨機閃爍的背景。如果你按下P鍵,你會期待它暫停,但它會一直閃爍。

你需要養成逐步瀏覽代碼的習慣,以準確理解它在做什麼。逐行閱讀keyPressed()函數,並想象當您按P鍵時代碼將執行的操作。

第一if語句檢查是否關鍵是P,並且由於它是,它調用noLoop()功能。然後第二個if語句檢查它們的鍵是否爲P,並且因爲它是,它調用loop()函數。這將我們剛剛做出的noLoop()的呼叫反轉,這看起來好像什麼也沒有發生。

您需要跟蹤草圖的狀態。在你的情況下,你需要跟蹤草圖當前是否暫停。你可以使用一個boolean這個變量。然後使用該變量確保您在按下P鍵時執行正確的操作。就像這樣:

boolean paused = false; 

void draw() { 
    background(random(255)); 
} 

public void keyPressed() { 

    if (key == 'p') { 

    paused = !paused; 

    if (paused) { 
     noLoop(); 
    } else { 
     loop(); 
    } 
    } 
} 
+0

非常感謝。這是我的第一個問題,我不瞭解MCVE。我編輯了這篇文章,我認爲你是這樣獲得的。關於代碼現在它正在按照我需要的方式工作,並且我會牢記您的建議以獲得逐步完成代碼的習慣。 –