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

本文实例讲述了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
2d物理引擎
box2d物理引擎、egret box2d物理引擎、box2d物理引擎教程、box2d引擎、box2d实例,以便于您获取更多的相关知识。

时间: 2024-10-04 01:17:30

Android下2d物理引擎Box2d用法简单实例_Android的相关文章

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

本文实例讲述了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;

2D物理引擎 Box2D Physics Engine 介绍

Collision Convex polyons and circles. Multiple shapes per body One-shot contact manifolds Incremental sweep-and-prune broadphase Efficient pair management Fast broadphase AABB queries Collision groups and categories Physics Persistent body-joint-cont

Android中SurfaceView用法简单实例_Android

本文实例讲述了Android中SurfaceView用法.分享给大家供大家参考,具体如下: 这里贴上一个小程序代码,主要运用SurfaceView来实现在屏幕上画一个圆,你可以通过按方向键和触摸屏幕来改变圆的位置 代码: Activity: package com.view; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowMa

Android开发之button事件监听简单实例_Android

本文实例讲述了Android开发之button事件监听用法.分享给大家供大家参考.具体如下: 事件监听的listener,有以下几种方式: 1.声明一个普通的class,实现OnClickListener接口,然后在button的setOnClickListener中new该类的一个对象. 2.使用匿名内部类,直接 btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { S

Android 中HttpURLConnection与HttpClient使用的简单实例_Android

1:HttpHelper.java 复制代码 代码如下: public class HttpHelper {    //1:标准的Java接口    public static String getStringFromNet1(String param){        String result="";        try{            URL url=new URL(param);            HttpURLConnection conn=(HttpURLCo

php获得文件夹下所有文件的递归算法的简单实例_php实例

如下所示: function my_scandir($dir) { $files=array(); if(is_dir($dir)) { if($handle=opendir($dir)) { while(($file=readdir($handle))!==false) { if($file!="." && $file!="..") { if(is_dir($dir."/".$file)) { $files[$file]=my_

Android Build类的详解及简单实例

Android Build类的详解及简单实例 一.类结构: java.lang.Object ? android.os.Build 二.类概述:从系统属性中提取设备硬件和版本信息. 三.内部类: 1.Build.VERSION 各种版本字符串 2.Build.VERSION_CODES 目前已知的版本代码的枚举类 四.常量:UNKNOWN 当一个版本属性不知道时所设定的值.其字符串值为 unknown . 五.构造方法: Build () 六.静态属性 1.BOARD 主板:The name o

Android 代码写控件代替XML简单实例

Android 代码写控件代替XML简单实例 简单的一个Button控件的练习. 实现代码: Button btn = new Button(HandlerToActivity.this); LinearLayout.LayoutParams params=new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.gravity = Gravity.CENTER_HORIZONTAL; param

Android下的POS打印机调用的简单实现

本文基于GP58系列,它可以兼容ESC/POS指令集,对EPSON的打印机通用. Android下的设备调试,如果设备提供了驱动,按照厂家的驱动调试即可:设备未提供驱动,只能按照通用的方法进行调试.这里采用的是调用USB接口来控制打印机输出. 1.首先获取USB管理器 public UsbAdmin(Context context) { mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); mPermi