`
ictch
  • 浏览: 134817 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

物理引擎-Box2d简介

阅读更多

我们介绍了常见的各种游戏特效的实现,你现在可以很轻松的实现各种游戏中所需要的特效,但是,你可能已经意识到了,我们的游戏一般都需要进行碰撞检测,比如前面的火柴棍小人,我们需要检测子弹和敌人之间的碰撞;碰撞检测通常是游戏开发的难点,作为引擎必然少不了碰撞检测部分,这里我们还是按照cocos2d的构架,使用Box2d作为物理引擎,下面我们将通过在Ophone平台实现一个小游戏,来对Box2d物理引擎进行学习。

Box2d

Box2D是一个用于游戏的2D刚体仿真库,它可以使物体的运动更加真实,让游戏场景看起来更具交互性。2D物理引擎能增强游戏世界中物体如多边形(砖块,三角形,多边形)的动作的真实感从而提高游戏质量。该引擎通过用户设定的参数如重力,密度,摩擦,弹性等参数计算碰撞,角度,力和动力等。这些计算需要大量的数学,物理等知识,如果有兴趣也可以下载其源码来研究。
Box2d同时也提供了各种语言环境的实现,由于Ophone平台使用JAVA作为变成语言,所以我们将选择使用Box2d的java版JBox2d,这也将产生一个问题,JBox2D是用processing库来处理图像显示,所以Ophone平台上则不适用,在Ophone平台上的图像渲染主要包括两种:Canvas和Opengl ES,因此我们可以任选其中一种,这里为了配合我们的引擎实现,选择通过Opengl ES来作为渲染部分,这部分就需要我们自己来实现,其实我们也可以不使用其图像渲染部分,因为我们主要是使用Box2d来做物理检测,稍后我们会通过一个实例游戏来介绍。
另外,比较优秀的2D物理引擎还有Chipmunk,对于谁好谁坏,我们这里不去评价,如果要使用Chipmunk作为物理引擎会比Box2d稍微苦难一些,因为Chipmunk目前没有Java版本,所以只能通过JNI方式来使用,这就需要使用NDK来开发原生的C程序,使用C语言来做,效率要高很多,但是开发,调试的难度也将增加,有机会我们将可以介绍如何使用NDK来编写C程序,并同时整合Chipmunk物理引擎。
这里只是我们对Box2d的一个简单介绍,让大家明白其用处,关于更多详细信息,大家可以参考其官方网站http://www.box2d.org/,图12-1则是cocs2d中演示的Box2d物理引擎效果,学完这部分内容,你也可以很轻松将其运行在Ophone平台上。

点击浏览下一页

图12-1中这每个方块都具有重力,摩擦力,碰撞检测规则,他们都处于同一个世界场景中,不必眼红iPhone开发者,下面就给大家看一下,我们在Ophone平台提供的示例物理小游戏。
在学习使用Box2D引擎之前,我们需要了解一下一些常用的概念:
刚体(rigid body)
一块十分坚硬的物质,它上面的任何两点之间的距离都是完全不变的。它们就像钻石那样坚硬。我们用物体(body)来代替刚体。
形状(shape)
一块严格依附于物体(body)的 2D 碰撞几何结构(collision geometry)。形状具有摩擦(friction)和恢复(restitution)的材料性质。
约束(constraint)
一个约束(constraint)就是消除物体自由度的物理连接。在 2D 中,一个物体有 3 个自由度。如果我们把一个物体钉在墙上(像摆锤那样),那我们就把它约束到了墙上。这样,此物体就只能绕着这个钉子旋转,所以这个约束消除了它 2 个自由度。
接触约束(contact constraint)
一个防止刚体穿透,以及用于模拟摩擦(friction)和恢复(restitution)的特殊约束。你永远都不必创建一个接触约束,它们会自动被 Box2D 创建。
关节(joint)
它是一种用于把两个或多个物体固定到一起的约束。Box2D 支持的关节类型有:旋转,棱柱,距离等等。关节可以支持限制(limits)和马达(motors)。
关节限制(joint limit)
一个关节限制(joint limit)限定了一个关节的运动范围。例如人类的胳膊肘只能做某一范围角度的运动。
关节马达(joint motor)
一个关节马达能依照关节的自由度来驱动所连接的物体。例如,你可以使用一个马达来驱动一个肘的旋转。
世界(world)
一个物理世界就是物体,形状和约束相互作用的集合。Box2D 支持创建多个世界,但这通常是不必要的。
这里先给大家介绍就是让大家明白Box2d包括哪些内容,稍后对框架的介绍时就能更加容易理解,当然对于这些具体的功能,我们会在后面跟着示例代码一起学习。

Ophone Box2d

首先分析一下我们在Ophone平台上的Box2dDemo需要实现什么功能,首先我们将整个屏幕构建成一个盒子,然后再盒子中设置各种障碍,当我们触摸屏幕上任意位置时,就释放一个当前选择的物体,然后该物体将受到重力等因素的影响开始运动,直到最后静止下来。运行效果如图12-2所示。

点击浏览下一页

屏幕中间的长条则是我们设置的障碍,而圆形和矩形都是我们在点击屏幕时要释放的物体,前面我们说过,JBox2d中的图形部分在Ophone中不能用,所以我们会专门介绍如何通过Opengl ES来对图形图像进行渲染,另外,该示例中的这些物体都是通过纹理映射来将图片映射到四边形上。为了大家能掌握图形系统相关内容,我们还实现了一个功能,玩家可以自己设置障碍,只需要点击Menu中,选择"编辑模式"就可以进入障碍编辑状态,如图12-3所似。

点击浏览下一页

当障碍编辑完成之后再次选择编辑模式,则恢复到游戏中,此时我们所编辑的这些障碍都会正常的运行。当然该过程我们并没有使用引擎来完成,目的在于让大家更清楚渲染的原理,以及代码能够更多的重用,也就是说,大家可以直接拷贝代码到需要的游戏中去即可。同时大家也能掌握很多Opengl ES的相关知识。

Ophone平台如何使用JBox2d

要使用JBox2d我们首先需要获得其源码或者jar包,这个就不用多说了,知道其官方网站下载即可,这里我们下载了一个完整版本jbox2d-2.0.1-full.jar,让后将其放入我们所建立OphoneBox2d工程的lib文件夹下,JBox2d中大致包含了如图12-4所示的一些包:

 

图12-4 JBox2d结构图

 

其中org.jbox2d.collision比较重要,主要负责处理碰撞相关,包括对一些多边形的实现,这里所说的多边形主要是一些数据,比如多边形的位置,大小,重力,形状,质量等属性;org.jbox2d.common包主要用来设置一些全局的属性(Setting.java),调试时所使用的颜色(Color3f.java),以及其他的一些数学相关的内容,因为我们说了Box2d他主要不是来做渲染的,但是有时候我们需要知道所设置的这些物体是否正确,进行调试,就需要绘制这些简单的图形,并显示出来,供我们调试;org.jbox2d.dynamics包主要负责动力学相关的内容,下面是常见的功能包描述。
org.jbox2d.collision包
AABB:AABB坐标
OBB:OBB坐标
ContactID:接触ID
ContactPoint:接触点
ManifoldPoint:繁殖点
Segment:线段
Shape:外形基类
ShapeDef:外形定义基类
CircleDef:圆外形定义
CircleShape:圆外形
FilterData:碰撞过滤器
MassData:质量运算器
PolygonDef:多边开定义
PolygonShape:凸多边形
org.jbox2d.common包
Color3f:调试绘图颜色
Settings:全局设置
Mat22:2*2 矩阵
Sweep:碰撞描述
Vec2:向量(x ,y)
XForm:坐标转换,平移或旋转
标准的版本中还会存在Mat33表示3*3的矩阵和Vec3向量(x,y,z),该java版本中没有出现这些。
org.jbox2d.dynamics包
Body:刚体或叫物体
BodyDef:刚体定义
BoundaryListener:世界边界侦听
ContactFilter:继承这个类用来获取过滤碰撞
ContactListener:继承这个类用来获取碰撞结果
DebugDraw:调试绘图,用于调试
DestructionListener:关节或外形销毁时处理方法
World:物理世界
org.jbox2d.dynamics.contacts
Contact:管理两个外形接触
ContactEdge:接触边用来连接多个物体和接触到一个接触表
ContactResult:记录接触结果
org.jbox2d.dynamics.Joints
DistanceJoint:距离校正器
DistanceJointDef:距离连接定义
GearJoint:齿轮
GearJointDef:齿轮连接定义
Joint:连接基类
JointDef:连接定义基类
JointEdge:用于组合刚体或连接到一起.刚体相当于节点,而连接相当于边
MouseJoint:鼠标连接
MouseJointDef:鼠标连接定义
PrismaticJoint:棱柱连接
PrismaticJointDef:棱柱连接定义
PulleyJoint:滑轮连接
PulleyJointDef:滑轮连接定义
RevoluteJoint:旋转连接
RevoluteJointDef:旋转连接定义
org.jbox2d.testbed:主要是一些用来测试的程序


添加JBox2d到Ophone项目中
要在工程中使用JBox2d库,需要将JBox2d添加到工程中,添加方法如下:
右键单击工程,选择"Properties",进入项目Properties界面。
选择"Java Build Path",选择"Libraries"选项卡。
在点击"Add Jars..."按钮,添加Jar。
选择当前工程中我们之前放入lib文件夹中的jbox2d-2.0.1-full.jar文件,如图12-5所示,单击"确定"按钮即可。

点击浏览下一页

OphoneBox2d框架

现在工程的结构展开应该如图12-6所示。

点击浏览下一页

其中实现该工程的文件如下:
Box2dTest:工程Activity,入口
GameGLSurfaceView:游戏GLSurfaceView
GLRenderer:Opengl es渲染器
DrawObject:使用Opengl ES来绘制常用图形(矩形,圆形)
PhysicsWorld:物理世界场景

OphoneBox2d实现

开始分析代码之前,我们先确定一下需要准备的资源图片,从图12-2所示,我们可以看出,多少需要一个矩形和一个圆形的图片(当然也可直接指定颜色绘制矩形和圆形),这里我们将使用图片来进行纹理映射,该工程所需要的纹理图片如图12-7所示。

点击浏览下一页

Box2dTest实现

该类继承自Activity,将作为本程序的入口,授予我们是通过Opengl ES来渲染的,所以构建需要构建一个GLSurfaceView对象作为Opengl ES的窗口,然后通过setContentView函数来设置显示该窗口视图。然后分别在onPause和onResume函数中调用GLSurfaceView类的GLSurfaceView。当然这也是所有Opengl ES程序的渲染基础框架,所有的Opengl ES程序窗口都由GLSurfaceView来实现。具体实现入代码清单12-1所示。
代码清单12-1:Box2dTest.java


复制到剪贴板  Java代码
public class Box2dTest extends Activity {    private GLSurfaceView mGLView;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    //构建GLSurfaceView视图    mGLView = new GameGLSurfaceView(this);    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);    //设置GLSurfaceView视图    setContentView(mGLView);    }    @Override    protected void onPause() {    super.onPause();    mGLView.onPause();    }    @Override    protected void onResume() {    super.onResume();    mGLView.onResume();    }    //创建按钮    public boolean onCreateOptionsMenu(Menu menu) {    menu.add(Menu.NONE, 1, Menu.NONE, "编辑模式");    menu.add(Menu.NONE, 2, Menu.NONE, "选择模型");    return true;    }    //按钮事件处理    public boolean onOptionsItemSelected(MenuItem item) {    switch (item.getItemId()) {    case 1:    //切换编辑模式    ((GameGLSurfaceView) mGLView).toggleEdit();    return true;    case 2:    //选择模型    ((GameGLSurfaceView) mGLView).toggleModel();    return true;    }    return false;    }   }     

前面我们说了,可以通过Menu来切换模式和选择模型,因此我们在onCreateOptionsMenu中添加了两个菜单选项,其中"编辑模式"用来切换编辑状态和游戏状态,"选择模型"则用于选择我们触摸屏幕时所释放的模型,这里主要包括矩形和圆形,因此在菜单事件处理函数onOptionsItemSelected中,我们分别对两个菜单选项进行了处理,具体实现位于GameGLSurfaceView中。

GameGLSurfaceView实现

要实现一个用于显示Opengl ES窗口程序的视图,Ophone为我们提供了GLSurfaceView类,因此我们的GameGLSurfaceView类可以继承自GLSurfaceView很轻松的实现Opengl ES视图,该视图中有一个重要的部分,那就是Renderer,每一个Opengl ES窗口视图都需要一个渲染器来负责渲染。本例中的渲染器GLRenderer直接通过继承自Renderer来实现,GLSurfaceView中可以通过setRenderer来设置一个自定义的渲染器。具体实现入代码清单12-2所示。
代码清单12-2:GLSurfaceView.java


复制到剪贴板  Java代码
public class GameGLSurfaceView extends GLSurfaceView {    GLRenderer mRenderer;    public GameGLSurfaceView(Context context) {    super(context);    mRenderer = new GLRenderer(context);    setRenderer(mRenderer);    }    public void toggleEdit() {    mRenderer.toggleEdit();    }    public void toggleModel() {    mRenderer.switchModel();    }    public boolean onTouchEvent(final MotionEvent event) {    mRenderer.setSize(this.getWidth(), this.getHeight());    //线程通信    queueEvent(new Runnable() {    public void run() {    mRenderer.touchEvent(event.getX(), event.getY(),    event.getAction());    }    });    // sleep    try {    Thread.sleep(20);    } catch (InterruptedException e) {    e.printStackTrace();    }    return true;    }   }     

该窗口类的实现非常简单,基本上将所有需要处理的情况都转交给了Renderer,这里一个需要值得注意的地方,我们在 GameGLSurfaceView.onTouchEvent()中使用了queueEvent()方法。queueEvent()主要用于在UI线程和渲染线程(Renderer)间通信。当然也可以用其他的Java线程通信技术, 如synchronized方法,AsyncTask,Handler等,但queueEvent是最简单的线程通信方法。另外Android中View的线程通信还可以使用postInvalidate()函数来实现重绘操作。

总结

本文主要介绍了开源2D物理引擎Box2d的一些功能特征,以及如何在Ophone平台上使用Box2d的java版JBox2d;同时我们完成了使用该物理引擎实现的小游戏的框架,接下来我们就将通过完整实现该游戏的过程来学习使用JBox2d作为游戏开发中的物理引擎部分,同时大家可以考虑如何使用JNI来使用Box2d开发原生程序,加油哦,下一篇文章我们就将做出一个物理效果很酷的游戏来了。由于分享经验的心情急切,难免会出现一些疏忽或错误,还望不吝赐教!

分享到:
评论
1 楼 allenny 2011-11-27  
明明就是Android嘛,非要说是OPhone,太明显了哦

相关推荐

    Go-Box2D.go-是Box2D的一个Go移植

    Box2D是一个知名的开源2D物理引擎,最初由Ernest Pazera用C++编写,广泛应用于游戏开发领域,为开发者提供了模拟现实世界物理效果的能力,如重力、碰撞检测、摩擦力等。Go-Box2D是Box2D引擎的一个移植版本,专为Go...

    generic-box2d-plist

    《cocos2d-x与Box2D物理引擎的适配:深入理解“generic-box2d-plist”》 在游戏开发领域,cocos2d-x是一个广泛应用的2D游戏引擎,而Box2D则是一个强大的物理模拟库。两者结合,为开发者提供了构建具有真实物理效果...

    PhysicsEditor-Cocos2d-x-Box2d-master.zip_box2D_cocos2d_cocos2d x

    在"PhysicsEditor-Cocos2d-x-Box2d-master"这个项目中,包含了整合Cocos2d-x与Box2D的示例代码和资源,可以帮助开发者快速理解和实践两者之间的交互。项目中可能包括了如下的文件结构: 1. 示例场景文件(.cpp和.h...

    box2d物理引擎cocos2d

    Box2D是一个开源的2D物理引擎,广泛用于游戏开发,尤其在Cocos2d这样的2D游戏引擎中。Cocos2d是一个流行的跨平台的游戏开发框架,它提供了丰富的功能和工具,使得开发者能够轻松创建各种2D游戏。在本案例中,我们...

    qml-box2d:Box2D QML插件

    qml-box2d是一个基于Qt框架的QML插件,它为开发者提供了在QML中集成Box2D物理引擎的能力。Box2D是一个广泛使用的2D物理模拟库,它允许游戏和应用开发者创建复杂的物理交互场景,如重力、碰撞检测和刚体动态。通过将...

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

    【瘸腿蛤蟆笔记42-cocos2d-x-3.2 Box2d物理引擎Motor Joint代码】 在游戏开发中,物理引擎是一个重要的组成部分,它能够帮助开发者模拟真实世界中的物理现象,使得游戏中的物体运动更加逼真。Cocos2d-x是一个广泛...

    cocos2d-x box2d 物理引擎

    《cocos2d-x与Box2D:构建基础物理引擎》 在游戏开发领域,物理引擎扮演着至关重要的角色,它赋予游戏中的对象以真实世界中的运动规律,从而增加游戏的真实感和趣味性。cocos2d-x是一个流行的开源2D游戏开发框架,...

    HGE-Box2d.rar_box2D_hge

    Box2D是一个开源的2D物理引擎,由Ernesto Posse开发,广泛应用于游戏开发,尤其是使用C++的游戏。HGE(Hippie Game Engine)则是一个小巧但功能强大的2D游戏开发框架,它提供了丰富的图形、音频、输入处理等功能,让...

    瘸腿蛤蟆笔记38-cocos2d-x-3.2 Box2d物理引擎Ray-cast代码

    《瘸腿蛤蟆笔记38-cocos2d-x-3.2 Box2d物理引擎Ray-cast代码》 本文将深入探讨Cocos2d-x 3.2版本中Box2D物理引擎的Ray-cast(射线检测)功能。Box2D是一款广泛应用于2D游戏开发的开源物理引擎,它提供了强大的物理...

    cpp-Box2D是一个2D游戏的物理引擎

    Box2D是一个广泛应用于2D游戏开发的开源物理引擎,主要由Erin Catto开发,用C++编写,为开发者提供了模拟现实世界物理效果的能力,如重力、碰撞检测、摩擦力和弹力等。这个引擎被众多游戏开发者采用,因为它简化了...

    IOS应用源码——YannickL-Box2D-Examples-63f9424.rar

    本文将深入探讨iOS应用开发中的一个关键组件——YannickL-Box2D-Examples-63f9424,这是一个基于Box2D物理引擎的开源项目。Box2D是一款广泛使用的2D物理模拟库,为游戏开发者和移动应用开发者提供了强大的工具,以...

    Cocos2d-x教程视频Cocos2d-x功能扩展-Cocos2d-x Box2d物理引擎实战开发

    Cocos2d-x教程视频Cocos2d-x功能扩展-Cocos2d-x Box2d物理引擎实战开发提取方式是百度网盘分享地址

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

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

    物理引擎Box2D 中文教程

    ### 物理引擎Box2D 中文教程 #### 1. 导言 **1.1 关于** Box2D 是一款专为游戏设计而打造的2D刚体仿真库。该库允许开发者在游戏中实现更加真实可信的物体运动效果,从而增加游戏的互动性和沉浸感。从游戏开发者的...

    ios-Box2D.zip

    Box2D是一个开源的2D物理引擎,广泛用于游戏开发,特别是移动平台如iOS上的游戏。这个名为"ios-Box2D.zip"的压缩包很可能包含了一个完整的iOS游戏项目,利用Box2D来实现复杂的物理效果,如碰撞检测、重力模拟等。接...

    瘸腿蛤蟆笔记39-cocos2d-x-3.2 Box2d物理引擎自由落体代码

    在本篇中,我们将深入探讨使用Cocos2d-x 3.2框架集成Box2D物理引擎实现自由落体效果的编程技术。Cocos2d-x是一个广泛使用的开源游戏开发框架,它支持多种平台,包括iOS、Android以及桌面系统。Box2D是一个强大的2D...

    iOS游戏应用源代码——YannickL-Box2D-Examples-63f9424.zip

    通过深入研究YannickL-Box2D-Examples-63f9424.zip的源代码,开发者不仅可以提升对Box2D物理引擎的理解,还能学习到iOS游戏开发的最佳实践,从而提高自己的开发技能。在实践中不断探索和学习,是成长为优秀iOS游戏...

    box2d物理引擎和资料

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

    qt-box2d-vs2008-test

    【标题】"qt-box2D-vs2008-test"是一个项目名称,表明这是一个使用Qt 4.7.1和Box2D V2.1.2库,在Visual Studio 2008环境下编译和运行的示例。Box2D是一个流行的游戏物理引擎,它允许开发者创建具有真实感的2D物理...

    HT for Web - Box2d

    一直在找苦苦寻找一个Box2D的物理引擎javascript整合例子,发现 http://www.hightopo.com/blog/275.html 这篇文章的例子效果非常棒,通过HT for Web的3D引擎直观的呈现Box2D物理碰撞的实时运行效果,这么强大的3D...

Global site tag (gtag.js) - Google Analytics