使用引擎版本:jbox2d-library-2.1.2.jar

封装好的JBOX2D引擎,专门适合android平台使用

点击下载

注意:下载这个封装好的不需要slfj库支持,效率更高

之前在jbox2d 官网下载的2.1.2一直跑不起来,发现jar包有问题,后来在官网发帖子,jbox2d作者非常耐心的解答了我的问题,终于用上2.1.2的jbox2d了哇,

非常感谢老外的开源精神,做出这么好的物理引擎,完全免费

jbox2d官网:http://code.google.com/p/jbox2d/

现在奉上我学习jbox2d做的demo,这个demo类似与testbed 里的 varying restitution

baseview.java:

[java] view plaincopyprint?

  1. package com.tszy.testjbox2d212;
  2. import org.jbox2d.collision.shapes.CircleShape;
  3. import org.jbox2d.collision.shapes.PolygonShape;
  4. import org.jbox2d.common.Vec2;
  5. import org.jbox2d.dynamics.Body;
  6. import org.jbox2d.dynamics.BodyDef;
  7. import org.jbox2d.dynamics.BodyType;
  8. import org.jbox2d.dynamics.FixtureDef;
  9. import org.jbox2d.dynamics.World;
  10. import org.jbox2d.dynamics.joints.MouseJoint;
  11. import android.content.Context;
  12. import android.graphics.Canvas;
  13. import android.graphics.Matrix;
  14. import android.graphics.Paint;
  15. import android.graphics.Paint.Style;
  16. import android.view.View;
  17. public class BaseView extends View implements Runnable{
  18. public static final float RATE = 30.0f;     //比例尺
  19. public static final int DEF_FPS = 30;   //默认刷新频率
  20. private Thread thread;
  21. protected World world;
  22. protected Paint paint;
  23. protected Matrix matrix;
  24. protected BodyDef bd;
  25. protected MouseJoint mouseJoint;
  26. public boolean a = true;
  27. public Body m_groundBody;
  28. public BaseView(Context context) {
  29. super(context);
  30. // TODO Auto-generated constructor stub
  31. bd = new BodyDef();
  32. paint = new Paint(Paint.ANTI_ALIAS_FLAG);// 无锯齿
  33. paint.setStyle(Style.FILL);
  34. matrix = new Matrix();
  35. Vec2 gravity = new Vec2(0, 10f);
  36. world = new World(gravity, true);
  37. BodyDef bodyDef = new BodyDef();
  38. m_groundBody = world.createBody(bodyDef);
  39. thread = new Thread(this);
  40. thread.start();
  41. }
  42. /**
  43. * 创建矩形
  44. * @param world 所在世界
  45. * @param x, y 中心点位置
  46. * @param w, h 尺寸
  47. * @param friction 摩擦力
  48. * @param restitution 恢复力
  49. * @param isStatic 静态否
  50. * @return 对象
  51. */
  52. public Body createPolygon(float x, float y, float w, float h,
  53. float friction, float restitution,
  54. boolean isStatic) {
  55. //创建多边形皮肤
  56. PolygonShape shape = new PolygonShape();
  57. shape.setAsBox(w/2/RATE, h/2/RATE);
  58. FixtureDef fd = new FixtureDef();
  59. fd.shape = shape;
  60. fd.density =  1.0f; //设置密度
  61. fd.friction = friction;         //设置摩擦力
  62. fd.restitution = restitution;   //设置多边形的恢复力
  63. //设置刚体初始坐标
  64. bd.type = isStatic? BodyType.STATIC : BodyType.DYNAMIC;
  65. bd.position.set(x/RATE, y/RATE);
  66. //创建物体
  67. Body body = world.createBody(bd);   //物理世界创建物体
  68. //此方法改变了
  69. //body.createShape(pDef);   //为body添加皮肤
  70. body.createFixture(fd);
  71. return body;
  72. }
  73. public Body createPolygon(float x, float y, float w, float h,
  74. boolean isStatic) {
  75. return createPolygon(x, y, w, h, 0.3f, 0.5f, isStatic);
  76. }
  77. /**
  78. * 创建圆形
  79. * @param world 所在世界
  80. * @param x, y 圆心位置
  81. * @param r 半径
  82. * @param friction 摩擦力
  83. * @param restitution 恢复力
  84. * @param isStatic 静态否
  85. * @return 对象
  86. */
  87. public Body createCircle(float x, float y, float r,
  88. float friction, float restitution,
  89. boolean isStatic) {
  90. //创建圆形皮肤
  91. CircleShape shape = new CircleShape();
  92. shape.m_radius = r/RATE;
  93. FixtureDef fd = new FixtureDef();
  94. fd.shape = shape;
  95. fd.density = 1.0f;
  96. fd.friction = friction;
  97. fd.restitution = restitution;
  98. //创建刚体
  99. bd.type = isStatic? BodyType.STATIC : BodyType.DYNAMIC;
  100. bd.position.set((x+r)/RATE, (y+r)/RATE);
  101. //创建一个body
  102. Body body = world.createBody(bd);
  103. body.createFixture(fd);
  104. return body;
  105. }
  106. public Vec2 screen2world(Vec2 p) {
  107. p.x /= RATE;
  108. p.y /= RATE;
  109. return p;
  110. }
  111. public Vec2 world2screen(Vec2 p){
  112. p.x *= RATE;
  113. p.y *= RATE;
  114. return p;
  115. }
  116. public Vec2 screen2world2(Vec2 p) {
  117. return new Vec2(p.x/RATE, p.y/RATE);
  118. }
  119. public Vec2 world2screen2(Vec2 p){
  120. return new Vec2(p.x*RATE, p.y*RATE);
  121. }
  122. private void drawFPS(Canvas canvas) {
  123. paint.setColor(0xffffffff);
  124. paint.setAntiAlias(true);
  125. if (USETIME > 0)
  126. canvas.drawText("FPS:" + (USETIME>0? 1000/USETIME : 33), 3,
  127. 3 + paint.getTextSize(), paint);
  128. }
  129. @Override
  130. protected void onDraw(Canvas canvas) {
  131. // TODO Auto-generated method stub
  132. drawFPS(canvas);
  133. super.onDraw(canvas);
  134. }
  135. private long USETIME;
  136. @Override
  137. public void run() {
  138. // TODO Auto-generated method stub
  139. long t1, t2;
  140. while (a) {
  141. //模拟世界
  142. //速度模拟频率,位置模拟频率
  143. world.step(1.0f/30.0f, 3, 8);
  144. t1 = System.currentTimeMillis();
  145. postInvalidate();
  146. t2 = System.currentTimeMillis();
  147. USETIME = t2 - t1;
  148. //正常休眠
  149. if (USETIME < 33) {
  150. try {
  151. Thread.sleep(33 - USETIME);
  152. } catch (InterruptedException e) {
  153. // TODO Auto-generated catch block
  154. e.printStackTrace();
  155. }
  156. }
  157. }
  158. }
  159. }

