【问题标题】:How can I clear/reset the canvas with a counter or countdown in Processing?如何在处理中使用计数器或倒计时清除/重置画布?
【发布时间】:2019-06-12 09:14:40
【问题描述】:

我想知道如何设置重置循环: 在 draw() 进行时,我想清除画布,以便我可以一次又一次地开始在干净的画布上绘制。

(我不想使用 keyPressed() 或 mousePressed() 它必须是自动的)

import ddf.minim.*;
Minim minim;
AudioInput in;

void setup() {
  minim = new Minim(this);
  minim.debugOn ();
  in = minim.getLineIn(Minim.MONO, 100);
  fullScreen();
  background(255, 60, 80);
}

void draw() {
  float soundlevel;
  float distance_top = random(100);
  int t;
  int interval = 10;
  String time = "010";

  soundlevel = in.mix.get(0);

  stroke(255, random(90, 255));
  line(0, distance_top + soundlevel * 4000, width, distance_top + soundlevel * 1000);
  line(0, distance_top + soundlevel * 1000, width, distance_top + soundlevel * 4000);


  t = interval-int(millis()/100);
  time = nf(t, 3);
  if (t == 0) {
    redraw();
    interval = interval +10;
  }
}

感谢您的建议!

【问题讨论】:

  • 请添加您目前尝试过的代码。

标签: java processing counter redraw


【解决方案1】:

您可以简单地再次清除背景,例如当您按下某个键时:

void keyPressed(){
  background(255, 60, 80);
}

您可以在其他一些事件(时间量、响度等)上做同样的事情

这是一个基于您的代码的示例,它每 3 秒清除一次背景:

import ddf.minim.*;
Minim minim;
AudioInput in;

//3s as millis
int interval = 3 * 1000;
int time;

void setup() {
  fullScreen();
  background(255, 60, 80);

  time = millis();

  minim = new Minim(this);
  //minim.debugOn ();
  in = minim.getLineIn(Minim.MONO, 100);
}

void draw() {
  float soundlevel;
  float distance_top = random(100);

  soundlevel = in.mix.get(0);

  stroke(255, random(90, 255));
  line(0, distance_top + soundlevel * 4000, width, distance_top + soundlevel * 1000);
  line(0, distance_top + soundlevel * 1000, width, distance_top + soundlevel * 4000);

  if(millis() - time >= interval){
    // clear background
    background(255, 60, 80);
    // reset time for next interval
    time = millis();
    // debug
    println("=========================>  tick");
  }

}

有关millis() 延迟的更多信息,请参阅this answer

另一种选择是使用frameCount 进行计算框架。 例如,如果草图的frameRate 约为 60 fps,并且您希望大约每 3 秒清除一次,您可以检查 180 (3 * 60) 帧的倍数是否与 modulo(%) operator 一起传递。

import ddf.minim.*;
Minim minim;
AudioInput in;

void setup() {
  //fullScreen();
  size(300,300);
  background(255, 60, 80);

  minim = new Minim(this);
  //minim.debugOn ();
  in = minim.getLineIn(Minim.MONO, 100);
}

void draw() {
  float soundlevel;
  float distance_top = random(100);

  soundlevel = in.mix.get(0);

  stroke(255, random(90, 255));
  line(0, distance_top + soundlevel * 4000, width, distance_top + soundlevel * 1000);
  line(0, distance_top + soundlevel * 1000, width, distance_top + soundlevel * 4000);

  if(frameCount % (3 * 60) == 0){
    // clear background
    background(255, 60, 80);
    // debug
    println("=========================>  tick");
  }

}

【讨论】:

  • 我不想使用 keyPressed() 或 mousePressed() 它必须是自动的,这就是我搜索计数器的原因。
  • 上面较长的代码 sn-p 每 3 秒执行一次。你试过了吗?
猜你喜欢
  • 2013-07-06
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
相关资源
最近更新 更多