软件编程
位置:首页>> 软件编程>> Android编程>> Android下2d物理引擎Box2d用法简单实例

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

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

标签:Android,引擎,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;
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程序设计有所帮助。

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com