简体   繁体   中英

Why is this error showing up? — Processing

Could anyone share with me why I am getting this error? Basically it's a program where I want to simulate basic basic plant growth. I want to do it in such a way that the petals are all stored in an array of circles.

Stem myStem;
Circle circles;

float scaleFactor=0.5;

void setup() {
  size(floor(400*scaleFactor), floor(800*scaleFactor));
  myStem = new Stem(200,800);

}

void draw() {

  background(150);
  smooth();
  Circle circles[];
  circles = new Circle[5];
  circles[0]  = new Circle(0, -40, 50, 50);
  circles[1]  = new Circle(0, -40, 50, 50);
  circles[2]  = new Circle(0, -40, 50, 50);
  circles[3]  = new Circle(0, -40, 50, 50);
  circles[4]  = new Circle(0, -40, 50, 50);

  for (int i = 0; i < circles.length; i++) {
   circles = ellipse(circles[i].c1, circles[i].c2, circles[i].c3, circles[i].c4);
   rotate(radians(72));
   circles[i] = Circle;
  }

  myStem.drawStem();

}

class Stem { 
  int initalloX=200;
  int initalloY=800;

  Stem(int tempInitalloX, int tempInitalloY) {
    initalloX = tempInitalloX;
    initalloY = tempInitalloY;

  }

  void drawStem() {
    background(#0DBADB);
    scale(scaleFactor, scaleFactor);
    stroke (12, 149, 11);
    fill (12, 149, 11);
    strokeWeight(10);
    line(initalloX, initalloY, initalloX, ((frameCount>250)?initalloY-500:initalloY-(2*frameCount)));
    //stem1
    if (frameCount>101) {
      noStroke();
      translate(initalloX, initalloY-200);
      scale(min((float)(frameCount-100)/100, 1), min((float)(frameCount-100)/100, 1));
      beginShape();
      vertex(0, 0);
      bezierVertex(-40, -5, -30, -40, -80, -20);
      bezierVertex(-47, -16, -52, 8, 0, 0);
      endShape(CLOSE);
      scale(1/min((float)(frameCount-100)/100, 1), 1/min((float)(frameCount-100)/100, 1));
      translate(-initalloX, -(initalloY-200));
    }
    //stem2
    if (frameCount>151) {
      noStroke();
      translate(initalloX, initalloY-300);
      scale(-min((float)(frameCount-150)/150, 1), min((float)(frameCount-150)/150, 1));
      beginShape();
      vertex(0, 0);
      bezierVertex(-40, -5, -30, -40, -80, -20);
      bezierVertex(-47, -16, -52, 8, 0, 0);
      endShape(CLOSE);
      scale(-1/min((float)(frameCount-150)/150, 1), 1/min((float)(frameCount-150)/150, 1));
      translate(-initalloX, -(initalloY-300));
    }
  }
}

class Circle {

  int c1 = 0;
  int c2 = -40;
  int c3 = 50;
  int c4 = 50;

  Circle(int tc1, int tc2, int tc3, int tc4) {
    c1 = tc1;
    c2 = tc2;
    c3 = tc3;
    c4 = tc4;
  }
 }

Thanks in advance... All help is much appreciated.

Learned something new I guess for declaring an array.

As for what is going wrong, it looks like you're using a Circle variable called "circle" and confusing it with an array of Circles by also calling it circle which probably is leading to all sorts of problems. That's probably what you should focus on fixing.

Guessing...

There are two definitions of circles in the class

        Circle circles

