SOURCE

const mover = [];
let wind;// 风力
let gravity; // 重力

function setup() {
  createCanvas(600, 400);

  for (let i = 0; i < 20; i++) {
    let m = new Mover(random(width/2), random(height/2), random(1, 4));
    mover.push(m);
  }

}

function draw() {
  background(0);
  if(mouseIsPressed){
     wind = createVector(random(4), 0);
  }else{
     wind = createVector(random(1), 0);
  }
 
  gravity = createVector(0, random(1));
  
  for (let i = 0; i < mover.length; i++) {
    mover[i].applyForce(wind);
    mover[i].applyForce(gravity);
    mover[i].run();
  }
}

// 一个拥有位置(location), 速度(velocity), 加速度(acceleration)的 mover类

class Mover {
  constructor(x, y, m) {
    this.location = createVector(x, y);// 位置
    this.velocity = createVector(0, 0);// 速度
    this.acceleration = createVector(0, 0);// 加速度
    this.mass = m;// 质量
  }

  run() {
    this.checkEnd(this.location, this.velocity);

    this.update(this.location, this.velocity, this.acceleration);

    this.show(this.location, this.mass);
  }

  show(l, m) {
    fill(255);
    ellipse(l.x, l.y, m * 10, m * 10);
  }

  update(l, v, a) {
    v.add(a);// 加速度改变速度
    // v.limit(200);  上限力
    l.add(v);// 速度改变位置
    // v.mult(0); // 清空上一次加速度
    a.mult(0); // 清空上一帧加速度
  }

  applyForce(force) {
    /* 
    	力的累加, 力 除掉 质量
    */
    let f = p5.Vector.div(force, this.mass);// `现实中并非如此`
    this.acceleration.add(f);// 力改变加速度
  }

  checkEnd(l, v) {
    // if (l.x > width) {
    //   l.x = width;
    //   v.x *= -1;
    // } else if (l.x < 0) {
    //   v.x *= -1;
    //   l.x = 0;
    // }

    if (l.x > width) {
      v.x = 0;
      l.x = -10;
    }

    // if (l.y > height) {
    //   v.y *= -1
    //   l.y = height;
    // } else if (l.y < 0) {
    //   v.y *= -1;
    //   l.y = 0;
    // }
    
    if (l.y > height) {
      v.y = 0;
      l.y = -10;
    }
  }

}
console 命令行工具 X clear

                    
>
console