class Cloud { PVector pos; float radius; final PVector shade_dir; final PVector shade_perp; Cloud(PVector p) { pos = p; radius = random(CLOUD_MAX_R - CLOUD_MIN_R)+CLOUD_MIN_R; shade_dir = new PVector(cos(SHADE_ANGLE), sin(SHADE_ANGLE)); shade_perp = new PVector(cos(SHADE_ANGLE+HALF_PI), sin(SHADE_ANGLE+HALF_PI)); } boolean shades(PVector p) { PVector to = PVector.sub(p, pos); if(inRadius(p, pos, radius)) return true; if(to.dot(shade_dir) < 0) return false; return abs(to.dot(shade_perp)) < radius; } } class CloudFluff extends Particle { CloudFluff(PVector p) { super(PVector.add(p, randomVector(random(15))), randomVector(random(1)), 360); } void tick() { float d = PVector.dist(pos, player_pos); d*= 2; d += 1; vel.mult(0.95); vel.mult(1 - 1/d); vel.add(PVector.mult(player_vel, 1/d)); super.tick(); } void draw() { noStroke(); strokeWeight(1); fill(255, 255*life/maxlife); ellipse(pos.x, pos.y, 10*life/maxlife, 10*life/maxlife); } }