使用“random()”的变量每次被调用时都会改变

问题描述 投票:0回答:3
void draw() {
    z = float(random(255));
    x = float(random(255));
    c = float(random(255));
    background(z, x, c);
    delay(500);
    background(c, x, z);
}

我希望

z
x
c
变量在被调用到第二个
background()
命令时不会改变,但不能完全弄清楚。

我尝试使用

frameRate(1)
制作其他变量,并将
delay(500)
命令移动到第二次
background()
之后,但不幸的是,变量在第二次被调用时发生了变化,我希望它们保持它们的值直到下一次
 void draw()
循环。

random processing
3个回答
1
投票

即使使用

delay()
调用(我不推荐),第二次调用
background()
时,您也会覆盖第一次调用期间设置的值。 您可能希望每帧更改一次颜色(而不是两次)。

如果您想在两个调用之间切换 (

(z,x,c)
/
(c, x, z)
),您可以使用单独的布尔值或表达式在两者之间切换(从而避免在同一帧中两次更改背景)。

例如,您可以检查

frameCount
和模数(
%
)以检查帧是否交替。

例如

if (frameCount % 2 == 0){   
  background(z, x, c);
}else{
  background(c, x, z);
}

Warning:如果你的帧率很高,这基本上看起来会闪闪发光。

鉴于 r、g、b 值无论如何都是随机的,从感知上很难区分。

(目前尚不清楚您要达到的整体效果在视觉上是什么,但至少您在上面有关于如何在两种颜色之间交换的提示)


0
投票

假设您有一个名为

initialized
的布尔变量,其初始值为
false
,那么您可以检查它的值并将其设置为true,如果它是
false
。这将确保您的变量在第一次调用时被初始化,但之后不会更改它们的值:

void draw() {
    if (!initialized) {
        z = float(random(255));
        x = float(random(255));
        c = float(random(255));
        initialized = true;
    }
    background(z, x, c);
    delay(500);
    background(c, x, z);
}

0
投票

如果你放慢演示的速度,就更容易看到发生了什么。您不能在单个框架中更改背景颜色;你只能拍一张照片/一帧。但是您可以做的是仅在偶数帧计数上设置背景颜色,然后将交换值用于奇数帧计数。控制台输出确认中间值保持不变,而值 1 和值 3 交换备用背景颜色的位置。

float z, x, c;

void setup() {
  size(200, 200);
  background(255);
  frameRate(1);
}

void draw() {
  println("===============================");
  if (frameCount % 2 == 0) {
    z = random(255);
    x = random(255);
    c = random(255);
    println("1:", z, x, c);
    background(z, x, c);
    delay(5000);
  } else {
    println("2:", c, x, z);
    background(c, x, z);
    delay(5000);
  }  
}

控制台输出:

© www.soinside.com 2019 - 2024. All rights reserved.