该效果是借鉴了Daniel Shiffman的代码,他写的Learning Processing以及The nature of code是学习Processing语言以及生成艺术(Generative Art)学生必看的经典。

首先我们先通过雨滴对象做出一滴雨滴滴下的效果:

Drop drop;

void setup(){
   
  size(640, 360);
  drop = new Drop();
}

void draw(){
  background(230, 230, 250);
  drop.fall();
  drop.show();
}


class Drop {
  float x = width/2;
  float y = 0;
  float yspeed = 1;
  
  void fall(){
    y = y + yspeed;
  }

  void show(){
    stroke(138, 43, 226);
    line(x, y, x, y+10);
  }
}

3_1.gif

我们创建了Drop这个类,并实例化drop对象,通过fall函数改变雨滴的位置,show函数显示雨滴的形状。就这样,我们实现了一滴雨滴掉落的样子。

接着我们需要同时下落500滴雨滴,要使用数组。

首先我们要建立数组:
Drop drop变为 Drop[] drops = new Drop[500],创建一个含有500个元素的数组。

然后在setup中,初始化数组中的每个元素。

for(int i = 0; i<500; i++){
   drops[i] = new Drop();
}

最后需要在draw中,让每个雨滴显示出来:

for(int i = 0; i<500; i++){
    drops[i].fall();
    drops[i].show();
}

还需要在fall函数中,让雨滴到达最下面后,重新回到页面的顶部再坠落:

 if (y > height){
      y = random(-100, -200);
 }

改写后的代码如下所示:


Drop[] drops = new Drop[500];

void setup(){
   
  size(640, 360);
  for(int i = 0; i<500; i++){
    drops[i] = new Drop();
  }
}

void draw(){
 background(230, 230, 250);
 for(int i = 0; i<500; i++){
     drops[i].fall();
     drops[i].show();
  }
}


class Drop {
  float x = random(0, width);
  float y = random(-100, -200);
  float yspeed = random(4, 10);
  
  void fall(){
    y = y + yspeed;
    if (y > height){
      y = random(-100, -200);
    }
  }
  void show(){
    stroke(138, 43, 226);
    line(x, y, x, y+random(1,15));
  }
}

3_2.gif


Jim_Xiao
58 声望2 粉丝