如何在while循环中更改背景颜色 - 处理

时间:2014-11-19 09:33:43

标签: background while-loop arduino processing

我刚接触并尝试制作一个非常简单的程序,其中我有一个产生seriel输入的arduino(根据模拟读取值)。这个想法是一个处理窗口打开,块颜色显示30秒。在这段时间里,arduino的所有读数将被求和并取平均值 - 创建该颜色的平均值。

30秒后,颜色会发生变化,并开始计算新的平均值(下一种颜色)。这是我已经开始编写的代码(现在仅关注一个30秒的绿色时段)。

我意识到阅读/求和和平均可能存在问题(我还没有研究过这些问题,所以我会把它放到一边) - 但我的主要问题是为什么背景不是绿色?当我运行这个程序时,我希望背景为绿色30秒 - 其中发生的是它是白色30秒然后变为绿色。无法弄清楚原因!谢谢你的帮助!

import processing.serial.*;
Serial myPort;  


float gsrAverage;
float greenAverage;
int gsrValue;
int greenTotal = 0;
int greenCount = 1;

int timeSinceStart = 0;
int timeAtStart;
int count=0;
color green = color(118,236,0);


void setup () {
  size(900, 450);
  // List all the available serial ports
  //println(Serial.list());

  myPort = new Serial(this, Serial.list()[0], 9600);

}


void draw () {

  while (timeSinceStart < 30000) {
    background(green);
    greenTotal = greenTotal + gsrValue;
    greenCount = greenCount + 1;
    delay(500);
    timeSinceStart = millis()-timeAtStart;
    //println(timeSinceStart); for de bugging
  }
  greenAverage = greenTotal/greenCount;

//println(greenAverage); for de bugging
}

void serialEvent (Serial myPort) {
  int inByte=myPort.read();
  //0-255
  gsrValue=inByte;
}

3 个答案:

答案 0 :(得分:0)

可能已经找到了一种使用IF语句的方法。我也许看了一下draw函数本身就是一个循环的事实,所以我能够使用

的变体
if (timeSinceStart < 5000) {
background(green);
}
在平局中

答案 1 :(得分:0)

我想为计时器做些什么,是使用IF语句并使用millis()或不断更新的变量&#39; m&#39;在条件内:

int timeSinceStart;
int m;

void setup(){
  timeSinceStart = millis(); // initialize here so it only happens once
}

void draw(){
  m = millis(); // constantly update the variable

  if(timeSinceStart + 30000 < m){
    greenAverage = greenTotal/greenCount; // or whatever is outside while loop
    timeSinceStart = millis();
  }

  //Anything that went inside the while loop can go here, or above the IF

}

这使得每30秒左右,背景将改变一次,你只需重新更新timeSinceStart变量。这样,它只会在您希望更新时更新,而不是不断更新和破坏代码。

我倾向于不在处理过程中使用while循环,因为它们通常会导致头痛。希望我的例子有所帮助。

答案 2 :(得分:0)

在处理Processing中的定时事件时,不应在draw()函数中使用while循环。 draw()函数本身是一个while循环,它更新每帧的“屏幕”。

所以,你应该做的是创建一个计时器,让它在draw()函数内为你做一个开关。在您的情况下,如果您想以绿色屏幕开始,则在setup()函数中执行此操作,然后根据draw()函数中的计时器创建一个更改方法。

这是关于如何解决您的特定问题的建议。只需根据需要更改循环变量即可。在你的情况下,它将是30000。

boolean isGreen = true;
int startTime = 0;
int lastTime = 0;
int cycle = 1000; //the cycle you need

void setup() {
  size(200, 200);
  background(0, 255, 0); //green
}

void draw() {
  startTime = millis();

  if (startTime > lastTime + cycle) {
    if (isGreen) {
      background(255); //white
      isGreen = !isGreen;
    } else {
      background(0, 255, 0); //green
      isGreen = !isGreen;
    }
    lastTime = millis();
  }
}