SandpartikelSystem

Werbung
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
Herunterladen