Android下2d物理引擎Box2d用法简单实例

作者:鉴客 时间:2023-09-11 03:18:02 

本文实例讲述了Android下2d物理引擎Box2d用法。分享给大家供大家参考。具体如下:

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

http://sourceforge.net/projects/jbox2d/


package com.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);
}
}
}

希望本文所述对大家的Android程序设计有所帮助。

标签:Android,引擎,Box2d
0
投稿

猜你喜欢

  • Java NIO中四大核心组件的使用详解

    2023-10-19 17:05:13
  • java项目构建Gradle的使用教程

    2023-06-07 19:17:41
  • 解析libcurl在android下的移植、编译与测试

    2023-01-24 01:19:44
  • Java微信公众平台开发(15) 微信JSSDK的使用

    2023-06-16 19:58:39
  • SpringBoot自动装配之Condition深入讲解

    2023-12-03 02:20:29
  • Java中ArrayList和LinkedList区别

    2023-09-06 20:43:09
  • java实现Dijkstra算法

    2021-09-02 23:14:15
  • 合并有序数组的实现(java与C语言)

    2023-08-16 13:45:40
  • C#根据日期计算星期几的实例代码

    2021-07-24 21:43:34
  • Java 堆内存溢出原因分析

    2023-06-27 08:34:23
  • C语言实现矩阵运算案例详解

    2023-08-03 12:15:14
  • SpringBoot封装响应数据实现过程详解

    2023-01-17 21:32:51
  • 深入Android SQLite 事务处理详解

    2023-07-17 08:32:17
  • Java设计者模式简单工厂模式解析

    2023-02-07 14:02:54
  • 微服务间调用Retrofit在Spring Cloud Alibaba中的使用

    2022-09-29 23:13:42
  • 详解Java线程同步器CountDownLatch

    2023-08-23 18:42:39
  • C# 文件上传下载(Excel导入,多线程下载)功能的实现代码

    2021-12-09 20:16:34
  • mybatis使用Integer类型查询可能出现的问题

    2022-09-01 12:47:38
  • Android自定义漂亮的圆形进度条

    2023-08-04 04:23:06
  • Android PopupWindow实现遮罩层效果

    2022-02-04 13:28:46
  • asp之家 软件编程 m.aspxhome.com