SandTest_01.java package sand; import java.util.ArrayList; import import import import processing.core.PApplet; processing.core.PGraphics; processing.core.PImage; processing.core.PVector; @SuppressWarnings("serial") public class SandTest_01 extends PApplet { public static void main(String args[]) { PApplet.main(new String[] { "--present", "SandTest_01" }); } // so wirds benutzt: ParticleSystem ps; public void setup() { size(screenWidth, screenHeight, P2D); background(0); smooth(); ps = new ParticleSystem(this); } public void draw() { background(0); ps.run(); } } /********************************************************************* * Ein flächiges Partikel-System, dass Sand darstellen soll * Zur Verwaltung der Partikel wird eine Arraylist verwendet * (Array ist auch mšglich) *********************************************************************/ class ParticleSystem { PApplet p; int width, height, num, step; ArrayList<Particle> particles; // eine arraylist fŸr alle partikel PVector origin; // hier wird ein partikel geboren // buffer bild fŸr die partikel // dient nur zu testzwecken -- wird durch sand-bitmaps ersetzt PGraphics pg; PImage buffer; int size; // KONSTRUKTOR -- flŠchendeckendes pratikelsys ParticleSystem(PApplet tp) { p = tp; width = p.width; height = p.height; num = width*height; step = 10; size = 10; particles = new ArrayList<Particle>(); // initiallisiert eine arraylist // // erzeugt eine grafik in einem backbuffer // und wandelt diese in ein Bild um, // dass dann an die Partikel Ÿbergeben wird pg = p.createGraphics(size, size, p.P2D); pg.beginDraw(); pg.noStroke(); pg.fill(200); pg.ellipse(size/2, size/2, size, size); pg.loadPixels(); buffer = pg.get(); pg.endDraw(); // partikel werden geboren for (int y = 5; y < height - 1; y += step) { for (int x = 5; x < width - 1; x += step) { origin = new PVector(x, y); System.out.println(origin); particles.add(new Particle(p, origin, buffer)); } Page 1 SandTest_01.java } } void run() { // lŠuft rŸckwŠrts durch die arraylist und lŠscht tote partikel // -- wird hier nicht benštigt, weil die partikel nicht sterben sollen for (int i = particles.size() - 1; i >= 0; i--) { Particle p = (Particle) particles.get(i); p.run(); if (p.dead()) { particles.remove(i); } } } void addParticle() { particles.add(new Particle(p,origin,buffer)); } void addParticle(Particle p) { particles.add(p); } // schaut obs Ÿberhaupt noch partikel gibt boolean dead() { if (particles.isEmpty()) { return true; } else { return false; } } } // A simple Particle class class Particle { PApplet p; PVector loc, vel, acc; float r, timer; float t = 1000.0f; float radius = 10.0f; PImage img; // der Konstruktor Particle(PApplet tp, PVector l, PImage timg) { p = tp; float float float float velX velY accX accY = = = = p.random(-1, 1); p.random(-2, 2); p.random(0, 0); p.random(0, 0); acc = new PVector(accX, accY, 0); vel = new PVector(velX, velY, 0); loc = l.get(); r = radius; timer = t; img = timg; p.imageMode(p.CENTER); } // // // // // // // // void run() { if(loc.x < p.mouseX+50 && loc.x > p.mouseX-15 && loc.y > p.mouseY-50 && loc.y < p.mouseY+15){ // updatet und rendert nur die partikel im mausradius update(); render(); }else{ render(); } if(loc.x < p.mouseX+50 && loc.x > p.mouseX-15 && loc.y > p.mouseY-50 && loc.y < p.mouseY+15){ // updatet und rendert nur die partikel im mausradius update(); } render(); } Page 2 SandTest_01.java // position updaten void update() { vel.add(acc); loc.add(vel); timer -= 1.0; } // so sieht ein partikel aus @SuppressWarnings("static-access") void render() { p.image(img, loc.x, loc.y); } // ist das partikelchen noch nŸtzlich? boolean dead() { if (timer <= 0.0) { return true; } else { return false; } } } Page 3