box2d android,Android之Box2D学习(一)——HelloWorld

2012-09-10

从今天开始学习Box2D,在java中是JBox2D(Download),包的导入就不用说了吧!

文章后面给出了我写的helloworld,仅供参考

笔记:Ⅰ)Box2D由世界,物体等组成,Box2D能自动计算物体的位置,然后我们还需要在Android中绘制出来;

Ⅱ)Box2D世界中的单位都是标准单位,秒、米、千克 etc. 需要按照比例缩放,不然速度很慢(代码中有转换);

Ⅲ)Box2D每帧的位移是2m/frame,不能超过这个速度,所以要进行缩放,即可放大速度;

Ⅳ)注意坐标系的零点是在左上角,同时角度是以弧度制的;

0818b9ca8b590ca3270a3433284dd417.png                

0818b9ca8b590ca3270a3433284dd417.png

坐标系                                  效果图

代码:

public class Hello_Box2d extends Activity {

private World mWorld;

private Handler mHandler;

private View mView;

private int screenH, screenW;

private final float WORLD2PHONE_RATE = 5;

private Runnable mRunnable = new Runnable() {

@Override

public void run() {

mWorld.step(0.1f, 3, 3);//

mView.invalidate();

mHandler.postDelayed(this, 100);

}

};

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.requestWindowFeature(Window.FEATURE_NO_TITLE); //remove title

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);// full screen

//get the window width and height

DisplayMetrics metric = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(metric);

screenH = metric.heightPixels;

screenW = metric.widthPixels;

//create view

mView = new helloBox2dView(this);

mView.setBackgroundColor(Color.WHITE);

setContentView(mView);

}

@Override

protected void onDestroy() {

super.onDestroy();

mHandler.removeCallbacks(mRunnable);

}

class helloBox2dView extends View {

private Canvas mCanvas;

private Body mBody;

public helloBox2dView(Context context) {

super(context);

/** Creating a World */

{

Vec2 gravity = new Vec2(0f, 9.8f);// vector, the gravity direction, left and right, up and down

mWorld = new World(gravity, false);

}

/** Creating a Ground Box */

{

// Bodies are built using the following steps:

// Step 1. Define a body with position, damping, etc.

BodyDef groundBodyDef = new BodyDef();

groundBodyDef.position.set(0f, (screenH-screenW*3/4)/WORLD2PHONE_RATE);

groundBodyDef.angle = (float) Math.asin(0.6);

// Step 2. Use the world object to create the body.

Body groundBody = mWorld.createBody(groundBodyDef);

// Step 3. Define fixtures with a shape, friction, density, etc.

PolygonShape groundBox = new PolygonShape();

groundBox.setAsBox(screenW*5/4/WORLD2PHONE_RATE, 1f/WORLD2PHONE_RATE);

// Step 4. Create fixtures on the body.

groundBody.createFixture(groundBox, 0.0f);

//border

BodyDef groundBodyDef2 = new BodyDef();

groundBodyDef2.position.set(screenW/WORLD2PHONE_RATE, 0f);

groundBodyDef2.angle = (float) (0.5f*Math.PI);

Body groundBody2 = mWorld.createBody(groundBodyDef2);

PolygonShape groundBox2 = new PolygonShape();

groundBox2.setAsBox(screenH/WORLD2PHONE_RATE, 1f/WORLD2PHONE_RATE);

groundBody2.createFixture(groundBox2, 0.0f);

}

/** Creating a Dynamic Body */

{

BodyDef bodyDef = new BodyDef();

bodyDef.type = BodyType.DYNAMIC;

bodyDef.position.set(100f/WORLD2PHONE_RATE, 0f);

mBody = mWorld.createBody(bodyDef);

CircleShape dynamicBox = new CircleShape();

dynamicBox.m_radius = 10/WORLD2PHONE_RATE;

FixtureDef fixtureDef = new FixtureDef();

fixtureDef.shape = dynamicBox;

fixtureDef.density = 500f;

fixtureDef.friction = 0.5f;

fixtureDef.restitution = 0.8f;

mBody.createFixture(fixtureDef);

}

mHandler = new Handler();

mHandler.post(mRunnable);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

mCanvas = canvas;

//draw ground

drawGround();

//draw box

Vec2 position = mBody.getPosition();

float angle = mBody.getAngle();

drawBox(position.x*WORLD2PHONE_RATE, position.y*WORLD2PHONE_RATE, angle);

}

public void drawBox(float x, float y, float angle){

Paint paint = new Paint();

paint.setAntiAlias(true);

paint.setColor(Color.RED);

mCanvas.drawCircle(x, y, 10, paint);

mCanvas.drawLine(x, y, (float)(x+10*Math.cos(angle)), (float)(y+10*Math.sin(angle)), new Paint());

}

public void drawGround(){

Paint paint = new Paint();

paint.setColor(Color.BLUE);

paint.setStrokeWidth(10);

mCanvas.drawLine(0, screenH-screenW*3/4, screenW, screenH, paint);

mCanvas.drawLine(screenW, 0, screenW, screenH, paint);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值