Trying to create particle array of graphical masks, having trouble with code logic
in
Programming Questions
•
1 year ago
Hello, all, working on a project that's got me stumped.
What I am trying to do: Create a visual effect where there is a graphical mask over an image that appears to be exploding like fireworks.
Where I am: I have a particle system, thanks to
Daniel Shiffman, which explodes from mouseX mouseY. Also have working graphical mask that follows mouseX and mouseX.
Where I am stuck: I was trying to modify the simple particle class so that each particle was a mini mask, but kept getting errors when trying to combine the code(s). I think my problem lies within trying to create a mask, which depends on information at the top level fo the code INSIDE a class for each instance of the class.
I am super stuck and would highly appreciate any help y'all can give me.
Cheers, thanks, and infinite praise in advance!
Here is the code (a bit messy, sorry):
- import gifAnimation.*;
- //PImage bgImage;
- PImage maskImage;
- PGraphics graphicalMask;
- int iw, ih;
- int dw, dh;
- int angle = 0;
- Gif bgImage;
- //here we are creating an array of x and y positions.
- float [] x = new float [50]; //create an empty array of 50 x positions
- float [] y = new float [50]; // do the same for y
- ParticleSystem ps;
- void setup()
- {
- size(500, 260);
- colorMode(RGB, 255, 255, 255, 100);
- bgImage = new Gif(this, "slowloop-storm.gif");
- bgImage.loop();
- ps = new ParticleSystem(1, new PVector(width/2,height/2,0));
- smooth();
- graphicalMask = createGraphics(500, 280, JAVA2D);
- //ok, here you are creating a loop that says to set the *initial* value of
- // each item in your array to 0. It's basically initializing the array (I think)
- for (int i = 0; i<50; i++){ //here, i is an iterator we create temporarily
- x[i] = 0;
- y[i] = 0;
- }
- //end for loop
- }
- void draw()
- {
- background(0,0,0);
- ps.run();
- ps.addParticle(mouseX,mouseY);
- graphicalMask.beginDraw();
- // Erase graphics
- graphicalMask.background(0);
- // Draw the mask
- graphicalMask.noStroke();
- for(int i = 0; i < x.length; i++){
- graphicalMask.fill(i * (255 / x.length) );
- graphicalMask.ellipse(x[i], y[i], i*3, i*3);
- }
- graphicalMask.endDraw();
- angle += 10;
- float val = cos(radians(angle)) * 6.0;
- for (int a = 0; a < 360; a += 50) {
- float xoff = cos(radians(a)) * val;
- float yoff = sin(radians(a)) * val;
- graphicalMask.fill(255);
- graphicalMask.noStroke();
- graphicalMask.ellipse(mouseX + xoff, mouseY + yoff, 20,20);
- }
- graphicalMask.endDraw();
- // Copy the original image (kept as reference)
- maskImage = bgImage.get();
- // Apply the mask
- maskImage.mask(graphicalMask);
- // Display the result
- image(maskImage, dw/2, dh/2);
- /////Ok, here is another for-loop. What we're doing is cycling through the array
- // and setting the value of each item in the array to the one before it
- for (int i=0; i<49; i++) {
- x[i] = x [i + 1];
- y[i] = y [i + 1];
- fill (i*2, 0); //set the fill color by i
- noStroke();
- ellipse (x[i], y[i], i, i);
- }
- //so each time the draw loop happens, we start this loop and go and reset the x and y values to the previous value
- x[49] = mouseX;
- y[49] = mouseY;
- }
- // A class to describe a group of Particles
- // An ArrayList is used to manage the list of Particles
- class ParticleSystem {
- ArrayList particles; // An arraylist for all the particles
- PVector origin; // An origin point for where particles are born
- ParticleSystem(int num, PVector v) {
- particles = new ArrayList(); // Initialize the arraylist
- origin = v.get(); // Store the origin point
- for (int i = 0; i < num; i++) {
- particles.add(new Particle(origin)); // Add "num" amount of particles to the arraylist
- }
- }
- void run() {
- // Cycle through the ArrayList backwards b/c we are deleting
- for (int i = particles.size()-1; i >= 0; i--) {
- Particle p = (Particle) particles.get(i);
- p.run();
- if (p.dead()) {
- particles.remove(i);
- }
- }
- }
- void addParticle() {
- particles.add(new Particle(origin));
- }
- void addParticle(float x, float y) {
- particles.add(new Particle(new PVector(x,y)));
- }
- void addParticle(Particle p) {
- particles.add(p);
- }
- // A method to test if the particle system still has particles
- boolean dead() {
- if (particles.isEmpty()) {
- return true;
- } else {
- return false;
- }
- }
- }
- // A simple Particle class
- class Particle {
- PVector loc;
- PVector vel;
- PVector acc;
- float r;
- float timer;
- // Another constructor (the one we are using here)
- Particle(PVector l) {
- acc = new PVector(0,0.05,0);
- vel = new PVector(random(-1,1),random(-2,0),0);
- loc = l.get();
- r = 10.0;
- timer = 100.0;
- }
- void run() {
- update();
- render();
- }
- // Method to update location
- void update() {
- vel.add(acc);
- loc.add(vel);
- timer -= 1.0;
- }
- // Method to display
- void render() {
- ellipseMode(CENTER);
- stroke(255,timer);
- fill(100,timer);
- ellipse(loc.x,loc.y,r,r);
- displayVector(vel,loc.x,loc.y,10);
- }
- // Is the particle still useful?
- boolean dead() {
- if (timer <= 0.0) {
- return true;
- } else {
- return false;
- }
- }
- void displayVector(PVector v, float x, float y, float scayl) {
- pushMatrix();
- float arrowsize = 4;
- // Translate to location to render vector
- translate(x,y);
- stroke(255);
- // Call vector heading function to get direction (note that pointing up is a heading of 0) and rotate
- rotate(v.heading2D());
- // Calculate length of vector & scale it to be bigger or smaller if necessary
- float len = v.mag()*scayl;
- // Draw three lines to make an arrow (draw pointing up since we've rotate to the proper direction)
- line(0,0,len,0);
- line(len,0,len-arrowsize,+arrowsize/2);
- line(len,0,len-arrowsize,-arrowsize/2);
- popMatrix();
- }
- }
1