在数组列表中获取"size() does not exist"错误



我正在修改项目的植绒模拟。添加对象很好,但是当我尝试删除对象时,在第 240 行出现"函数 size() 不存在"错误。问题可能出在 AdjSize() 和 subBoid() 的末尾,但我不知道是什么原因造成的。我已经简化了一些代码,所以它只是 ArrayList 蜂拥而至的东西。

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);
  }
}

你在 Flock 对象上调用 size(),而不是在 ArrayList 上。如果你想让 Flock 有一个可调用的size()方法,你必须先给它一个。例如,

class Flock {
   // ....
  public int size() {
    return boids.size();
  }
}

相关内容

  • 没有找到相关文章

最新更新