====== Projekt: Particle Engine ====== ===== Die Klasse Particle ===== import sge.*; import java.awt.Color; public class Particle { protected Kreis k; double vx, vy; int alter = 0; double ay; double lebensdauer; int radius; public Particle(double x, double y, double v0x, double v0y){ vx = v0x; vy = v0y; } public boolean zeitschritt(double deltaT){ alter = alter + (int)deltaT; if(alter <= lebensdauer){ k.setFuellfarbeAlpha(255 - (int)(255.0/lebensdauer * alter)); } k.verschieben(deltaT*vx, deltaT*vy); vy = vy + deltaT * ay; return k.istAußerhalbDesFensters() || alter > lebensdauer; } public void vernichten(){ k.vernichten(); } public double getX(){ return k.getMitteX(); } public double getY(){ return k.getMitteY(); } } ===== Die Klasse Konfetti ===== import sge.*; import java.awt.Color; public class Konfetti extends Particle { public Konfetti(double x, double y, double v0x, double v0y){ super(x, y, v0x, v0y); ay = 0.0005; lebensdauer = 1000; radius = 10; k = new Kreis(x, y, radius); int rot = (int)(Math.random()*256); int grün = (int)(Math.random()*256); int blau = (int)(Math.random()*256); k.setFuellfarbe(new Color(rot, grün, blau)); } } ===== Die Klasse Fetzen ===== import sge.*; import java.awt.Color; public class Fetzen extends Particle { public Fetzen(double x, double y, double v0x, double v0y){ super(x, y, v0x, v0y); ay = 0.0; lebensdauer = 500; radius = 2; k = new Kreis(x, y, radius); int rot = 255; int grün = 255; int blau = 0; k.setFuellfarbe(new Color(rot, grün, blau)); } } ===== Die Klasse ParticleEngine ===== import sge.*; public class ParticleEngine implements TimerListener, TastaturListener { Particle[] particles = new Particle[1000]; int x = 300; int y = 300; public ParticleEngine(){ Fenster f = new Fenster(); f.addTastaturListener(this); Timer t = new Timer(this, 20); // 20 ms entspricht 50 FPS t.start(); } public void tasteGedrueckt(char key, int keyCode, boolean erstmals){ if(key == 'a'){ x--; //Kurzschreibweise für x = x - 1; } } public void timerSignalVerarbeiten(){ // Zeitschritt für alle Partikel aufrufen und // Partikel außerhalb des Fensters vernichten int i = 0; while (i < particles.length){ Particle p = particles[i]; if(p != null){ boolean außerhalb = p.zeitschritt(20); if(außerhalb){ particles[i] = null; if(p instanceof Konfetti){ int j = 0; while(j < 10){ erzeugeFetzen(p.getX(), p.getY()); j++; } } p.vernichten(); } } i++; } if(Math.random() < 0.25){ // Neue Partikel erzeugen i = 0; while(i < particles.length){ if(particles[i] == null){ double vx = Math.random() * 0.2 - 0.1; double vy = Math.random() * -0.3 - 0.3; particles[i] = new Konfetti(x, y, vx, vy); break; // raus aus der while-Wiederholung } i++; // i = i + 1; } } } private void erzeugeFetzen(double x, double y){ // nächste freie Position im Array particles finden: int i = 0; while(i < particles.length){ if(particles[i] == null){ double vx = Math.random() * 2 - 1; double vy = Math.random() * 2 - 1; Particle p = new Fetzen(x, y, vx, vy); particles[i] = p; return; } i++; } } }