2017-07-19 24 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。我编辑了这篇文章,我认为你是这样获得的。关于代码现在它正在按照我需要的方式工作,并且我会牢记您的建议以获得逐步完成代码的习惯。 –