如何使用相同的按钮在处理中暂停/播放草图?



我正在尝试使用相同的键为草图实现暂停/播放,例如,如果我按p,草图应该停止,如果我再次按p,草图应该重新开始。到目前为止,我使用 noLoop((/loop(( 来执行此操作,但使用两个不同的键(p 表示暂停,r 表示开始(。如果我使用 keyPressed(( 和 keyRelease(( 它确实有效,但这意味着按住键,但这并不能回答我的问题。同样在暂停模式下,我使用 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"时,它会停止草图,但不会再次播放。由于"else",当我按下包括"s"在内的任何键时,它会再次播放,这应该只是一个步骤。 任何帮助都非常受欢迎。 谢谢!

请尝试发布一个 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();
}
}
}

最新更新