View.java

package com.tszy.testjbox2d212;

  1. import org.jbox2d.callbacks.QueryCallback;
  2. import org.jbox2d.collision.AABB;
  3. import org.jbox2d.common.Vec2;
  4. import org.jbox2d.dynamics.Body;
  5. import org.jbox2d.dynamics.BodyType;
  6. import org.jbox2d.dynamics.Fixture;
  7. import org.jbox2d.dynamics.joints.MouseJoint;
  8. import org.jbox2d.dynamics.joints.MouseJointDef;
  9. import android.content.Context;
  10. import android.graphics.Canvas;
  11. import android.graphics.Color;
  12. import android.graphics.Paint;
  13. import android.graphics.Rect;
  14. import android.view.MotionEvent;
  15. public class View6 extends BaseView {
  16. private static final float R = 15.0f;
  17. public View6(Context context) {
  18. super(context);
  19. // TODO Auto-generated constructor stub
  20. create();
  21. }
  22. private void create() {
  23. // 地板
  24. Body body = null;
  25. body = createPolygon(10+460/2, 305, 460, 10, true);
  26. // 球
  27. float restitution[] = new float[]{0.0f, 0.1f, 0.3f, 0.5f, 0.75f, 0.9f, 1.0f};
  28. for (int i = 0; i < restitution.length; i++) {
  29. body = createCircle(80 + i * 40, 40, R, 0.3f, restitution[i], false);
  30. }
  31. }
  32. @Override
  33. protected void onDraw(Canvas canvas) {
  34. // TODO Auto-generated method stub
  35. canvas.drawColor(0xff000000);
  36. //地板
  37. paint.setColor(0xff00ff00);
  38. paint.setAntiAlias(false); //消除画笔锯齿
  39. paint.setStyle(Paint.Style.STROKE);
  40. Rect r = new Rect(10, 300, 470, 310);
  41. canvas.drawRect(r, paint);
  42. r = null;
  43. //球
  44. //得到body链表表头
  45. Body  body = world.getBodyList();
  46. for(int i=1; i<world.getBodyCount(); i++){
  47. if(body.getType() != BodyType.DYNAMIC){ //不是动态的物体
  48. continue;
  49. }
  50. drawBall(canvas, body);
  51. body = body.m_next;
  52. }
  53. //if(mouseJoint != null)
  54. drawLine(canvas);
  55. super.onDraw(canvas);
  56. }
  57. private void drawLine(Canvas canvas){
  58. if(curBody==null || !isMoving) return;
  59. paint.setAntiAlias(false); //消除画笔锯齿
  60. paint.setColor(Color.GREEN);
  61. paint.setStyle(Paint.Style.STROKE);
  62. Vec2 d = world2screen2(curBody.getPosition());
  63. Vec2 d2 = world2screen2(p);
  64. canvas.drawLine(d.x, d.y, d2.x, d2.y, paint);
  65. }
  66. private void drawBall(Canvas canvas, Body ball){
  67. //得到的body的质点坐标
  68. Vec2 p = world2screen2(ball.getPosition());
  69. //canvas.save();
  70. //获取球的旋转角度
  71. float degrees = (float) ((ball.getAngle()*180/Math.PI) % 360);
  72. matrix.reset();
  73. canvas.save();  //保存不需要绘制的区域
  74. if (degrees != 0)
  75. matrix.preRotate(degrees, p.x, p.y);    //设置矩阵旋转角度
  76. canvas.setMatrix(matrix);
  77. //填充
  78. paint.setColor(0x80ffbbff);
  79. paint.setStyle(Paint.Style.FILL);
  80. canvas.drawCircle(p.x, p.y, R, paint);
  81. //轮廓
  82. paint.setAntiAlias(true);
  83. paint.setColor(0xffffbbff);
  84. paint.setStyle(Paint.Style.STROKE);
  85. canvas.drawCircle(p.x, p.y, R, paint);
  86. //paint.setAntiAlias(false);
  87. //角度
  88. paint.setColor(0xff00ff00);
  89. paint.setStyle(Paint.Style.FILL);
  90. canvas.drawLine(p.x, p.y, p.x, p.y-R, paint);
  91. canvas.restore();
  92. }
  93. private boolean isMoving;
  94. private Body curBody;
  95. private Vec2 p;
  96. private final AABB queryAABB = new AABB();
  97. private final TestQueryCallback callback = new TestQueryCallback();
  98. @Override
  99. public boolean onTouchEvent(MotionEvent event) {
  100. // TODO Auto-generated method stub
  101. p = screen2world(new Vec2(event.getX(), event.getY()));
  102. switch (event.getAction()) {
  103. case MotionEvent.ACTION_DOWN :{
  104. isMoving = true;
  105. if (mouseJoint != null) {
  106. return true;
  107. }
  108. queryAABB.lowerBound.set(p.x - .001f, p.y - .001f);
  109. queryAABB.upperBound.set(p.x + .001f, p.y + .001f);
  110. callback.point.set(p);
  111. callback.fixture = null;
  112. world.queryAABB(callback, queryAABB);
  113. if(callback.fixture != null){
  114. curBody = callback.fixture.getBody();
  115. MouseJointDef def = new MouseJointDef();
  116. def.bodyA = m_groundBody;
  117. def.bodyB = curBody;
  118. def.target.set(p);
  119. def.maxForce = 1000f * curBody.getMass();
  120. mouseJoint = (MouseJoint) world.createJoint(def);
  121. curBody.setAwake(true);
  122. }
  123. }
  124. case MotionEvent.ACTION_MOVE : {
  125. if (mouseJoint != null) {
  126. mouseJoint.setTarget(p);
  127. }
  128. return true;
  129. }
  130. case MotionEvent.ACTION_UP : {
  131. isMoving = false;
  132. if (mouseJoint != null) {
  133. world.destroyJoint(mouseJoint);
  134. mouseJoint = null;
  135. }
  136. return true;
  137. }
  138. }
  139. return super.onTouchEvent(event);
  140. }
  141. class TestQueryCallback implements QueryCallback {
  142. public final Vec2 point;
  143. public Fixture fixture;
  144. public TestQueryCallback() {
  145. point = new Vec2();
  146. fixture = null;
  147. }
  148. /**
  149. * @see org.jbox2d.callbacks.QueryCallback#reportFixture(org.jbox2d.dynamics.Fixture)
  150. */
  151. public boolean reportFixture(Fixture argFixture) {
  152. Body body = argFixture.getBody();
  153. if (body.getType() == BodyType.DYNAMIC) {
  154. boolean inside = argFixture.testPoint(point);
  155. if (inside) {
  156. fixture = argFixture;
  157. return false;
  158. }
  159. }
  160. return true;
  161. }
  162. }
  163. }

