/** * graviball Runge-Kutta */ int mX=64,mY=64; // Startposition Maus float planetX=mX, planetY=mY; // Startposition Ball float plavecX=0, plavecY=0; // Bewegungsvektor des Balls float eulerX,eulerY; float x,y; // Abstand zw Ball & Maus float rQuadrat; float F; // kraft float sek,pausenzeiten=0,anfangszeit; float pausenbeginn,pausenende; int konstanze = 32; // Gravitationskonstante*Masse1*Masse2 (willkürlich gewählt) boolean run = false, start = true, ende = false, boing = false, pausebeginnt = false; // PImage bg; PFont font; int punkte = 10; void setup() { size(512,128); // bg = loadImage("gelb.jpg"); frameRate(20); noLoop(); smooth(); fill(70,138,2,200); stroke(45,90,1); strokeWeight(1.75); font = loadFont("SansSerif.bold-14.vlw"); textFont(font); } void draw() { if (boing) { background(250,250,40); punkte--; boing = false; } else { background(225,225,30);//(bg);// rect(480,114-10*punkte,16,10*punkte); fill(255,255,255); // weisse Schrift if (punkte>9) { text(punkte,480,110); } else { text(punkte,484,110); if (punkte<1) { ende= true; // stoppen noLoop(); } } fill(70,138,2,200); // durchsichtig gruene Fuellung } sek = round((millis()-anfangszeit-(pausenzeiten*2))/10)/100.00 ; text( sek+" s", 443,24); if (start) { text( "Neuerung:", 127,48); text( "Pausenzeiten (durch klicken) werden von der", 127,63); text( "bisher erreichten Zeit abgezogen.", 127,78); } if (ende) { text( "Durch klicken wird ein neues Spiel begonnen.", 127,63); } x = mX-(planetX); y = mY-(planetY); rQuadrat =sq(x)+sq(y); // um Division durch 0 und extrem unnatürliche Bewegungen zu vermeiden if (rQuadrat>8) { F = konstanze/rQuadrat; }else{ F=0; } eulerX = planetX + (plavecX/2) + (x*F/2); eulerY = planetY + (plavecY/2) + (y*F/2); x = mX-eulerX; y = mY-eulerY; rQuadrat =sq(x)+sq(y); // um Division durch 0 und extrem unnatürliche Bewegungen zu vermeiden if (rQuadrat>2) { F = konstanze/rQuadrat; }else{ F=0; } // Bewegungsvektor verändern plavecX += x*F; plavecY += y*F; // vom Rand abprallen if (planetX<10 && plavecX<0) { plavecX=abs(plavecX)*0.75; boing=true; } if (planetX>width-10 && plavecX>0) { plavecX=abs(plavecX)*-0.75; boing=true; } if (planetY<10 && plavecY<0) { plavecY=abs(plavecY)*0.75; boing=true; } if (planetY>height-10 && plavecY>0) { plavecY=abs(plavecY)*-0.75; boing=true; } // neue Position planetX += plavecX; planetY += plavecY; // Ball mit Schwanz malen line(planetX,planetY,planetX-plavecX,planetY-plavecY); ellipse(Math.round(planetX),Math.round(planetY),18,18); // Mausfadenkreuz line(mX-3,mY,mX+3,mY); line(mX,mY-3,mX,mY+3); } // Mausposition aktualisieren void mouseMoved() { mX = mouseX; mY = mouseY; if (start) { // Startschuss loop(); run = true; start = false; anfangszeit = millis(); pausenzeiten = 0; } } // Pause void mouseReleased() { if (!ende) { if (!run) { if (pausebeginnt) { pausebeginnt = false; } else { loop(); run = true; pausenende = millis(); pausenzeiten += (pausenende-pausenbeginn); mX = mouseX; mY = mouseY; } } } else { anfangszeit = millis(); pausenzeiten = 0; mX=64; mY=64; // Startposition Maus planetX=mX; planetY=mY; // Startposition Ball plavecX=0; plavecY=0; // Bewegungsvektor des Balls run = false; start = true; boing = false; punkte=10; redraw(); ende = false; } } void mousePressed() { if (!ende) { if (run) { noLoop(); run = false; pausenbeginn = millis(); pausebeginnt = true; } } }