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


程序很简单:蓝色的是地面,从上面掉下两个绿球和一个红色的方块,它们之间的碰撞都由box2d引擎自己来完成。
(这程序运行起来有点卡,我 也正在解决这个问题,有朋友知道答案的也请分享一下啦!)
代码如下:

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

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

android box2d小程序相关推荐

  1. java计算机毕业设计基于安卓Android/微信小程序的大学生签到管理系统APP

    项目介绍 随着Internet的发展,人们的日常生活已经离不开网络.未来人们的生活与工作将变得越来越数字化,网络化和电子化.网上管理,它将是直接管理签到系统app的最新形式.本论文是以构建签到系统ap ...

  2. java计算机毕业设计基于安卓Android/微信小程序的游泳馆管理系统APP

    项目介绍 游泳馆管理系统小程序,主要对首页.个人中心.会员管理.场馆类型管理.泳池类型管理.饮食类型管理.场馆信息管理.泳池信息管理.饮食信息管理.泳池预订管理.购买信息管理.会员等级管理.会员充值管 ...

  3. java计算机毕业设计基于安卓Android/微信小程序的校园闲置二手交易平台APP

    项目介绍 网络技术的快速发展给各行各业带来了很大的突破,也给各行各业提供了一种新的管理模式,校园二手交易平台小程序将是又一个从传统管理到智能化信息管理的典型案例,对于传统的校园二手交易,所包括的信息内 ...

  4. 基于安卓/android/微信小程序的学生考勤签到APP-#计算机毕业设计

    X项目介绍 目前高校大学生上课考勤管理都是任课老师上课点名,然后用纸质版考勤表来记录学生上课出勤情况,学期末再根据所有上课出勤表及作业登记表对学生平时成绩打分,最后把出勤数据整理上交到各院系,而学生请 ...

  5. java计算机毕业设计基于安卓Android/微信小程序的自来水收费系统APP

    项目介绍 网络的广泛应用给生活带来了十分的便利.所以把自来水收费管理与现在网络相结合,利用java技术建设自来水收费系统app,实现自来水收费的信息化.则对于进一步提高自来水收费管理发展,丰富自来水收 ...

  6. java计算机毕业设计基于安卓Android/微信小程序的电脑组装机配置商城APP

    项目介绍 网络的广泛应用给生活带来了十分的便利.所以把组装机配置商城管理与现在网络相结合,利用java技术建设组装机配置商城app,实现组装机配置的信息化.则对于进一步提高组装机配置商城管理发展,丰富 ...

  7. 基于安卓/android/微信小程序的高校党员掌上党支部APP#计算机毕业设计

    项目介绍 随着经济的发展,人员交流来往的频繁,党员管理更加需要一套信息系统以提高信息管理的快捷及准确性.高校党员信息管理系统是高校党委组织工作不可缺少的一部分,各功能齐全.简单有用的高校党员信息管理系 ...

  8. 基于安卓/android/微信小程序的连锁药店管理系统app-#计算机毕业设计

    项目介绍 随着全球科技的发展,医疗事业也有了很大的进步.医疗事业的进步不仅体现在各类医疗器械和医疗手段上,同时也体现在了药品的多样性上,这就给药房的管理带来了一定的挑战,如果还是使用原始的方式对药房内 ...

  9. 基于安卓/android/微信小程序的流动人口管理移动APP#计算机毕业设计

    项目介绍 通过利用信息化管理技术对社区流动人口状况进行汇总分析,对流动人口数量.年龄结构.流动方向.经营情况.计划生育情况以及在本区分布情况.投资情况等数据进行系统分析,开发一套符合当地社区的流动人口 ...

最新文章

  1. Android保存自定义路径的图片的一些问题
  2. C# 11 中的参数 null 检查
  3. PyTorch 1.8版本!正式支持AMD GPU
  4. Mybatis的批量更新 bug
  5. 面向对象基础——static关键字和代码块的使用
  6. 不缺流量却变现乏力?穿山甲重磅打造《App 如何变现创收》系列课程帮你找症结...
  7. java试卷_Java测试题及答案(Java干货完整试卷)
  8. 【sklearn第二十八讲】验证曲线
  9. 上海day3 ----
  10. python彩票预测算法软件_python用遗传算法 神经网络 模糊逻辑控制算法对彩票乐透数据进行预测...
  11. 模式识别与机器学习 (Pattern Recognization and Maching Learning)(PRML) 总结
  12. 深度解析 steam密码js逆向(篇幅很长)
  13. STM32+GM65二维码识别模块
  14. 企业物流管理与最新IT技术
  15. SpringBoot整合WebSocket案例
  16. 设z服从标准正态分布_设Z服从标准正态分布,则P(Z1.33)=
  17. go语言多package使用实战
  18. 带附件的邮件的发送方法
  19. python读取sheet_python读取excel文件中所有sheet表格
  20. 引入 JPEGCodec;JPEGImageEncoder; 图片处理

热门文章

  1. Python python 五种数据类型--字符串
  2. 分子机制研究的五个层次,你的研究在哪个层次--转载
  3. Python人工智能之路 - 第一篇 : 你得会点儿Python基础
  4. 《数据库设计入门经典》读书笔记——第二章:工作场所中的数据库建模
  5. Salt 系统初始化
  6. Htmlt_Div+Css简介
  7. 谈谈如何在面试中发掘程序猿的核心竞争力 什么是程序员的核心竞争力?
  8. 单线驱动74hc595(转)
  9. Enterprise Library—缓存应用程序块
  10. ICCV2021 MuST:还在特定任务里为刷点而苦苦挣扎?谷歌的大佬们都已经开始玩多任务训练了...