Question

I'm modifying a flocking simulation for a project. Adding objects is fine but when I try to remove objects I get a "The function size() does not exist" error on line 240. The problem is probably at the end in AdjSize() and subBoid() but I don't know what's causing it. I've simplified the code down a bit so it's just the ArrayList flocking stuff.

Flock flock;
float k, l;
int previous = 0;
int test = 0;

void setup() 
{
  size(1920, 1080);
  flock = new Flock();
  for (int i = 0; i < 150; i++) 
  {
    flock.addBoid(new Boid(width/2,height/2));
  }
}

void draw()
{
  background(0);
  flock.run();
  flock.AdjSize(); 
}



// The Boid class
class Boid 
{

  PVector location;
  PVector velocity;
  PVector acceleration;
  float r;
  float maxforce;  // Maximum steering force
  float maxspeed;  // Maximum speed

  Boid(float x, float y)
  {
    acceleration = new PVector(0, 0);

    float angle = random(TWO_PI);
    velocity = new PVector(cos(angle), sin(angle));

    location = new PVector(x, y);
    r = 2.0;
    maxspeed = 2;
    maxforce = 0.03;
  }



  void run(ArrayList<Boid> boids)
  {
    flock(boids);
    update();
    borders();
    render();
  }

  void applyForce(PVector force)
  {
    acceleration.add(force);
  }

  void flock(ArrayList<Boid> boids)
  {
    PVector sep = separate(boids);   // Separation
    PVector ali = align(boids);    // Alignment
    PVector coh = cohesion(boids);   // Cohesion
    sep.mult(1.5);
    ali.mult(1.0);
    coh.mult(1.0);
    applyForce(sep);
    applyForce(ali);
    applyForce(coh);
  }

  // Method to update location
  void update()
  {
    // Update velocity
    velocity.add(acceleration);
    // Limit speed
    velocity.limit(maxspeed);
    location.add(velocity);
    // Reset accelertion to 0 each cycle
    acceleration.mult(0);
  }

  PVector seek(PVector target)
  {
    PVector desired = PVector.sub(target, location); 
    desired.normalize();
    desired.mult(maxspeed);

    PVector steer = PVector.sub(desired, velocity);
    steer.limit(maxforce);  // Limit to maximum steering force
    return steer;
  }

  void render()
  {
    float theta = velocity.heading2D() + radians(90);

    fill(255, 255,255);
    stroke(255);
    pushMatrix();
    translate(location.x, location.y);
    rotate(theta);
    beginShape();
    vertex(r*15, r*17); //Left wing tip
    vertex(r*25, r*10); //Left wing top point
    vertex(r*30, r*13); //middle divit
    vertex(r*35, r*10); //right wing top point
    vertex(r*45, r*17); //right wing tip
    vertex(r*30, r*13); //underswoop
    endShape(CLOSE);
    popMatrix();
  }

  void borders()
  {
    if (location.x < -r) location.x = width+r;
    if (location.y < -r) location.y = height+r;
    if (location.x > width+r) location.x = -r;
    if (location.y > height+r) location.y = -r;
  }

  PVector separate (ArrayList<Boid> boids) {
  float desiredseparation = 25.0f;
  PVector steer = new PVector(0, 0, 0);
  int count = 0;
  for (Boid other : boids)
  {
    float d = PVector.dist(location, other.location);
    if ((d > 0) && (d < desiredseparation))
    {
      PVector diff = PVector.sub(location, other.location);
      diff.normalize();
      diff.div(d);      // Weight by distance
      steer.add(diff);
      count++;          // Keep track of how many
    }
  }
  if (count > 0) 
  {
    steer.div((float)count);
  }
  if (steer.mag() > 0) 
  {
    steer.normalize();
    steer.mult(maxspeed);
    steer.sub(velocity);
    steer.limit(maxforce);
  }
    return steer;
  }

  // Alignment
  PVector align (ArrayList<Boid> boids)
  {
    float neighbordist = 50;
    PVector sum = new PVector(0, 0);
    int count = 0;
    for (Boid other : boids)
    {
      float d = PVector.dist(location, other.location);
      if ((d > 0) && (d < neighbordist))
      {
        sum.add(other.velocity);
        count++;
      }
    }
    if (count > 0)
    {
      sum.div((float)count);
      sum.normalize();
      sum.mult(maxspeed);
      PVector steer = PVector.sub(sum, velocity);
      steer.limit(maxforce);
      return steer;
    }
    else
    {
      return new PVector(0, 0);
    }
  }

  PVector cohesion (ArrayList<Boid> boids) {
  float neighbordist = 50;
  PVector sum = new PVector(0, 0);   
  int count = 0;
  for (Boid other : boids)
  {
    float d = PVector.dist(location, other.location);
    if ((d > 0) && (d < neighbordist))
    {
        sum.add(other.location); // Add location
      count++;
    }
  }
  if (count > 0)
  {
      sum.div(count);
    return seek(sum);  // Steer towards the location
  }


  else
  {
      return new PVector(0, 0);
  }
 }
}
class Flock
{
  ArrayList<Boid> boids; // An ArrayList for all the boids

  Flock()
  {
    boids = new ArrayList<Boid>(); // Initialize the ArrayList
  }

  void run()
  {
    for (Boid b : boids)
    {
      b.run(boids); 
    }
  }

  void AdjSize()
  {
    if(test == 0)
    {
      flock.addBoid(new Boid(width/2,height/2));
      test = 1;
    }
    else
    {
    flock.subBoid(flock.size() - 1);
    }
  }

  void addBoid(Boid b)
  {
    boids.add(b);
  }

  void subBoid(Boid b)
  {
   boids.remove(b);
  }
}
Was it helpful?

Solution

You're calling size() on your Flock object, not on an ArrayList. If you want Flock to have a callable size() method, you're going to have to give it one first. e.g.,

class Flock {
   // ....

  public int size() {
    return boids.size();
  }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top