当前位置: 代码迷 >> Android >> android 2d物理发动机-Box2d
  详细解决方案

android 2d物理发动机-Box2d

热度:416   发布时间:2016-05-01 18:33:51.0
android 2d物理引擎-Box2d

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

?

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

?

?

?

?

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

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

代码如下:

Java代码 复制代码?收藏代码
  1. package?com.ray.test; ??
  2. ??
  3. import?org.jbox2d.collision.AABB; ??
  4. import?org.jbox2d.collision.CircleDef; ??
  5. import?org.jbox2d.collision.PolygonDef; ??
  6. import?org.jbox2d.common.Vec2; ??
  7. import?org.jbox2d.dynamics.Body; ??
  8. import?org.jbox2d.dynamics.BodyDef; ??
  9. import?org.jbox2d.dynamics.World; ??
  10. ??
  11. import?android.app.Activity; ??
  12. import?android.content.Context; ??
  13. import?android.graphics.Canvas; ??
  14. import?android.graphics.Color; ??
  15. import?android.graphics.Paint; ??
  16. import?android.os.Bundle; ??
  17. import?android.os.Handler; ??
  18. import?android.view.View; ??
  19. import?android.view.Window; ??
  20. import?android.view.WindowManager; ??
  21. ??
  22. public?class?MyBox2d?extends?Activity?{ ??
  23. ???? ??
  24. ????private?final?static?int?RATE?=?10;//屏幕到现实世界的比例?10px:1m; ??
  25. ????private?AABB?worldAABB;//创建?一个管理碰撞的世界 ??
  26. ????private?World?world; ??
  27. ????private?float?timeStep?=?1/60;//模拟的的频率 ??
  28. ????private?int?iterations?=?10;//迭代越大,模拟约精确,但性能越低 ??
  29. ????private?Body?body,body2,body3; ??
  30. ????private?MyView?myView; ??
  31. ????private?Handler?mHandler; ??
  32. ????public?void?onCreate(Bundle?savedInstanceState)?{ ??
  33. ????????super.onCreate(savedInstanceState); ??
  34. ????????requestWindowFeature(Window.FEATURE_NO_TITLE); ??
  35. ????????getWindow().setFlags(WindowManager.LayoutParams.?FLAG_FULLSCREEN?, ??
  36. ????????WindowManager.LayoutParams.?FLAG_FULLSCREEN); ??
  37. ???????? ??
  38. ????????worldAABB?=?new?AABB(); ??
  39. ????????? ??
  40. ???????//上下界,以屏幕的左上方为?原点,如果创建的刚体到达屏幕的边缘的话,会停止模拟 ??
  41. ????????worldAABB.lowerBound.set(-100.0f,-100.0f); ??
  42. ????????worldAABB.upperBound.set(100.0f,?100.0f);//注意这里使用的是现实世界的单位 ??
  43. ???????? ??
  44. ????????Vec2?gravity?=?new?Vec2(0.0f,10.0f); ??
  45. ????????boolean?doSleep?=?true; ??
  46. ???????? ??
  47. ??
  48. ????????world?=?new?World(worldAABB,?gravity,?doSleep);//创建世界 ??
  49. ???????? ??
  50. ????????createBox(160,?470,?160,?10,?true);????? ??
  51. ????????createBox1(160,?150,?160,?10,?false); ??
  52. ???????? ??
  53. ????????createCircle(160,?100,?10); ??
  54. ????????createCircle1(150,?60,?10); ??
  55. ????????timeStep?=?1.0f/60.0f; ??
  56. ????????iterations?=?10; ??
  57. ???????? ??
  58. ????????myView?=?new?MyView(this); ??
  59. ????????setContentView(myView); ??
  60. ????????mHandler?=?new?Handler(); ??
  61. ????????mHandler.post(update); ??
  62. ????} ??
  63. ???? ??
  64. ????private?Runnable?update?=?new?Runnable()?{ ??
  65. ????????public?void?run()?{ ??
  66. ????????????????world.step(timeStep,?iterations);//开始模拟 ??
  67. ????????????????Vec2?position?=?body.getPosition(); ??
  68. ????????????????Vec2?position1?=?body2.getPosition(); ??
  69. ????????????????Vec2?position2?=?body3.getPosition(); ??
  70. ????????????????myView.x=position.x*RATE; ??
  71. ????????????????myView.y=position.y*RATE; ??
  72. ???????????????? ??
  73. ????????????????myView.x1=position1.x*RATE;? ??
  74. ????????????????myView.y1=position1.y*RATE; ??
  75. ???????????????? ??
  76. ????????????????myView.x2=position2.x*RATE; ??
  77. ????????????????myView.y2=position2.y*RATE; ??
  78. ????????????????myView.update(); ??
  79. ????????????????mHandler.postDelayed(update,?(long)timeStep*1000); ??
  80. ????????} ??
  81. ????}; ??
  82. ???? ??
  83. ????public?void?createBox(float?x,float?y,float?half_width,float?half_height, ??
  84. ?????????????????????boolean?isStatic){? ??
  85. ????????PolygonDef?shape?=?new?PolygonDef(); ??
  86. ????????if(isStatic){shape.density?=?0;} ??
  87. ????????else{shape.density?=?2.0f;} ??
  88. ????????shape.friction?=?0.8f; ??
  89. ????????shape.restitution?=?0.3f; ??
  90. ????????shape.setAsBox(half_width/RATE,?half_height/RATE); ??
  91. ???????? ??
  92. ????????BodyDef?bodyDef?=?new?BodyDef(); ??
  93. ????????bodyDef.position.set(x/RATE,?y/RATE); ??
  94. ????????Body?body1=?world.createBody(bodyDef); ??
  95. ????????body1.createShape(shape); ??
  96. ????????body1.setMassFromShapes(); ??
  97. ????} ??
  98. ???? ??
  99. ????public?void?createCircle(float?x,float?y,float?radius){ ??
  100. ????????CircleDef?shape?=?new?CircleDef(); ??
  101. ????????shape.density?=?7; ??
  102. ????????shape.friction?=?0.2f; ??
  103. ????????shape.radius?=?radius/RATE; ??
  104. ???????? ??
  105. ????????BodyDef?bodyDef?=?new?BodyDef(); ??
  106. ????????bodyDef.position.set(x/RATE,?y/RATE); ??
  107. ????????body2?=?world.createBody(bodyDef); ??
  108. ????????body2.createShape(shape); ??
  109. ????????body2.setMassFromShapes(); ??
  110. ????} ??
  111. ???? ??
  112. ????public?void?createCircle1(float?x,float?y,float?radius){ ??
  113. ????????CircleDef?shape?=?new?CircleDef(); ??
  114. ????????shape.density?=?7; ??
  115. ????????shape.friction?=?0.2f; ??
  116. ????????shape.radius?=?radius/RATE; ??
  117. ???????? ??
  118. ????????BodyDef?bodyDef?=?new?BodyDef(); ??
  119. ????????bodyDef.position.set(x/RATE,?y/RATE); ??
  120. ????????body3?=?world.createBody(bodyDef); ??
  121. ????????body3.createShape(shape); ??
  122. ????????body3.setMassFromShapes(); ??
  123. ????} ??
  124. ???? ??
  125. ????public?void?createBox1(float?x,float?y,float?half_width,float?half_height, ??
  126. ???????????????????boolean?isStatic){? ??
  127. ????????PolygonDef?shape?=?new?PolygonDef(); ??
  128. ????????if(isStatic){shape.density?=?0;} ??
  129. ????????else{shape.density?=?2.0f;} ??
  130. ????????shape.friction?=?0.3f; ??
  131. ????????shape.setAsBox(half_width/RATE,?half_height/RATE); ??
  132. ???????? ??
  133. ????????BodyDef?bodyDef?=?new?BodyDef(); ??
  134. ????????bodyDef.position.set(x/RATE,?y/RATE); ??
  135. ????????body=?world.createBody(bodyDef); ??
  136. ????????body.createShape(shape); ??
  137. ????????body.setMassFromShapes(); ??
  138. ????} ??
  139. ???? ??
  140. ????class?MyView?extends?View{ ??
  141. ????????Canvas?canvas; ??
  142. ????????public?float?x=160,y=150; ??
  143. ????????public?float?x1=160,y1=100; ??
  144. ????????public?float?x2=150,y2=60; ??
  145. ????????public?MyView(Context?context)?{ ??
  146. ????????????super(context); ??
  147. ????????} ??
  148. ??
  149. ????????public?void?drawBox(float?x,float?y){ ??
  150. ????????????Paint?mPaint?=?new?Paint(); ??
  151. ????????????mPaint.setAntiAlias(true); ??
  152. ????????????mPaint.setColor(Color.RED); ??
  153. ????????????canvas.drawRect(x-160,?y-10,?x+160,?y+10,?mPaint); ??
  154. ????????} ??
  155. ???????? ??
  156. ????????public?void?drawGround(){ ??
  157. ????????????Paint?mPaint?=?new?Paint(); ??
  158. ????????????mPaint.setAntiAlias(true); ??
  159. ????????????mPaint.setColor(Color.BLUE); ??
  160. ????????????canvas.drawRect(0,?460,?320,?480,?mPaint); ??
  161. ????????} ??
  162. ???????? ??
  163. ????????public?void?drawCircle(float?x1,float?y1){ ??
  164. ????????????Paint?mPaint?=?new?Paint(); ??
  165. ????????????mPaint.setAntiAlias(true); ??
  166. ????????????mPaint.setColor(Color.GREEN); ??
  167. ????????????canvas.drawCircle(x1,?y1,?10,?mPaint); ??
  168. ????????} ??
  169. ???????? ??
  170. ????????public?void?update(){ ??
  171. ????????????postInvalidate(); ??
  172. ????????} ??
  173. ???????? ??
  174. ????????protected?void?onDraw(Canvas?canvas)?{ ??
  175. ????????????super.onDraw(canvas); ??
  176. ????????????this.canvas?=?canvas; ??
  177. ????????????drawGround(); ??
  178. ????????????drawBox(x,?y); ??
  179. ????????????drawCircle(x1,?y1); ??
  180. ????????????drawCircle(x2,?y2); ??
  181. ????????} ??
  182. ???????? ??
  183. ???????? ??
  184. ????} ??
  185. }??

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

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

  相关解决方案