JBox2D For Android - 用canvas绘制shape

本文介绍了如何在Android中利用JBox2D库通过canvas来绘制形状。作者通过参考JBox2D的Java示例和官方手册进行学习,并提供了一个演示示例的下载链接。

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示例里已经有源代码可循,大部分情况下问题不大。我也是通过那些源码对照官方的手册学习的。



附带一个演示示例:

下载地址:http://download.youkuaiyun.com/detail/newliuli/4493775

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值