Box2D for processing Create circle
程序员文章站
2022-04-27 13:57:44
...
import shiffman.box2d.*;
import org.jbox2d.collision.shapes.*;
import org.jbox2d.common.*;
import org.jbox2d.dynamics.*;
ArrayList<Circle> circles;
Box2DProcessing box2d;
void setup(){
size(400,400);
smooth(4);
box2d = new Box2DProcessing(this); // 创建一个 box2d对象
box2d.createWorld(); // 创建一个box2d的世界
circles = new ArrayList<Circle>(); // ArrayList
}
void draw(){
background(255);
box2d.step(); // 开启引擎
if(mousePressed){
Circle p = new Circle(mouseX,mouseY);
circles.add(p);
}
for(Circle b : circles){
b.Display();
}
}
class Circle {
Body body;
float radius;
public Circle(float x, float y) {
radius = 10f;
//1. Build a body
BodyDef bd = new BodyDef(); // 声明一些身体的定义
bd.type = BodyType.DYNAMIC; // 动态的类型
bd.position.set(box2d.coordPixelsToWorld(x, y)); // 转换坐标到世界坐标下
body = box2d.createBody(bd); // 创建一个 body
// 2. Define a polygon sharp
CircleShape sd = new CircleShape();
float box2dR = box2d.scalarPixelsToWorld(radius/2); // 转换坐标系
sd.setRadius(box2dR); // 设置它的半径
//3. Define a fixture 固定装置
FixtureDef fd = new FixtureDef();
fd.shape = sd;
fd.density = 1; //密度
fd.friction = 0.3; //摩擦
fd.restitution = 0.5; //应该是还原系数
//4. 将 fixture 和 body 联系起来
body.createFixture(fd);
}
public void Display() {
// Vec2相当于 Processing的 PVector coord:坐标的意思
Vec2 pos = box2d.getBodyPixelCoord(body);
float a = body.getAngle();
pushMatrix(); // 将当前变换矩阵推入矩阵堆栈。
translate(pos.x, pos.y);
rotate(-a);
fill(175);
stroke(0);
ellipseMode(CENTER);
ellipse(0, 0, radius, radius);
popMatrix();
}
}