Home > Blockchain >  Editing a function within mousePressed
Editing a function within mousePressed

Time:11-04

I'm a beginner working with Processing trying to create a moving cloud sketch. They are to appear on mouseClick, and horizontally move across the screen.

void mousePressed() {
  int newCloud {
    xpos: mouseX;
    ypos: mouseY;
  }
  clouds.push(newCloud);
}

Here is the area I'm unable to fix, trying to work out the mousePressed part.

and here is my full code! It seems a simple fix but I've tried a bunch of ways rewriting it without succsess.

int[] clouds;
int cloudx;
int cloudy;
int xpos, ypos;

void setup() {
  size(600, 600);
  int cloudx=mouseX;
  int cloudy=mouseY;
}

void draw() {
  background(100);
  for (int i = 0; i < clouds.length; i  ) {
    int[] currentObj = clouds[i];
    cloud(currentObj.xpos, currentObj.ypos, currentObj.size);
    currentObj.xpos  = 0.5;
    currentObj.ypos  = random(-0.5, 0.5);
    if (clouds[i].xpos > width 20) {
      clouds.splice(i, 1);
    }
  }
}

void makeCloud (int x, int y){
  fill(250);
  noStroke();
  ellipse(x, y, 70, 50);
  ellipse(x   10, y   10, 70, 50);
  ellipse(x - 20, y   10, 70, 50);
}


void mousePressed() {
  int newCloud {
    xpos: mouseX;
    ypos: mouseY;
  }
  clouds.push(newCloud);
}

I had tried to make a new function, though the clouds wouldnt show, I also tried calling the makeCloud function though i know I need to be updating within this new function. Overall, I need help with how to write this statement for newCloud in the mousePressed function.

CodePudding user response:

Your code is irreparable for many reasons.

  • int[] clouds; will create a reference for Array of single integers, not objects,
  • void makeCloud (int x, int y){...}, will just draw some ellipses,
  • clouds.splice(i, 1); inside an Array will not work at all,

This is a working reconstruction of Your problem:

ArrayList<Cloud> clouds = new ArrayList<Cloud>();

void setup() {
  size(600, 600);
}

void draw() {
  background(100);
  drawClouds(clouds);
  removeExcessClouds(clouds);
}


/**
** Cloud class
**/
class Cloud {
  float xPos;
  float yPos;

  Cloud(float x, float y) {
    xPos = x;
    yPos = y;
  }

  void draw() {
    fill(250);
    noStroke();
    ellipse(xPos, yPos, 70, 50);
    ellipse(xPos   10, yPos   10, 70, 50);
    ellipse(xPos - 20, yPos   10, 70, 50);
  }
  
  void positionUpdate(float deltaX) {
    xPos  = deltaX;
    yPos  = random(-0.5, 0.5);    
  }
}


void drawClouds(ArrayList<Cloud> cds) {
  float wind = 0.5;
  for (Cloud cd : clouds) {
    cd.draw();
    cd.positionUpdate(wind);
  }
}


void removeExcessClouds(ArrayList<Cloud> cds) {
  int cdAmount = clouds.size();
  for (int i = 0; i<cdAmount; i  ) {
    if (clouds.get(i).xPos > width 20) {
      clouds.remove(i);
      cdAmount = clouds.size();
    }
  }
}


void mousePressed() {
  clouds.add(new Cloud(mouseX, mouseY));
  println(mouseX   ", "   mouseY   " : "   clouds.size());
}

Note:

  • global List initiation:
    ArrayList clouds = new ArrayList();
  • List proper iteration:
    for (Cloud cd : clouds) { foo(cd); }
  • draw method inside a Cloud,
  • passing values when calling methods.

So, now You can iterate over a List of Objects, and call a draw method inside each Cloud.

CodePudding user response:

As said in the other answer, you will need to refactor your code to use objects.

This looks like an atempt at a JS object literal - Java doesn't use them.

int newCloud {
    xpos: mouseX;
    ypos: mouseY;
}

You need to instance a Class:


Cloud myCloud = new Cloud(0,5); // You create a new variable of the Cloud type and initialize it with a new Cloud object (essentially calling the constructor)

class Cloud{
    int posX, posY;

    Cloud(int px, int py){ // This is called a constuctor and its the way a new instance is created
        this.posX = px;
        this.posY = py;
    }
}

Than for the array of clouds you need an ArrayList of Clouds:

ArrayList<Cloud> clouds = new ArrayList<Cloud>();

in the mousePressed event you than just add the new cloud to the arraylist:

clouds.add(myCloud);
  • Related