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


相关文章推荐

Android中Box2d初涉小例子

  • 2012年03月11日 13:40
  • 4.58MB
  • 下载

Android: Box2D--简单的跑跳游戏模型

  • 2012年12月02日 15:43
  • 477KB
  • 下载

SFML1.6结合box2d2.0.1写的第一个程序,自由下落的方块

#include #include #include "Box2D.h" #include void updateBoxPos(sf::Shape &dynamicBox,b2Body* bo...

Android基于box2d开发弹弓类游戏[六]-------------移动的镜头&添加目标

九.移动的镜头 子弹的发射已经完成了。下一个就是要增进用户体验的时候了。现在运行游戏,当子弹发射以后,我们还需要拖动屏幕才能看到子弹运行的轨迹,这样的体验是非常差的。接下来完成,移动的镜头功能。...
  • kaka626
  • kaka626
  • 2013年07月21日 14:21
  • 741

Android基于box2d开发弹弓类游戏[二]-------------游戏界面的搭建&移动游戏场景

前面一讲中,我们介绍了,游戏开发的前期准备与如何创建项目。  Android基于box2d开发弹弓类游戏[一]-------------前期准备&创建项目 在这一讲中,我们介绍如何搭建游戏...
  • kaka626
  • kaka626
  • 2013年07月21日 14:17
  • 994

在Android NDK中编译和使用Box2D

本文使用Windows+NDKr8编译,编译前请自行配置好相关环境变量 Box2D是一个在手机游戏开发中使用的物理引擎,本文使用NDK将Box2D移植到Android 首先去Box2D官网下载最新...

Android上使用Box2d

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

Android游戏开发十日通(8)- Box2D的例子和学习小结

提要       今天要学习的是cocos2dx中的Box2d物理引擎。       Box2D是一款开元的C++编写的物理引擎,起初是用于Flash的游戏开发中,随后推出了C++版本,其开发和升级工...

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

参考子龙山人系列博客:http://www.cnblogs.com/zilongshanren/tag/cocos2d/ 此作者都是基于IOS的cocos2D开发,本人参考并且转化为libgdx的c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android box2d小程序
举报原因:
原因补充:

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