【问题标题】:How to pause/play a sketch in processing with the same button?如何使用相同的按钮暂停/播放正在处理的草图?
【发布时间】:2017-07-20 07:46:59
【问题描述】:

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

【问题讨论】:

    标签: processing


    【解决方案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语句检查key是否为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();
        }
      }
    }
    

    【讨论】:

    • 非常感谢。这是我在这里的第一个问题,我不知道 MCVE。我编辑了帖子,我认为这是您建议的方式。关于现在的代码,它完全按照我的需要工作,我会牢记您的建议,以养成单步执行代码的习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多