var systems; function setup() { createCanvas(1000, 1000); systems = []; } function draw() { background(51); background(0); for (i = 0; i < systems.length; i++) { systems[i].run(); systems[i].addParticle(); } if (systems.length==0) { fill(255); textAlign(CENTER); textSize(32); text("点击以释放隐藏的带圆心圆环", width/2, height/2); } } function mousePressed() { this.p = new ParticleSystem(createVector(mouseX, mouseY)); systems.push(p); } // A simple Particle class var Particle = function(position) { this.velocity = createVector(random(-10, 10), random(-10, 10)); this.position = position.copy(); this.lifespan = 125.0;//可视范围 }; Particle.prototype.run = function() { this.update(); this.display(); }; // Method to update position Particle.prototype.update = function(){ this.velocity.add(this.acceleration); this.position.add(this.velocity); this.lifespan -= 3; }; // Method to display Particle.prototype.display = function () { stroke(400, this.lifespan); strokeWeight(6); fill(55, this.lifespan); ellipse(this.position.x, this.position.y, random(-50,50), random(-50,50)); }; // Is the particle still useful? Particle.prototype.isDead = function () { if (this.lifespan < 0) { return true; } else { return false; } }; var ParticleSystem = function (position) { this.origin = position.copy(); this.particles = []; }; ParticleSystem.prototype.addParticle = function () { // Add either a Particle or CrazyParticle to the system if (int(random(0, 2)) == 0) { p = new Particle(this.origin); } else { p = new CrazyParticle(this.origin); } this.particles.push(p); }; ParticleSystem.prototype.run = function () { for (var i = this.particles.length - 1; i >= 0; i--) { var p = this.particles[i]; p.run(); if (p.isDead()) { this.particles.splice(i,200); } } }; // A subclass of Particle function CrazyParticle(origin) { // Call the parent constructor, making sure (using Function#call) // that "this" is set correctly during the call Particle.call(this, origin); // Initialize our added properties this.theta = 444.0; }; // Create a Crazy.prototype object that inherits from Particle.prototype. // Note: A common error here is to use "new Particle()" to create the // Crazy.prototype. That's incorrect for several reasons, not least // that we don't have anything to give Particle for the "origin" // argument. The correct place to call Particle is above, where we call // it from Crazy. CrazyParticle.prototype = Object.create(Particle.prototype); // See note below // Set the "constructor" property to refer to CrazyParticle CrazyParticle.prototype.constructor = CrazyParticle; // Notice we don't have the method run() here; it is inherited from Particle // This update() method overrides the parent class update() method CrazyParticle.prototype.update=function() { Particle.prototype.update.call(this); // Increment rotation based on horizontal velocity this.theta += (this.velocity.x * this.velocity.mag()) / 1.0; } // This display() method overrides the parent class display() method CrazyParticle.prototype.display=function() { // Render the ellipse just like in a regular particle Particle.prototype.display.call(this); // Then add a rotating line push(); translate(this.position.x, this.position.y); rotate(this.theta); stroke(999,this.lifespan); line(0,0,0,0); pop(); }