10. November 2010
Bei dieser Vorlage mussten wir das Setzen der Linie mit zwei Mausklicks einführen und der Ball sollte nicht nur in eine Richtung laufen, sondern vor und zurück. Zusätzlich sollte die Animation noch unabhängig von der Framerate ablaufen, die Zeitdauer für die Bewegung des Balls entlang der Linie also immer gleich sein. Hier habe ich die Animation abhängig von der Abspieldauer des Programms in Millisekunden gemacht. Um den Ball wieder zurücklaufen zu lassen habe ich die Position nicht vom Anfangspunkt her errechnet sondern vom Endpunkt her. Die Variabel curTimeSwitch wird als Toggle benutzt, welche beim Vollenden der Strecke jeweils mit -1 multipliziert wird.pos = PVector.sub( endPos , PVector.mult(dir,normTime));Damit die Animation erst nach zwei Klicks startet, also wenn beim ersten der Anfangspunkt und beim zweiten Klick der Endpunkt gesetzt wurde, habe ich zwei Flags (Booleans) dafür benutzt. Die Animation startet erst, wenn beide Flags auf true stehen.
PVector startPos = new PVector(); PVector endPos = new PVector(); PVector dir = new PVector(); PVector pos = new PVector(); int curTime = 0; int animTime = 2000; // new milliseconds int curTimeSwitch = 1; // allow reversed animation boolean startPosSet=false; boolean endPosSet=false; int startMs = 0; // milliseconds since animation started void setup() { size(640, 480); smooth(); frameRate(48); // animation } void draw() { background(51); // milliseconds since programm start int curMs = millis(); // current milliseconds // toggle animation, if animation time elapsed -> reverse animation if (curTime > animTime) { curTimeSwitch*= -1; // reverse animation startMs = curMs; } // calc. the animation time curTime = (curMs - startMs); // time that has passed // procentual progress float normTime = curTime * 1.0 / animTime; if(startPosSet==true && endPosSet==true) { stroke(255); line(startPos.x,startPos.y, endPos.x,endPos.y); PVector dir = PVector.sub(endPos,startPos); //animDistance = dir.mag(); // distance line between start and end point if (curTimeSwitch>0) { pos = PVector.add( startPos , PVector.mult(dir,normTime)); } else { pos = PVector.sub( endPos , PVector.mult(dir,normTime)); } ellipse(pos.x,pos.y, 20,20); } } // function mouse has been pressed void mousePressed() { curTime = 0; if (startPosSet==false || (startPosSet==true && endPosSet==true)) { // set start position startPos.set(mouseX,mouseY,0); endPos = startPos.get(); startPosSet=true; endPosSet=false; } else if (endPosSet==false) { // set end position endPos.set(mouseX,mouseY,0); endPosSet=true; startMs = millis(); } }