jbox2d库,这两个都需要
jbox2d-library-2.1.2.jar

slf4j-api-1.6.3.jar

http://blog.csdn.net/z1074971432/article/details/6912225

JBox2D学习 - 小球碰撞实例 .相关推荐

  1. Simscape基础教程之实例(一)——使用Simscape三维物理仿真自由落体小球碰撞平面

    一. 简介 本实例使用MATLAB/Simulink里面的simscape,实现自由落体小球碰撞平面的三维物理仿真,可用于新手入门simscape的参考示例. 二. 准备工作 需要安装的工具箱 (1) ...

  2. Canvas+Js制作动量守恒的小球碰撞

    目的:通过js实现小球碰撞并实现动量守恒 canvas我们就不多说了,有用着呢. 我们可以通过canvas画2D图形(圆.方块.三角形等等)3D图形(球体.正方体等待). 当然这只是基础的皮毛而已,c ...

  3. Java反弹球两球相撞_java实现小球碰撞反弹

    java实现小球碰撞反弹 java实现小球碰撞反弹 首先我们要在一个窗口里面显示这个功能,因此引入JFrame类然后创建一个窗口代码如下: JFrame win=new JFrame();//新建窗口 ...

  4. js 小球碰壁反弹and小球碰撞

    好像好几天没有更博了呢,最近有点变懒了,这样不好,不好~~我们要做热爱学习的好孩子,嘻嘻,今天下午补上... 我们在学习js的时候,一个很经典的案例就是小球的碰壁反弹效果啦~简单的小球碰壁效果可以慢慢 ...

  5. 主要推荐系统算法总结及Youtube深度学习推荐算法实例概括

    主要推荐系统算法总结及Youtube深度学习推荐算法实例概括 By ZhuZhiboSmith2017年7月09日 17:00 现如今,许多公司使用大数据来做超级相关推荐,并以此来增加收益.在海量推荐 ...

  6. (私人收藏)[开发必备]HTML5最全快速查找离线手册(可查询可学习,带实例)...

    [开发必备]HTML5最全快速查找离线手册(可查询可学习,带实例) HTML5最全快速查找离线手册:https://pan.baidu.com/s/19seE8TJQSx4IsWgXtKQS0A j9 ...

  7. OpenCV语义细分深度学习网络的实例(附完整代码)

    OpenCV语义细分深度学习网络的实例 OpenCV语义细分深度学习网络的实例 OpenCV语义细分深度学习网络的实例 #include <fstream> #include <ss ...

  8. OpenCV运行对象检测深度学习网络的实例(附完整代码)

    OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 #include <fstream> #include ...

  9. OpenCV运行分类深度学习网络的实例(附完整代码)

    OpenCV运行分类深度学习网络的实例 OpenCV运行分类深度学习网络的实例 OpenCV运行分类深度学习网络的实例 #include <fstream> #include <ss ...

