// The Nature of Code // // Spring 2012 // PBox2D example // A rectangular box class Box { // We need to keep track of a Body and a width and height Body body; float w; float h; // Constructor Box(float x_, float y_) { float x = x_; float y = y_; w = 24; h = 24; // Add the box to the box2d world makeBody(new Vec2(x, y), w, h); body.setUserData(this); } // This function removes the particle from the box2d world void killBody() { box2d.destroyBody(body); } boolean contains(float x, float y) { Vec2 worldPoint = box2d.coordPixelsToWorld(x, y); Fixture f = body.getFixtureList(); boolean inside = f.testPoint(worldPoint); return inside; } // Drawing the box 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(); rectMode(PConstants.CENTER); pushMatrix(); translate(pos.x, pos.y); rotate(-a); fill(175); stroke(0); rect(0, 0, w, h); popMatrix(); } // This function adds the rectangle to the box2d world void makeBody(Vec2 center, float w_, float h_) { // Define and create the body BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(box2d.coordPixelsToWorld(center)); body = box2d.createBody(bd); // Define a polygon (this is what we use for a rectangle) PolygonShape sd = new PolygonShape(); float box2dW = box2d.scalarPixelsToWorld(w_/2); float box2dH = box2d.scalarPixelsToWorld(h_/2); sd.setAsBox(box2dW, box2dH); // Define a fixture FixtureDef fd = new FixtureDef(); fd.shape = sd; // Parameters that affect physics fd.density = 1; fd.friction = 0.3; fd.restitution = 0.5; body.createFixture(fd); //body.setMassFromShapes(); // Give it some initial random velocity body.setLinearVelocity(new Vec2(random(-5, 5), random(2, 5))); body.setAngularVelocity(random(-5, 5)); } }