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

时间:2017-07-19 22:31:56

标签: processing

我正在尝试使用相同的键实现草图的暂停/播放,例如,如果按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'在内的任何键时,它会再次播放,这些键只是为了一步。 任何帮助都非常受欢迎。 谢谢!

1 个答案:

答案 0 :(得分:1)

请尝试发布我们可以复制并粘贴的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();
    }
  }
}