Processing: Wie kann ich viele Kugeln zu zufälligen Zeitpunkten von oben nach unten schicken?

1 Antwort

Mit Klassen und Objekten hast du dich sicherlich noch nicht befasst? Weil dann könnte man alle Elemente, die deine eine Kugel beschreiben, zusammenfassen.

Wenn du noch nicht so weit bist: Nicht schlimm. Arbeite mit Arrays. Zum Beispiel ein Array für den y-Wert deiner Kugeln, oder ein Array für den x-Wert deiner Kugeln, etc.. Die Anzahl an Kugeln kannst du in einer eigenen Variable zwischenspeichern, die du auch beim Anlegen der Arrays verwendest.

int[] xCoordinatesOfBalls = new int[numberOfBalls];
// etc. ...

Über die Arrays iterierst du schließlich mit einer Schleife.

for (int i = 0; i < numberOfBalls; ++i) {
  ellipse(xCoordinatesOfBalls[i], yCoordinatesOfBalls[i], ballDiameters[i]);
}

So werden verschiene Ellipsen an verschiedenen Positionen mit unterschiedlichem Durchmesser gezeichnet.

Dieses Prinzip lässt sich auch noch auf weitere Eigenschaften (Farbe, Geschwindigkeit, etc.) ausweiten. Die Farbe kannst du im Übrigen in einen Datentyp zusammenfassen.

Beispiel:

color red = color(255, 0, 0);
ProOhneKnowHow 
Fragesteller
 17.02.2021, 14:56

hi,

vielen Dank!

hab mir noch ein Video zu Arrays angeschaut und mein Code schaut jz so aus:

int Kugeln=5;

int[] farbtonR=new int[Kugeln];

int[] farbtonG=new int[Kugeln]; 

int[] farbtonB=new int[Kugeln];

int[] durchmesser=new int[Kugeln];

int[] x=new int[Kugeln];

int[] geschwindigkeit=new int[Kugeln];

int[] xKugel=new int[Kugeln];

int background = 0;

int hoehe = 0;

void setup() {

 size(500, 500);

 background(background);

 neueKugel();

}

void draw() {

 komplett();

}

void neueKugel() {

 for (int i = 0; i < x.length; ++i) {

  farbtonR[i]=(int)random(255);

  farbtonG[i]=(int)random(255);

  farbtonB[i]=(int)random(255);

  x[i]=(int)random(501);

  durchmesser[i]=(int)random(20, 26);

  geschwindigkeit[i]=(int)random(20);

  xKugel[i]=x[i]-durchmesser[i]/2;

  fill(farbtonR[i], farbtonG[i], farbtonB[i]);

  ellipse(x[i], hoehe, durchmesser[i], durchmesser[i]);

 }

}

void gleicheKugel() {

 for (int i = 0; i < x.length; ++i) {

  fill(farbtonR[i], farbtonG[i], farbtonB[i]);

  ellipse(x[i], hoehe, durchmesser[i], durchmesser[i]);

 }

}

void komplett() {

 for (int i = 0; i < x.length; ++i) {

  fill(background);

  rect(xKugel[i], 0, durchmesser[i], 500);

  delay((int)geschwindigkeit[i]);

  hoehe++;

  gleicheKugel();

 }

}

mir persönlich fehlen jz aber noch zwei Sachen bei denen Ich wieder hänge.

  1. wie kann ich verhindern dass alle Kugeln gleichzeitig erscheinen oder was mache ich wenn alle unten sind und ich wieder neue erscheinen lassen will ? (läuft wahrscheinlich aufs gleiche raus)
  2. kann ich sowas wie Bedingungen für die zufallswerte einführen um zu verhindern dass sich die Kugeln überlappen?
0
regex9  17.02.2021, 15:19
@ProOhneKnowHow

1) Neben einer zufälligen Geschwindigkeit kannst du eine Zufallszahl im negativen Bereich für den y-Startwert einer jeden Kugel auswürfeln.

random(-10, 0);

Um neue Kugeln zu produzieren, kannst du zuerst einmal die alten Kugeln, die unten über den Bildschirmrand gelaufen sind, überschreiben bzw. an den Stellen einfach die Position neu setzen (vielleicht auch Farben, Geschwindigkeit, u.ä.). Dazu musst du nur je Zeichenvorgang prüfen, ob sie schon aus dem Sichtbereich sind oder nicht.

Um eine entsprechende Menge an Kugeln auf die Fläche zu bringen, könntest du ein zweidimensionales Array erzeugen.

int[][] y = new int[][] [
  [ /* row 1 values ... */ ],
  [ /* row 2 values ... */ ],
  /* etc. ... */
];

Der Zugriff auf ein bestimmtes Feld sieht so aus:

y[0][2]

In diesem Fall würdest du von der ersten Reihe das zweite Element erhalten.

2) Der Durchmesser deiner Kugeln beträgt maximal 26. Das heißt, dies muss auch der Mindestabstand für die x-/y-Koordinaten sein, die erzeugt werden.

0