android box2d小程序

转载 2012年03月25日 22:40:32

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):


Box2D.js简易示例

Box2dWeb example //在页面加载完毕后启动整个Box2D程序 function init() { /...
  • MAILLIBIN
  • MAILLIBIN
  • 2015年09月18日 10:45
  • 968

box2d在跑跳类游戏中的应用

---------------最近正在学习box2d的使用,偶然发现这篇博客,自己的问题,这里几乎都有解答了,于是无耻的拷贝过来,备忘----------- 原帖地址:http://blog.c...
  • u012860764
  • u012860764
  • 2013年11月23日 18:13
  • 1034

Android上使用Box2d

Android上使用Box2d Box2d是一个非常优秀的开源2D物理引擎,可以模拟出非常真实的物理效果,今天我们介绍如何在Andoird下使用Box2d: 注:本文的大部分参考:...
  • htttw
  • htttw
  • 2012年05月24日 23:17
  • 2889

Android之Box2D学习(一)——HelloWorld

本文地址:http://blog.csdn.net/you_and_me12/article/details/7961573 2012-09-10 从今天开始学习Box2D,在...
  • You_and_Me12
  • You_and_Me12
  • 2012年09月09日 22:48
  • 6197

Android 游戏引擎libgdx之Box2D 案例实践——打砖块(一)

参考子龙山人系列博客:http://www.cnblogs.com/zilongshanren/tag/cocos2d/ 此作者都是基于IOS的cocos2D开发,本人参考并且转化为libgdx的c...
  • dyllove98
  • dyllove98
  • 2013年04月18日 20:20
  • 4382

从android 看微信小程序

1、概述微信小程序 公测出来也2周多点了。注册了开发者,了解了下。感觉和移动端的理念差不多。 自己是做android开发的,所以从android的角度了解下2、web前端的编程方式不可否认的是微信小程...
  • lckj686
  • lckj686
  • 2016年11月19日 21:29
  • 1178

Android小程序-简易计算器的实现

目标效果:   通过编写代码,可以实现整数和小数的加减乘除运算,以及删除和清空的功能。 1.页面中Button使用的是线性布局,最外边一个是父布局,第一行C,DEL,/,*为第一个子...
  • hester_hester
  • hester_hester
  • 2016年04月10日 13:41
  • 4823

Android之路——第一个Android小程序(Android电话拨号器)

废话不说,直接贴代码:首先是布局的代码:main.xml
  • JasonChris
  • JasonChris
  • 2011年01月21日 13:00
  • 6726

Android基础小程序

1、简单的计数器 xml布局: Activity代码: public class MainActivity extends Activity { TextView tv; Butto...
  • qq_29954971
  • qq_29954971
  • 2017年04月20日 09:48
  • 663

Box2D创建多边形刚体

 Box2D创建多边形刚体有两种方法,我把他们分别叫做组合法和原生法。下面我来详细看看这两种方法的具体实现过程。 一、组合法 顾名思义,就是用多个刚体(这里我知道是我们学过的矩形...
  • u011413730
  • u011413730
  • 2014年07月04日 11:33
  • 1025
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android box2d小程序
举报原因:
原因补充:

(最多只允许输入30个字)