最新文章

  1. cocos中添加显示文字的三种方式(CCLabelTTF 、CCLabelBMFont 和CCLabelAtlas)
  2. ubuntu16.04设置ssh免密码登录
  3. 【Spring学习】RestTemplate访问Rest服务总结
  4. HJ浇花(牛客竞赛 约束差分)
  5. 用android ndk编译ffmpeg,AndroidNDK交叉编译FFMPEG
  6. USACO Section 4
  7. ccmlt 2013 V2.0012
  8. java并发编程之缓存一致性问题
  9. 区块链基础学习(一)
  10. wpf 界面加载 Command
  11. iview组件的Table表格的内容过多时,显示title提示
  12. Atitit linux获取项目运行环境版本
  13. lcd驱动移植的分析linux3.2内核,chipsee为例,液晶屏AT070TN92
  14. 李沐老师 PyTorch版——线性回归 + softmax回归的简洁实现(3)
  15. 技术分享:用JS实现的3D海浪涌动特效
  16. 解决Vue运行报js内存溢出问题
  17. 华为android9.1指令,华为手机进工程模式指令大全(新增EMUI9.0指令链接)
  18. hive异常 return code X from org.apache.hadoop.hive.ql.exec.mr.MapredLocalTask 解决
  19. LabVIEW TDMS连续写入内存增长
  20. Java实现“梭哈”游戏

热门文章

  1. android 半圆滚动菜单,自定义控件:实现半圆滚动菜单效果
  2. 161227、js显示对象所有属性和方法的函数
  3. sshpass批量执行操作
  4. jquery节点查询
  5. 通过JMX获取weblogic的监控指标
  6. Model-Based RL前沿追踪——以无法为有法,以无形为有形
  7. 神经网络其实并不需要那么深!普林斯顿大学英特尔提出ParNet,12层的网络就能达到80%以上的准确率!...
  8. 中交国通智能科技 招募 AI目标识别技术顾问
  9. CVPR 2021 底层视觉最新进展分享
  10. TIP 2021论文:多曝光图像融合及超分辨的联合实现