< GMU:Immersive Strategien | Inhalte | Bälle
Der Denkfehler ist behoben. Jetzt ist es fast perfekt. Naja, wenn der Ball gegen die Laufrichtung abprallt, läuft er auf seiner Kreisbahn Richtung Decke weiter. Die physikalischen Gesetze sind aufgehoben...
Code B
Ball[] ball = new Ball[15]; int a,b,c; //Abstände der Ebenen
void setup() {
size(1280,1024); //size(1920,1200); smooth(); noStroke(); colorMode(HSB,360,100,100,100); a = 500; //700 Größe der ersten Ebene b = 400; //600 Größe der zweiten Ebene c = 40; //60 Lücke for (int i=0; i < 5; i++) { ball[i] = new Ball(); //in erster Ebene ball[i].x = random(ball[i].g1,a-ball[i].g1); ball[i].y = random(ball[i].g2,height-ball[i].g2); //Farbe ball[i].h = (int)random(120); } for (int i=5; i < 10; i++) { ball[i] = new Ball(); //in zweiter Ebene ball[i].x = random(a+c+ball[i].g1,a+c+b-ball[i].g1); ball[i].y = random(ball[i].g2,height-ball[i].g2); //Farbe ball[i].h = (int)random(120,240); } for (int i=10; i < ball.length; i++) { ball[i] = new Ball(); //in dritter Ebene ball[i].x = random(a+c+b+c+ball[i].g1,width-ball[i].g1); ball[i].y = random(ball[i].g2,height-ball[i].g2); //Farbe ball[i].h = (int)random(240,360); }
}
void draw() {
background(0); fill(255); rect(a,0,c,height); rect(a+c+b,0,c,height); for (int i=0; i < 15; i++) { ball[i].position[0] = ball[i].x-ball[i].g1/2; ball[i].position[1] = ball[i].x+ball[i].g1/2; ball[i].position[2] = ball[i].y-ball[i].g2/2; ball[i].position[3] = ball[i].y+ball[i].g2/2; } for (int i=0; i < 5; i++) { //Bewegen if (ball[i].angle <= 360) { ball[i].angle -= 2; } if (ball[i].angle <= 0) { ball[i].angle = 360; } //im Bogen ball[i].vx = cos(radians(ball[i].angle))*ball[i].g1/6; ball[i].vy = sin(radians(ball[i].angle))*ball[i].g2/6; ball[i].x = ball[i].x + ball[i].vx; ball[i].y = ball[i].y + ball[i].vy; //Ballgröße zurücksetzen if (ball[i].g1 != 80) { ball[i].g1 = 80; } //Rand oben if (ball[i].x <= 0+ball[i].g1/2) { ball[i].angle = 0; } //Rand unten if (ball[i].x >= a-ball[i].g1/2) { ball[i].angle = 180; ball[i].g1 = ball[i].g1-20; } //links raus if (ball[i].y <= 0-ball[i].g2) { ball[i].y = height+ball[i].g2/2; } //rechts raus if (ball[i].y >= height+ball[i].g2) { ball[i].y = 0-ball[i].g2/2; } //Bälle stoßen aneinander for (int j=i+1; j < 5; j++) { if ((ball[i].position[1] >= ball[j].position[0]) && (ball[i].position[3] >= ball[j].position[2]) && (ball[i].position[1] <= ball[j].position[1]) && (ball[i].position[3] <= ball[j].position[3])) { ball[i].angle = 225; } if ((ball[i].position[0] <= ball[j].position[1]) && (ball[i].position[3] >= ball[j].position[2]) && (ball[i].position[0] >= ball[j].position[0]) && (ball[i].position[3] <= ball[j].position[3])) { ball[i].angle = 315; } if ((ball[i].position[1] >= ball[j].position[0]) && (ball[i].position[2] <= ball[j].position[3]) && (ball[i].position[1] <= ball[j].position[1]) && (ball[i].position[2] >= ball[j].position[2])) { ball[i].angle = 135; } if ((ball[i].position[0] <= ball[j].position[1]) && (ball[i].position[2] <= ball[j].position[3]) && (ball[i].position[0] >= ball[j].position[0]) && (ball[i].position[2] >= ball[j].position[2])) { ball[i].angle = 45; } } ball[i].maleBall(); } for (int i=5; i < 10; i++) { //Bewegen if (ball[i].angle <= 360) { ball[i].angle -= 3; } if (ball[i].angle <= 0) { ball[i].angle = 360; } //im Bogen ball[i].vx = cos(radians(ball[i].angle))*ball[i].g1/6; ball[i].vy = sin(radians(ball[i].angle))*ball[i].g2/6; ball[i].x = ball[i].x + ball[i].vx; ball[i].y = ball[i].y + ball[i].vy; //Ballgröße zurücksetzen if (ball[i].g1 != 80) { ball[i].g1 = 80; } //Rand oben if (ball[i].x <= a+c+ball[i].g1/2) { ball[i].angle = 0; } //Rand unten if (ball[i].x >= a+c+b-ball[i].g1/2) { ball[i].angle = 180; ball[i].g1 = ball[i].g1-20; } //links raus if (ball[i].y <= 0-ball[i].g2) { ball[i].y = height+ball[i].g2/2; } //rechts raus if (ball[i].y >= height+ball[i].g2) { ball[i].y = 0-ball[i].g2/2; } //Bälle stoßen aneinander for (int j=i+1; j < 10; j++) { if ((ball[i].position[1] >= ball[j].position[0]) && (ball[i].position[3] >= ball[j].position[2]) && (ball[i].position[1] <= ball[j].position[1]) && (ball[i].position[3] <= ball[j].position[3])) { ball[i].angle = 225; } if ((ball[i].position[0] <= ball[j].position[1]) && (ball[i].position[3] >= ball[j].position[2]) && (ball[i].position[0] >= ball[j].position[0]) && (ball[i].position[3] <= ball[j].position[3])) { ball[i].angle = 315; } if ((ball[i].position[1] >= ball[j].position[0]) && (ball[i].position[2] <= ball[j].position[3]) && (ball[i].position[1] <= ball[j].position[1]) && (ball[i].position[2] >= ball[j].position[2])) { ball[i].angle = 135; } if ((ball[i].position[0] <= ball[j].position[1]) && (ball[i].position[2] <= ball[j].position[3]) && (ball[i].position[0] >= ball[j].position[0]) && (ball[i].position[2] >= ball[j].position[2])) { ball[i].angle = 45; } } ball[i].maleBall(); } for (int i=10; i < 15; i++) { //Bewegen if (ball[i].angle <= 360) { ball[i].angle -= 4; } if (ball[i].angle <= 0) { ball[i].angle = 360; } //im Bogen ball[i].vx = cos(radians(ball[i].angle))*ball[i].g1/6; ball[i].vy = sin(radians(ball[i].angle))*ball[i].g2/6; ball[i].x = ball[i].x + ball[i].vx; ball[i].y = ball[i].y + ball[i].vy; //Ballgröße zurücksetzen if (ball[i].g1 != 80) { ball[i].g1 = 80; } //Rand oben if (ball[i].x <= a+c+b+c+ball[i].g1/2) { ball[i].angle = 0; } //Rand unten if (ball[i].x >= width-ball[i].g1/2) { ball[i].angle = 180; ball[i].g1 = ball[i].g1-20; } //links raus if (ball[i].y <= 0-ball[i].g2) { ball[i].y = height+ball[i].g2/2; } //rechts raus if (ball[i].y >= height+ball[i].g2) { ball[i].y = 0-ball[i].g2/2; } //Bälle stoßen aneinander for (int j=i+1; j < 15; j++) { if ((ball[i].position[1] >= ball[j].position[0]) && (ball[i].position[3] >= ball[j].position[2]) && (ball[i].position[1] <= ball[j].position[1]) && (ball[i].position[3] <= ball[j].position[3])) { ball[i].angle = 225; } if ((ball[i].position[0] <= ball[j].position[1]) && (ball[i].position[3] >= ball[j].position[2]) && (ball[i].position[0] >= ball[j].position[0]) && (ball[i].position[3] <= ball[j].position[3])) { ball[i].angle = 315; } if ((ball[i].position[1] >= ball[j].position[0]) && (ball[i].position[2] <= ball[j].position[3]) && (ball[i].position[1] <= ball[j].position[1]) && (ball[i].position[2] >= ball[j].position[2])) { ball[i].angle = 135; } if ((ball[i].position[0] <= ball[j].position[1]) && (ball[i].position[2] <= ball[j].position[3]) && (ball[i].position[0] >= ball[j].position[0]) && (ball[i].position[2] >= ball[j].position[2])) { ball[i].angle = 45; } } ball[i].maleBall(); }
}
Objekt Ball
class Ball {
int g1,g2; //Größe float x,y; //Position int h,s,b,a; //Farbe float vx,vy; //Geschwindigkeit float angle; //Gradzahl float[] position = new float[4]; // die 4 Ecken des Balls; Ball() { g1 = 80; g2 = g1; s = 100; b = 100-g1; a = 100; angle = 90; } void maleBall() { for (int i=0; i<g1; i+=5) { //Abrundungen bzw. Schatten fill(h,s,b+i,a); ellipse(x,y,g1-i,g2-i); } }
}