< 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);
}
}
}