欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Box2D for processing Create circle

程序员文章站 2022-04-27 13:57:44
...

Box2D for processing Create circle

 

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();
  }
}

 

相关标签: Processing