Inhaltsverzeichnis

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