        Circle[] circles

I think this circles[i] = Circle; is the error. You cannot asign a Type (the class Circle) to a variable (ie an Object or an instance of a class)

Besides all thing already pointed, note that ellipse() is a void method, and so, it won't return anything. Thus a line like circle = ellipse(x,y,z,z) has no meaning. You probably wan to use the values stored in ciclcle[i] to draw ellipses, so just call ellipse(circles[i].c1, circles[i].c2, circles[i].c3, circles[i].c4); no need for assigning it. Also i don't see why create 5 equal circles. If your circle object is just storing data, why store the same data five times? The call:

for (int i = 0; i < circles.length; i++) {
ellipse(0, -40, 50, 50);
rotate(radians(72));
}

Will have the same effect.

Besides that calling background() at the end of draw (trough myStem.drawStem()) will hide all things previously drawn. And yet there is no need to recreate the array and reassign the values 60 times per second, you can move it to setup.

I made those changes to your code. It will compile now. Still the "petals" is beeing drawn at origin, and the fill/stroke of them needs to be handled, but at least it is running :) You may want to make a display method in your circle class... More like i pointed in the other post you made. cheers!

Stem myStem;

//Circle circles; // double declaration
  Circle circles[]; // keeping the array one only

float scaleFactor=0.5;

void setup() {
  size(floor(400*scaleFactor), floor(800*scaleFactor));
  myStem = new Stem(200,800);

  //mpoved this to setup, no need to recreate each frame
  circles = new Circle[5];
  circles[0]  = new Circle(0, -40, 50, 50);
  circles[1]  = new Circle(0, -40, 50, 50);
  circles[2]  = new Circle(0, -40, 50, 50);
  circles[3]  = new Circle(0, -40, 50, 50);
  circles[4]  = new Circle(0, -40, 50, 50);
  // also smooth only needs to be called once
  // unless ther is a noSmooth() somewhere
  smooth();

}

void draw() {

  // moved this here
  background(#0DBADB);

  for (int i = 0; i < circles.length; i++) {
   ellipse(circles[i].c1, circles[i].c2, circles[i].c3, circles[i].c4);
   // note you may use this instead
   //ellipse(0, -40, 50, 50);
   rotate(radians(72));
  }

  myStem.drawStem();


}



class Stem { 
  int initalloX=200;
  int initalloY=800;

  Stem(int tempInitalloX, int tempInitalloY) {
    initalloX = tempInitalloX;
    initalloY = tempInitalloY;

  }

  void drawStem() {
    //background(#0DBADB); // this was hiding all other draws
    scale(scaleFactor, scaleFactor);
    stroke (12, 149, 11);
    fill (12, 149, 11);
    strokeWeight(10);
    line(initalloX, initalloY, initalloX, ((frameCount>250)?initalloY-500:initalloY-(2*frameCount)));
    //stem1
    if (frameCount>101) {
      noStroke();
      translate(initalloX, initalloY-200);
      scale(min((float)(frameCount-100)/100, 1), min((float)(frameCount-100)/100, 1));
      beginShape();
      vertex(0, 0);
      bezierVertex(-40, -5, -30, -40, -80, -20);
      bezierVertex(-47, -16, -52, 8, 0, 0);
      endShape(CLOSE);
      scale(1/min((float)(frameCount-100)/100, 1), 1/min((float)(frameCount-100)/100, 1));
      translate(-initalloX, -(initalloY-200));
    }
    //stem2
    if (frameCount>151) {
      noStroke();
      translate(initalloX, initalloY-300);
      scale(-min((float)(frameCount-150)/150, 1), min((float)(frameCount-150)/150, 1));
      beginShape();
      vertex(0, 0);
      bezierVertex(-40, -5, -30, -40, -80, -20);
      bezierVertex(-47, -16, -52, 8, 0, 0);
      endShape(CLOSE);
      scale(-1/min((float)(frameCount-150)/150, 1), 1/min((float)(frameCount-150)/150, 1));
      translate(-initalloX, -(initalloY-300));
    }
  }
}

class Circle {

  int c1 = 0;
  int c2 = -40;
  int c3 = 50;
  int c4 = 50;

  Circle(int tc1, int tc2, int tc3, int tc4) {
    c1 = tc1;
    c2 = tc2;
    c3 = tc3;
    c4 = tc4;
  }
 }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM