谁能看到我的代码的问题(无法将 int 转换为布尔值)处理

Can anyone see the issue with my code (cannot convert int to boolean) Processing

我正在尝试创建相反的结果。一次只有 1 个可见圆圈。

http://www.rpdms.com/satillusion/saturation%20illusionc.gif

我修改了我的代码

int nbr_circles = 2;
void setup() {
size(600, 600);
smooth();
background(255);
}

void draw() {
background(255);
float cx = width/2.0;
float cy = height/2.0;
fill(0);
//float x, y; //
for (int i = 0; i < nbr_circles; i++)
{
float angle = i * TWO_PI / nbr_circles;
float x = cx + 110.0 * cos(angle);
float y = cy + 110.0 * sin(angle);
ellipse(x, y, 20, 20);
}
}

void mousePressed() {

if (mouseButton == LEFT) {
if (nbr_circles < 20)
nbr_circles = nbr_circles + 1;

} else if (mouseButton == RIGHT) {
if (nbr_circles > 2)
nbr_circles = nbr_circles - 1;

}
}

对此

int nbr_circles = 1;
void setup() {    
  size(600, 600);
  smooth();
  background(255);
} 

void draw() { 
  float cx = width/2.0;
  float cy = height/2.0;
  fill(0);
  //float x, y; //
  for (int i = 0; i < nbr_circles; i++)
  {  
    float angle = i * TWO_PI / nbr_circles;
    float x = cx + 110.0 * cos(angle);                
    float y = cy + 110.0 * sin(angle);                
    ellipse(x, y, 20, 20);
  }
  for (int i = 0; i = nbr_circles; i++)
  {
    translate (width/2.0, height/2.0);
    rotate (radians());
  }
}

但是在第二个 for 循环中收到错误提示“无法将 int 转换为布尔值”。

我相信这不是唯一的错误。

谁能看出我错在哪里?

他的意思是在for (int i = 0; i = nbr_circles; i++)行中=没有意义,应该是停止循环的条件,=进行赋值,这在这个案例。它可能是 == 但这样循环就没有意义了……可能你想要一个 < 代替。 for 循环如下:

      int x = 0                        x < 10                 x = x+1

for(这个变量初始化为这个数字;当那个 var 满足这个条件时;对那个 var 这样做){}

如果我能正确理解您要完成的任务,我认为您甚至不需要第二个 for 循环。在第一个循环中,您已经完成了圆圈位置的所有计算,所以现在您只需要弄清楚如何一次只显示一个,对吗?

您上面的评论表明您刚刚开始使用 Processing(可能还有一般的编程),所以如果我对您已经知道的事情解释过多,请原谅我。

我会这样做:您可以在 setup() 中计算一次并将位置存储在数组中,而不是在 draw() 函数中计算每一帧上所有圆圈的位置。 Processing 中有一个方便的对象,即 PVector class,可用于轻松地将这些位置存储为 x 和 y 值。因此,在代码的顶部,就在 nbr_circles 的变量声明之后,您可以声明一个 PVectors 数组来存储所有圆的位置,如下所示:

PVector[] circles = new PVector[nbr_circles];

然后您可以将计算圆位置的代码移动到 setup() 中,而不是在计算点处显示圆,而是将值存储在数组中:

void setup() {    
    size(600, 600);
    smooth();
    background(255);

    float cx = width/2.0;
    float cy = height/2.0;
    for (int i = 0; i < nbr_circles; i++)
    {  
        float angle = i * TWO_PI / nbr_circles;
        float x = cx + 110.0 * cos(angle);                
        float y = cy + 110.0 * sin(angle);                
        circles[i] = new PVector(x, y);
    }
}

现在我们已经存储了所有圆的位置,如果我们想一次显示它们,我们可以在 draw() 函数中循环遍历数组并为每组坐标显示一个圆:

for (int i = 0; i < nbr_circles; i++) {
    ellipse(circles[i].x, circles[i].y, 20, 20);
}

但我们真正想做的是每次调用 draw() 函数时显示一个圆圈。不是每次都使用 for 循环遍历每个数组元素,我们只需要选择一个,我们希望那个是在最后一帧中显示的元素之后的那个。我们可以在顶部声明一个计数器变量,我们可以用它来跟踪应该显示哪个数组元素:

int counter = 0;

在 draw() 函数中,我们可以每次递增计数器并将该值用作数组索引。当然,一旦计数器变量变得大于数组中元素的数量,我们需要将它设置回 0。模运算符 (%) 可以帮助我们解决这个问题,它基本上是 returns 的余数除以两个数字。现在我们可以简单地每次通过(使用增量运算符 ++)将计数器变量加一,并使用模运算符始终获得从 0 到 (nbr_circles - 1) 的数字。这是我的 draw() 函数:

void draw() { 
    background(255);
    fill(0);

    int i = counter % nbr_circles;
    ellipse(circles[i].x, circles[i].y, 20, 20);
    counter++;
}

您会注意到圆圈绕圈的速度非常快;这是因为我认为默认帧速率(每秒调用 draw() 函数的次数)是 30。幸运的是,您可以在 setup() 函数内的某个地方调用一个简单的函数,它将帧速率设置为无论你想要什么。如果你想放慢速度,试试每秒 5 帧:

frameRate(5);

把这些放在一起,你应该拥有它!