JBOX2D分析

近日在研究JBOX2D的游戏引擎,对于这个JBOX2D游戏本身的性能并不作为本文讨论的重点。本文纯属个人观点,非常希望能和一些志同道合的人探讨相同的问题。大家可以上网下JBOX2D的源代码~其实去看源代码~你会发现JBOX2D的源代码写的挺好,而且没有依赖于第三方的包,很多类都非常的原生,本质目的是为了提高jar在java项目中移植性。
首先先看一段代码:
AABB mAABB = null;
World mWorld = null;
Vec2 mGravity = new Vec2(0.0f, 10.0f);
private final static int RATE = 10;;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,WindowManager.LayoutParams. FLAG_FULLSCREEN);
        mAABB = new AABB();
        mAABB.upperBound.set(-100, -100);
        mAABB.lowerBound.set(100, 100);
        mWorld = new World(mAABB, mGravity, true);
    }

这个事基于Android开发的在BOX2D中对世界进行了抽象化,抽象成一个有边界和有重力的实体,为了避免在现实世界和虚拟世界中的单位不匹配,定义了比例尺:RATE 。
我们看看如何在Box2d中的世界中创建一个简单的实体。
一个物体在世界中存在在两个世界,一种在于它存在于这个物质世界,另外他也存在于我们的感官世界。对于整个世界来说物体相对于它只是一个质点,所以这个世界要关心的是它的质点,而对于我们的感官世界来说,物体是有形状,一个物体的形状大小基本可以决定他的质量,而质量相关的就是物体本身的密度属性。
BOX2D也采用了这种抽象:
首先定义这个物体的位置属性:
BodyDef bodyDef = new BodyDef();
    bodyDef.position.set(x/RATE, y/RATE);
这样我们就定义了这个物体在世界中质点属性,但是这个物体还未纳入一个世界的管理,BodyDef 是纯粹的javabean,职责非常本质。
接下来看看他的形状属性:
PolygonDef polygonDef = new PolygonDef();
polygonDef.density = 2.0f;
polygonDef.friction = 0.8f;//摩擦力系数
polygonDef.restitution = 0.3f;//回复力
可见我们探讨的两个物体的本质都有了定义。但是世界中管理的应该是两个物体的本质。为了将两个javabean组合在一起JBox2D中存在了Body这个类。
也就是Body将作为世界的管理的基本单元。
世界将调用Body createBody(BodyDef def)
将把这个body纳入世界队列的管理
返回的是一个没有任何形状的body。因此我们要为他指定一个形状,也就是我们上面定义的PolygonDef 多边形状然后。实际上在为你的body构造形状对象的时候,记录的并不是你的PolygonDef 本身。它被转换成一个
Shape s = Shape.create(def);的Shape对象。就被转换成为基本的图形元素
if (def.type == ShapeType.CIRCLE_SHAPE) {
            return new CircleShape(def);
        }
        else if (def.type == ShapeType.POLYGON_SHAPE) {
            return new PolygonShape(def);
  }
我们看一下PolygonShape这个类:
可以看到PolygonShape这个类里面存在有很多实用的方法
对于每一个形状都会有一个记录数,每创建一个形状都会让这个记录数+1。
Shape获得def传入的各种属性。对于多边形,它记录了多边形的各个点.
在shape中是纯粹的复制属性而不存在def的引用,这么做是有目的的,可以理解为shape是def的一个实例。
在Shape中将记录每个边的单位向量记录在m_normals[]数组中。在Shape中将做一层验证,保证图形是否有重复点,保证图形的逆时针。
并计算他的几何中心放入Vec2 m_centroid中。它主要是将多边形分成三角形计算每一个三角形的几何中心,然后将它们加在一起,然后除以它的总面积。
在shape中ahi用于计算它的边界存在于OBB这个对象中...OBB是计算这个形状的包围盒,因为采用OBB算法所以命名为OBB。以及计算它的边沿




你可能感兴趣的:(box2D)