如何pause/play一个草图在处理中用同一个按钮?
How to pause/play a sketch in processing with the same button?
我正在尝试使用相同的键为草图实现 pause/play,例如,如果我按 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' 时,它会停止草图但不会再次播放。由于 'else' 当我按下任何键(包括 's' 时它会再次播放,这应该只是一个步骤。
任何帮助都非常受欢迎。
谢谢!
请尝试post一个MCVE,我们可以自己复制粘贴到运行。您 post 编写的代码几乎是一个 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();
}
}
}
我正在尝试使用相同的键为草图实现 pause/play,例如,如果我按 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' 时,它会停止草图但不会再次播放。由于 'else' 当我按下任何键(包括 's' 时它会再次播放,这应该只是一个步骤。 任何帮助都非常受欢迎。 谢谢!
请尝试post一个MCVE,我们可以自己复制粘贴到运行。您 post 编写的代码几乎是一个 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();
}
}
}