转载http://rayleung.iteye.com/blog/439056

Box2d是一个很出名的2d物理引擎,大家可以google之。Box2d有C++,flash和Java等版本。android可以直接使用java版本的Jbox2d,但因为Jbox2d的图形渲染是使用processing库来实现的,所以,在android中使用Jbox2d的时候,图形渲染的工作就只能自己来写了。因为网上关于box2d的资料真的非常的少,特别是关于图形绘制方面,所以,虽然程序写得不是很好,还是贴上来了,先看截图:

程序很简单:蓝色的是地面,从上面掉下两个绿球和一个红色的方块,它们之间的碰撞都由box2d引擎自己来完成。

(这程序运行起来有点卡,我 也正在解决这个问题,有朋友知道答案的也请分享一下啦!)

代码如下:

Java代码
  1. packagecom.ray.test;
  2. importorg.jbox2d.collision.AABB;
  3. importorg.jbox2d.collision.CircleDef;
  4. importorg.jbox2d.collision.PolygonDef;
  5. importorg.jbox2d.common.Vec2;
  6. importorg.jbox2d.dynamics.Body;
  7. importorg.jbox2d.dynamics.BodyDef;
  8. importorg.jbox2d.dynamics.World;
  9. importandroid.app.Activity;
  10. importandroid.content.Context;
  11. importandroid.graphics.Canvas;
  12. importandroid.graphics.Color;
  13. importandroid.graphics.Paint;
  14. importandroid.os.Bundle;
  15. importandroid.os.Handler;
  16. importandroid.view.View;
  17. importandroid.view.Window;
  18. importandroid.view.WindowManager;
  19. publicclassMyBox2dextendsActivity{
  20. privatefinalstaticintRATE=10;//屏幕到现实世界的比例10px:1m;
  21. privateAABBworldAABB;//创建一个管理碰撞的世界
  22. privateWorldworld;
  23. privatefloattimeStep=1/60;//模拟的的频率
  24. privateintiterations=10;//迭代越大,模拟约精确,但性能越低
  25. privateBodybody,body2,body3;
  26. privateMyViewmyView;
  27. privateHandlermHandler;
  28. publicvoidonCreate(BundlesavedInstanceState){
  29. super.onCreate(savedInstanceState);
  30. requestWindowFeature(Window.FEATURE_NO_TITLE);
  31. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  32. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  33. worldAABB=newAABB();
  34. //上下界,以屏幕的左上方为原点,如果创建的刚体到达屏幕的边缘的话,会停止模拟
  35. worldAABB.lowerBound.set(-100.0f,-100.0f);
  36. worldAABB.upperBound.set(100.0f,100.0f);//注意这里使用的是现实世界的单位
  37. Vec2gravity=newVec2(0.0f,10.0f);
  38. booleandoSleep=true;
  39. world=newWorld(worldAABB,gravity,doSleep);//创建世界
  40. createBox(160,470,160,10,true);
  41. createBox1(160,150,160,10,false);
  42. createCircle(160,100,10);
  43. createCircle1(150,60,10);
  44. timeStep=1.0f/60.0f;
  45. iterations=10;
  46. myView=newMyView(this);
  47. setContentView(myView);
  48. mHandler=newHandler();
  49. mHandler.post(update);
  50. }
  51. privateRunnableupdate=newRunnable(){
  52. publicvoidrun(){
  53. world.step(timeStep,iterations);//开始模拟
  54. Vec2position=body.getPosition();
  55. Vec2position1=body2.getPosition();
  56. Vec2position2=body3.getPosition();
  57. myView.x=position.x*RATE;
  58. myView.y=position.y*RATE;
  59. myView.x1=position1.x*RATE;
  60. myView.y1=position1.y*RATE;
  61. myView.x2=position2.x*RATE;
  62. myView.y2=position2.y*RATE;
  63. myView.update();
  64. mHandler.postDelayed(update,(long)timeStep*1000);
  65. }
  66. };
  67. publicvoidcreateBox(floatx,floaty,floathalf_width,floathalf_height,
  68. booleanisStatic){
  69. PolygonDefshape=newPolygonDef();
  70. if(isStatic){shape.density=0;}
  71. else{shape.density=2.0f;}
  72. shape.friction=0.8f;
  73. shape.restitution=0.3f;
  74. shape.setAsBox(half_width/RATE,half_height/RATE);
  75. BodyDefbodyDef=newBodyDef();
  76. bodyDef.position.set(x/RATE,y/RATE);
  77. Bodybody1=world.createBody(bodyDef);
  78. body1.createShape(shape);
  79. body1.setMassFromShapes();
  80. }
  81. publicvoidcreateCircle(floatx,floaty,floatradius){
  82. CircleDefshape=newCircleDef();
  83. shape.density=7;
  84. shape.friction=0.2f;
  85. shape.radius=radius/RATE;
  86. BodyDefbodyDef=newBodyDef();
  87. bodyDef.position.set(x/RATE,y/RATE);
  88. body2=world.createBody(bodyDef);
  89. body2.createShape(shape);
  90. body2.setMassFromShapes();
  91. }
  92. publicvoidcreateCircle1(floatx,floaty,floatradius){
  93. CircleDefshape=newCircleDef();
  94. shape.density=7;
  95. shape.friction=0.2f;
  96. shape.radius=radius/RATE;
  97. BodyDefbodyDef=newBodyDef();
  98. bodyDef.position.set(x/RATE,y/RATE);
  99. body3=world.createBody(bodyDef);
  100. body3.createShape(shape);
  101. body3.setMassFromShapes();
  102. }
  103. publicvoidcreateBox1(floatx,floaty,floathalf_width,floathalf_height,
  104. booleanisStatic){
  105. PolygonDefshape=newPolygonDef();
  106. if(isStatic){shape.density=0;}
  107. else{shape.density=2.0f;}
  108. shape.friction=0.3f;
  109. shape.setAsBox(half_width/RATE,half_height/RATE);
  110. BodyDefbodyDef=newBodyDef();
  111. bodyDef.position.set(x/RATE,y/RATE);
  112. body=world.createBody(bodyDef);
  113. body.createShape(shape);
  114. body.setMassFromShapes();
  115. }
  116. classMyViewextendsView{
  117. Canvascanvas;
  118. publicfloatx=160,y=150;
  119. publicfloatx1=160,y1=100;
  120. publicfloatx2=150,y2=60;
  121. publicMyView(Contextcontext){
  122. super(context);
  123. }
  124. publicvoiddrawBox(floatx,floaty){
  125. PaintmPaint=newPaint();
  126. mPaint.setAntiAlias(true);
  127. mPaint.setColor(Color.RED);
  128. canvas.drawRect(x-160,y-10,x+160,y+10,mPaint);
  129. }
  130. publicvoiddrawGround(){
  131. PaintmPaint=newPaint();
  132. mPaint.setAntiAlias(true);
  133. mPaint.setColor(Color.BLUE);
  134. canvas.drawRect(0,460,320,480,mPaint);
  135. }
  136. publicvoiddrawCircle(floatx1,floaty1){
  137. PaintmPaint=newPaint();
  138. mPaint.setAntiAlias(true);
  139. mPaint.setColor(Color.GREEN);
  140. canvas.drawCircle(x1,y1,10,mPaint);
  141. }
  142. publicvoidupdate(){
  143. postInvalidate();
  144. }
  145. protectedvoidonDraw(Canvascanvas){
  146. super.onDraw(canvas);
  147. this.canvas=canvas;
  148. drawGround();
  149. drawBox(x,y);
  150. drawCircle(x1,y1);
  151. drawCircle(x2,y2);
  152. }
  153. }
  154. }

程序运行的时候需要加载Jbox2d的库,可到以下地址下载(使用的是不带渲染部分的库jbox2d-2.0.1-library-only.jar):

http://sourceforge.net/projects/jbox2d/ 附件也有

更多相关文章

  1. 总结的一些android公共库
  2. 编译移植android 2.3到tiny210
  3. 学习Android(安卓)应注意的十个问题
  4. Android的Message Queue
  5. 实践中探索Android智能手机系统------ROM分区
  6. edittext的imeOptions属性和android软键盘的使用
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. Android(安卓)各种工具类 图片下载工具类
  2. 【Arcgis for android】Error inflating
  3. Android(安卓)获取 IP 地址
  4. Android以TelephonyManager取得話機狀態
  5. Android各版本占比信息统计
  6. android 拖动图片移动效果
  7. android输入法控制显示
  8. android异步操作AsyncTask编写文件查看器
  9. android语音识别之科大讯飞语音API的使用
  10. Android(安卓)浅析 ButterKnife (一) 使