Files

93 lines
2.0 KiB
Plaintext

// The Nature of Code
// <http://www.shiffman.net/teaching/nature>
// Spring 2010
// PBox2D example
// A circular particle
class Particle {
// We need to keep track of a Body and a radius
Body body;
float r;
color col;
Particle(float x, float y, float r_) {
r = r_;
// This function puts the particle in the Box2d world
makeBody(x, y, r);
body.setUserData(this);
col = color(175);
}
// This function removes the particle from the box2d world
void killBody() {
box2d.destroyBody(body);
}
// Change color when hit
void change() {
col = color(255, 0, 0);
}
// Is the particle ready for deletion?
boolean done() {
// Let's find the screen position of the particle
Vec2 pos = box2d.getBodyPixelCoord(body);
// Is it off the bottom of the screen?
if (pos.y > height+r*2) {
killBody();
return true;
}
return false;
}
//
void display() {
// We look at each body and get its screen position
Vec2 pos = box2d.getBodyPixelCoord(body);
// Get its angle of rotation
float a = body.getAngle();
pushMatrix();
translate(pos.x, pos.y);
rotate(a);
fill(col);
stroke(0);
strokeWeight(1);
ellipse(0, 0, r*2, r*2);
// Let's add a line so we can see the rotation
line(0, 0, r, 0);
popMatrix();
}
// Here's our function that adds the particle to the Box2D world
void makeBody(float x, float y, float r) {
// Define a body
BodyDef bd = new BodyDef();
// Set its position
bd.position = box2d.coordPixelsToWorld(x, y);
bd.type = BodyType.DYNAMIC;
body = box2d.createBody(bd);
// Make the body's shape a circle
CircleShape cs = new CircleShape();
cs.m_radius = box2d.scalarPixelsToWorld(r);
FixtureDef fd = new FixtureDef();
fd.shape = cs;
// Parameters that affect physics
fd.density = 1;
fd.friction = 0.01;
fd.restitution = 0.3;
// Attach fixture to body
body.createFixture(fd);
body.setAngularVelocity(random(-10, 10));
}
}