`

Android 2d物理引擎Box2d的使用示例

阅读更多

Box2d是一个很出名的2d物理引擎,大家可以google之。Box2d有C++,flash和Java等版本。android可以直接使用java版本的Jbox2d,但因为Jbox2d的图形渲染是使用processing库来实现的,所以,在android中使用Jbox2d的时候,图形渲染的工作就只能自己来写了。因为网上关于box2d的资料真的非常的少,特别是关于图形绘制方面,所以,虽然程序写得不是很好,还是贴上来了,先看截图:

 

 

 

 

程序很简单:蓝色的是地面,从上面掉下两个绿球和一个红色的方块,它们之间的碰撞都由box2d引擎自己来完成。

(这程序运行起来有点卡,我 也正在解决这个问题,有朋友知道答案的也请分享一下啦!)

代码如下:

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

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

分享到:
评论
15 楼 1025250620 2011-12-09  
  private float timeStep = 1/60;//模拟的的频率 
    private int iterations = 10;//迭代越大,模拟约精确,但性能越低 
这两个参数你能说的细致点么~?
14 楼 wu520615 2011-07-19  
我跑你的demo为什么物体不掉下来?看不到效果啊!!!求指导!!!
13 楼 wu520615 2011-07-19  
为什么我跑你的demo,所有的物体都是不动的! 麻烦指导一下啊!
12 楼 LoveAndr0id 2010-07-20  
确实有点卡,模拟器和手机都会卡。。。

不过还是要感谢楼主的分享。。。

请问那个JNI版本的Box2d是不是还没有完成,我刚刚翻0墙出去看了看,看得不是很明天(E文还不够好)
11 楼 zyazy119 2010-04-14  
请问怎么在模拟开始之后设定物体的速度和位置?谢谢
10 楼 zhenng 2009-10-22  
jjcang 写道
android的skia本身已经不错了,



不是一个东西
9 楼 jjcang 2009-10-22  
android的skia本身已经不错了,
8 楼 figofuture 2009-10-22  
Box2D的Android NDK移植版本
http://hi.baidu.com/gamefish/blog/item/1cb236fa3e1f31809f5146f5.html
Box2D for Android NDK
http://www.box2d.org/forum/viewtopic.php?f=5&t=3355&start=10

google group


http://groups.google.com/group/android-ndk/browse_thread/thread/10f2e02c5d6857cb?pli=1
7 楼 lordhong 2009-08-05  
raymondlueng 写道
我觉得JAVA版本box2d运行速度不行的原因在于它的垃圾回收机制,物理引擎里面使用的大量的而有生命周期很短的数据结构得不到及时回收。


嗯, JVM这个问题, 短期内在手机和嵌入式硬件上还不会得到完美解决...
6 楼 xhanxhanxhan 2009-08-05  
iphone 的BOX2D 上有很多例子
查阅 cocos2d-iphone
5 楼 raymondlueng 2009-08-05  
我觉得JAVA版本box2d运行速度不行的原因在于它的垃圾回收机制,物理引擎里面使用的大量的而有生命周期很短的数据结构得不到及时回收。
4 楼 lordhong 2009-08-05  
多谢楼主分享!  Java版的box2d确实比C/C++版的要慢, mobile gaming这一点, java确实不合适(至上目前是这样).  iPhone上是用的C/C++版, 很流畅!
3 楼 raymondlueng 2009-08-04  
恩,我也用过SurfaceView,感觉差不多。另外还用了一下NDK版本的Box2d,那个性能比较好!
2 楼 magicgod 2009-08-04  
view挺慢的吧,应该用SurfaceView
1 楼 诸葛紧 2009-08-04  
这里有人移植box2d
http://code.google.com/p/androidbox2d/
不过看他的截图帧率仍然不能满足游戏或应用要求啊,
以前我看过一个OECAKE在iphone上的演示视频,流体,刚体,气体都表现得很完美,一点都不卡,不知道怎么优化的

相关推荐

    box2d物理引擎cocos2d

    在本案例中,我们看到的"box2d物理引擎cocos2d"是Cocos2d集成了Box2D物理引擎的一个实例,它涵盖了Cocos2d的2.x和3.x两个版本。 Box2D引擎的核心概念包括刚体(Bodies)、形状(Shapes)、关节(Joints)和力...

    cocos2d-x box2d 物理引擎

    本文将深入探讨如何在cocos2d-x项目中集成并使用Box2D物理引擎。 1. **cocos2d-x简介** cocos2d-x是用C++编写的,基于cocos2d-x Objective-C版本的跨平台游戏开发框架。它支持iOS、Android、Windows、Mac等多个...

    as3.0 box2d物理引擎 包括引擎代码和教程和一个例子

    示例项目则是一个实际的应用实例,它展示了Box2D引擎的使用方法。你可以运行并分析这个例子,看看它是如何实现物体运动、碰撞响应以及与用户交互的。这有助于理解如何在实际场景中应用所学的知识。 在实际开发中,...

    第07章 游戏开发的核心——Box2D物理引擎.zip

    Box2D是一款强大的开源2D物理引擎,广泛应用于游戏开发,为游戏中的物体运动提供真实感的物理模拟。本章将深入探讨Box2D在游戏开发中的应用和核心概念。 首先,Box2D的设计目标是简化2D物理模拟,使开发者能够轻松...

    Box2D中文手册

    Box2D是一个强大的开源2D物理引擎,专为游戏开发者设计,使得在游戏场景中创建真实的物理效果变得简单易行。这个中文手册是为那些希望深入理解和应用Box2D的程序员准备的,提供了详尽的指导和实例,帮助开发者更好地...

    愤怒的小鸟物理引擎Box2D(c++)带文档

    Box2D是一个开源的2D物理引擎,由Ernesto Pena开发,广泛应用于游戏开发,尤其是像"愤怒的小鸟"这样的休闲游戏中。这个引擎以其高效、精确的模拟物理效果而闻名,允许开发者轻松地创建出逼真的物体碰撞、重力和其他...

    Box2D:给你的Qt程序加上物理引擎(包含windows+linux版)

    Box2D是一个流行的开源2D物理引擎,常用于游戏开发和其他需要实时物理模拟的应用中。在本主题中,我们将探讨如何将Box2D集成到Qt应用程序中,为你的项目添加真实的物理效果。Qt是一个功能强大的C++框架,用于创建跨...

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

    Box2D是一个强大的2D物理引擎,被广泛应用于游戏开发和模拟系统中,尤其是在Android平台上。这个引擎允许开发者创建复杂的物理交互,如重力、碰撞检测、摩擦力和弹力等,无需从头编写底层物理代码。在Android上使用...

    box2d物理引擎和资料

    Box2D是一个开源的2D物理引擎,广泛用于游戏开发,模拟和教育领域。它提供了现实世界的物理行为,如重力、碰撞检测、摩擦力和弹力,使得开发者能够创建出更加逼真的游戏环境和交互体验。以下是关于Box2D物理引擎的...

    Box2D物理引擎使用 拆方块游戏 源代码|No8.rar

    本项目提供的“拆方块游戏”源代码是基于Box2D物理引擎实现的一个实例,旨在帮助开发者理解如何运用Box2D来创建具有真实感的物理效果的游戏。 Box2D引擎的核心在于模拟现实世界的物理现象,如重力、碰撞检测、摩擦...

    Android Box2d物理世界源码.rar

    Box2D是一个开源的2D物理引擎,广泛用于游戏开发,尤其在移动平台如Android上。这个"Android Box2D物理世界源码"压缩包很可能包含了一整套用于在Android应用中实现2D物理模拟的代码。让我们深入探讨Box2D在Android...

    Box2D物理引擎实例工具类和文档

    8. **实例代码**:提供的实例工具类可以帮助开发者快速理解和应用Box2D的基本概念,通过查看和运行示例代码,可以更好地掌握引擎的用法。 9. **模拟与更新**:在每帧中,你需要调用World的Step方法来更新物理模拟。...

    Box2d 2.1.2 2D物理引擎源代码和Demo

    Box2D是一个开源的2D物理引擎,广泛用于游戏开发、模拟和教育领域。它的名称是"Box2D"的缩写,意为"二维物理盒",版本号2.1.2,意味着这是该引擎的某个特定稳定版本。Box2D由Erin Catto开发,它提供了一个强大的API...

    瘸腿蛤蟆笔记42-cocos2d-x-3.2 Box2d物理引擎Motor Joint代码

    Cocos2d-x是一个广泛使用的2D游戏开发框架,它支持多种物理引擎,其中包括Box2d。Box2d是一款功能强大的2D物理引擎,被许多游戏开发者所青睐。在Cocos2d-x 3.2版本中,开发者可以利用Box2d引擎来创建复杂的物理效果...

    Box2D 物理引擎 源代码

    总的来说,Box2D是一款功能强大、易于使用的2D物理引擎,它的源代码为开发者提供了深入学习和定制的机会,是游戏开发不可或缺的工具。无论是初学者还是经验丰富的程序员,都能从中受益,构建出更加真实、有趣的2D...

    android下box2d小demo

    综上所述,"android下box2d小demo"是一个Android应用,演示了如何使用Box2D引擎创建2D物理模拟。通过这个项目,你可以学习到如何在Android环境中集成Box2D,设置物理世界,创建和管理物理实体,以及处理用户输入和...

    android游戏物理引擎——重力弹力运动

    在Android平台上,常见的物理引擎有Box2D、JBox2D和AndEngine Physics Extension等,它们为开发者提供了丰富的物理模拟功能。 在描述中提到的小球落下又弹起的场景,这是通过重力和弹力两个关键物理概念实现的。...

    OPhone平台2D游戏引擎实现——物理引擎

    这里为了配合我们的引擎实现,选择通过Opengl ES来作为渲染部分,这部分就需要我们自己来实现,其实我们也可以不使用其图像渲染部分,因为我们主要是使用Box2d来做物理检测,稍后我们会通过一个实例游戏来介绍。...

    cpp-Box2DLite是一个小型2D物理引擎Lite版本更适合学习游戏物理

    Box2D-Lite是2D物理引擎Box2D的一个精简版,专为教育和学习游戏物理设计。这个轻量级的实现提供了基础的物理模拟功能,让开发者能够快速理解和应用2D物理原理到游戏场景中。在C++环境下,Box2D-Lite是一个理想的学习...

Global site tag (gtag.js) - Google Analytics