处理椭圆绘制其余部分并且不同步

时间:2017-05-02 14:46:33

标签: java processing

这段代码应该有一个椭圆,后面有一个椭圆形的“痕迹”,它的大小会减小,变得更白。它被称为“Smoke Trail”,此代码中的省略号在大多数情况下都能正常工作。代码中存在一个问题,其中一个省略号在路径上绘制并且不会像其他所有省略一样落后。我认为它与for循环的第一个或最后一个椭圆有关

int count = 75;
int made = 0;
Smokes[] arrSmokes = new Smokes[count];
void setup()
{
  size(800, 800);
}

void draw()
{
  background(255);

  if(made < count)
  {
  arrSmokes[made] = new Smokes();
  made += 1;
  }
  for(int i = 0; i < made; i += 1)
   {
      arrSmokes[i].render();
   }
}

public class Smokes{
  int xCoord, yCoord;
  float size;

  Smokes()
  {
    xCoord = mouseX;
    yCoord = mouseY;
    size = 100;
  }

  void render()
  {
    noStroke();
    ellipse(xCoord, yCoord, size, size);
    size -= 4;

    if(size <= 0)
    {
      xCoord = mouseX;
      yCoord = mouseY;
      size = 100;
    }
  }
}

1 个答案:

答案 0 :(得分:0)

由于您保留旧的烟雾实例并重置它们,因此您必须存储圆圈的顶部。只需使用整数即可。

int top = 0;

现在你必须给每个圆圈赋予它在数组中的数字......

if (made < count) {
    arrSmokes[made] = new Smokes(made);
    made ++;
}
/*
...
*/
int number;
Smokes(int number)
{
  this.number = number;
  //Initialyze
}

现在,每次重置Smoke粒子时都必须更改列表的顶部。

void reset()
{
  xCoord = mouseX;
  yCoord = mouseY;
  c = 0;
  size = 100;
  top = number;
}

你的for循环现在应该从顶部的一个条目开始,一直到数组的末尾然后跳转到第一个条目并运行直到它到达顶部条目。

for (int i = (top+1)%count; i != top; i = (i+1)%count) {
  if (i >= made) continue;
  arrSmokes[i].render();
}

由于在执行&#34; render();&#34;时不允许更改顶部。你必须添加一个函数&#34; evaluate();&#34;你完成了每一次&#34; render();&#34;。

之后你运行的
void evaluate()
{
  c += 10.2;
  size -= 4;
  if (size <= 0) {
    reset();
  }
}

void render()
{
  noStroke();
  fill(c);
  ellipse(xCoord, yCoord, size, size);
}

现在你应该好好去。如果我把你弄乱了一点,那么这又是整个来源:https://pastebin.com/urzbzmEb

但我建议使用ArrayList,因为Java是基于对象的,并且有自己的垃圾收集器。 ArrayList的好处是你每次都知道列表中的最后一个对象是顶部圆圈。 以下是使用ArrayList的样子。

ArrayList<Smokes> smokes = new ArrayList<Smokes>();

void setup() {
  size(800, 800);
}

void draw() {
  background(255);
  smokes.add(new Smokes(mouseX, mouseY));
  for (int i = 0; i < smokes.size(); i ++) {
     smokes.get(i).render(); 
  }
}

public class Smokes {
  int xCoord, yCoord;
  float size = 100, c = 0;

  Smokes(int x, int y) {
    xCoord = x;
    yCoord = y;
  }

  void render() {
    noStroke();
    fill(c);
    ellipse(xCoord, yCoord, size, size);
    c += 10.2;
    size -= 4;
    if (size <= 0) {
      smokes.remove(this);
    }
  }

}