protected void onDraw(Canvas canvas) {//view 里的绘制入口
/** 遍历box2d world中的body,并绘制其形状 */
for (Body b = world.getBodyList(); b != null; b = b.getNext()) {
xf.set(b.getTransform());
for (Fixture f = b.getFixtureList(); f != null; f = f.getNext()) {
if (b.isActive() == false) {
color.set(0.5f, 0.5f, 0.3f);
drawShape(canvas, f, xf, color);
} else if (b.getType() == BodyType.STATIC) {
color.set(0.5f, 0.9f, 0.3f);
drawShape(canvas, f, xf, color);
} else if (b.getType() == BodyType.KINEMATIC) {
color.set(0.5f, 0.5f, 0.9f);
drawShape(canvas, f, xf, color);
} else if (b.isAwake() == false) {
color.set(0.5f, 0.5f, 0.5f);
drawShape(canvas, f, xf, color);
} else {
color.set(0.9f, 0.7f, 0.7f);
drawShape(canvas, f, xf, color);
}
}
}
}
/****************************************/
/***** drawBox2dWorld ****/
/****************************************/
private final Transform xf = new Transform();
private final Color3f color = new Color3f();
private final Vec2 center = new Vec2();
private final Vec2 axis = new Vec2();
private final Vec2Array tlvertices = new Vec2Array();
public static final float PTM_RATIO = 16.0f;//像素点与实际尺寸的对应比例 16像素对应1m,根据需要调整
Paint mPaint = new Paint();
public int screen_w = 480;
public int screen_h = 854;
/** world (0,0)点的偏移量,坐标使用屏幕像素 */
float offset_x = 240, offset_y = 427;
//判断shape类型
private void drawShape(Canvas canvas, Fixture fixture, Transform xf,
Color3f color) {
switch (fixture.getType()) {
case CIRCLE: {
CircleShape circle = (CircleShape) fixture.getShape();
Transform.mulToOut(xf, circle.m_p, center);
float radius = circle.m_radius;
axis.set(xf.R.col1);
mPaint.reset();
setColor3f(mPaint,color);
mPaint.setStyle(Style.FILL);
canvas.drawCircle(XcoordinateFormBox2d(center.x),
YcoordinateFormBox2d(center.y), radius * PTM_RATIO, mPaint);
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(XcoordinateFormBox2d(center.x),
YcoordinateFormBox2d(center.y), radius * PTM_RATIO, mPaint);
}
break;
case POLYGON: {
PolygonShape poly = (PolygonShape) fixture.getShape();
int vertexCount = poly.m_vertexCount;
Vec2[] vertices = tlvertices.get(vertexCount);
for (int i = 0; i < vertexCount; ++i) {
Transform.mulToOut(xf, poly.m_vertices[i], vertices[i]);
}
drawSolidPolygon(canvas, vertices, vertexCount, color);
}
break;
}// switch
}
//多边形实体绘制
public void drawSolidPolygon(Canvas canvas, Vec2[] vertices,
int vertexCount, Color3f color) {
mPaint.reset();
setColor3f(mPaint,color);
if (vertexCount > 2) {
Path path = new Path();
path.moveTo(XcoordinateFormBox2d(vertices[0].x),
YcoordinateFormBox2d(vertices[0].y));
for (int i = 1; i < vertexCount; i++) {
path.lineTo(XcoordinateFormBox2d(vertices[i].x),
YcoordinateFormBox2d(vertices[i].y));
}
path.close();
//填充
mPaint.setStyle(Paint.Style.FILL);
canvas.drawPath(path, mPaint);
//绘制边线
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawPath(path, mPaint);
} else if(vertexCount == 2){
setColor3f(mPaint,color);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawLine(XcoordinateFormBox2d(vertices[0].x), YcoordinateFormBox2d(vertices[0].y),
XcoordinateFormBox2d(vertices[1].x), YcoordinateFormBox2d(vertices[1].y), mPaint);
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawLine(XcoordinateFormBox2d(vertices[0].x), YcoordinateFormBox2d(vertices[0].y),
XcoordinateFormBox2d(vertices[1].x), YcoordinateFormBox2d(vertices[1].y), mPaint);
} else if(vertexCount == 1){
setColor3f(mPaint,color);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawPoint(XcoordinateFormBox2d(vertices[0].x), YcoordinateFormBox2d(vertices[0].y), mPaint);
}
}
public float XcoordinateFormBox2d(float x) {
return offset_x + x * PTM_RATIO;
}
//由于box2d的画布坐标跟canvas使用的坐标轴并不一致,需要换算
public float YcoordinateFormBox2d(float y) {
return screen_h - offset_y - y * PTM_RATIO;
}
}
/**静态变量和方法**********************************************************************/
final static int full_algha = 0xff;
static void setColor3f(Paint _Paint,Color3f color) {
int R = floatColorToInt(color.x);
int G = floatColorToInt(color.y);
int B = floatColorToInt(color.z);
_Paint.setARGB(full_algha, R, G, B);
}
static int floatColorToInt(float c) {
return Math.round(c * full_algha);
}
虽然早就写好了一些示例,但是苦于没有时间添加说明,先挑些简单的代码拿上来分享,希望对大家有帮助吧。
其实这些基本的东西在jbox2d 的java示例里已经有源代码可循,大部分情况下问题不大。我也是通过那些源码对照官方的手册学习的。
附带一个演示示例: