JBox2D详解-目前网上最全.doc_第1页
JBox2D详解-目前网上最全.doc_第2页
JBox2D详解-目前网上最全.doc_第3页
JBox2D详解-目前网上最全.doc_第4页
JBox2D详解-目前网上最全.doc_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

10.2 2D的王者JBox2DJBox2D是开源的物理引擎Box2D的Java版本,可以直接用于Android。由于JBox2D的图形渲染使用的是Processing库,因此在Android平台上使用JBox2D时,图形渲染工作只能自行开发。该引擎能够根据开发人员设定的参数,如重力、密度、摩擦系数和弹性系数等,自动地进行2D刚体物理运动的全方位模拟。每种物理引擎都有其独特的概念,在学习开源的物理引擎时,首先需要弄明白的就是其基本概念。因此,本节主要为读者复习一下物理学中的一些基本概念,并介绍JBox2D中的一些常用类与概念。10.2.1 基本的物理学概念游戏是对真实世界的仿真,其中用到了许多物理学知识,如密度、质量、质心、摩擦力、扭矩以及碰撞(恢复)系数等。接下来,本小节将简要介绍用JBox2D开发游戏时经常用到的一些物理学概念。密度物理学中密度指的是单位体积的质量,符号为,常用单位为kg/m3。其是物质的一种基本特性,不随物体的质量、体积的改变而改变,同种物质的密度相同。质量质量指的是物体中所含物质的量,即物体惯性的大小,国际单位是kg。同一物体的质量通常是一个常量,不因高度、经度或者纬度的改变而变化。但是根据爱因斯坦的相对论,同一物体的质量会随着速度的变化而改变。只有运动接近光速才能感觉到这种变化,因此在游戏中一般不考虑速度对质量的影响。质心物体(或物体系)的质量中心,是研究物体(或物体系)机械运动的一个重要参考点。当作用力(或合力)通过该点时,物体只作移动而不发生转动;否则在发生移动的同时物体将绕该点转动。研究质心的运动时,可将物体的质量看作集中于质心。理论上,质心是对物体的质量分布用加权平均法求出的平均中心。摩擦力当两个互相接触的物体,如果要发生或者已经发生相对运动。就会在接触面上产生一种阻碍该相对运动的力,这种力就称之为摩擦力。其基本情况如图10-9所示。图10-9 摩擦力示意图提示 根据物体是否发生相对运动可以分为静摩擦力与滑动摩擦力,实际开发中可以进行简化,但若要模拟更加真实的效果就需要分别开发。扭矩扭矩在物理学中就是力矩的大小,等于力与力臂的乘积,国际单位是Nm(牛米)。在力臂不变的情况下,力越大,扭矩越大。基本情况如图10-10所示。恢复系数两物体碰撞后的总动能与碰撞前的总动能之间的比称之为恢复系数,其取值范围为01。如果恢复系数为 1,则碰撞为完全弹性碰撞,满足机械能守恒;如果恢复系数小于1并且大于0,则为非完全弹性碰撞,不满足机械能守恒,这种情况是最常见的;如果恢复系数为0,则为完全非弹性碰撞,两个物体会粘在一起。基本情况如图10-11所示。图10-10 扭矩示意图图10-11 各种碰撞情况说明 在图10-11中,两个小球的质量相等,小球的初速度V1大于V2。10.2.2 JBox2D中常用类的介绍(1)俗话说得好基础不牢,地动山摇。在学习新技术时,首先要学习的就是该技术的一些基本概念,因此本小节主要介绍JBox2D中一些必知必会的类。1Vec2类(二维向量)该类属于mon包,继承自java.lang.Object类,其对象用于表示一个二维向量或二维笛卡尔坐标。二维向量Vec2类的基本功能如图10-12所示。图10-12 二维向量示意图该类在JBox2D中的使用频率非常高,通常用于表示物体的位置、速度等,其构造器与常用方法及属性如表10-2所列。表10-2 构造器与主要方法方法、属性或构造器签名说 明类 型public Vec2(float x,float y)创建一个Vec2的对象,该对象表示X轴分量为x,Y轴分量为y的一个向量或坐标系中的(x,y)点构造器public static Vec2 abs(Vec2 a)求向量的绝对值方法public Vec2 add(Vec2 v)返回该向量与另一向量的和,并不改变其中的任何一个的值方法public Vec2 addLocal(Vec2 v)返回该向量与另一向量的和,并改变当前的向量方法public Vec2 clone()复制向量方法public float length()返回该向量的长度方法public float lengthSquared()返回该向量长度的平方方法public static Vec2 max(Vec2 a,Vec2 b)返回两个向量中最大的方法public static Vec2 min(Vec2 a,Vec2 b)返回两个向量中最小的方法public void set(float x,float y)设置向量的两个分量方法public void set(Vec2 v)设置当前向量为向量v方法public void setZero()将向量设置为0向量方法2AABB包围盒该类属于org.jbox2d.collision包,继承自java.lang.Object类,表示轴对齐的边界盒子。所谓的轴对齐是指,盒子左、右侧边界与Y轴平行,同时上、下侧边界与X轴平行,基本情况如图10-13所示。图10-13 轴对齐该类的构造器与常用方法及属性如表10-3所列。表10-3 构造器与常用方法方法、属性或构造器签名含 义类 型public AABB()创建AABB轴对齐的边界盒子对象构造器public Vec2 lowerBound此属性用于指定包围盒的左、上边界属性public Vec2 upperBound此属性用于指定包围盒的右、下边界属性public boolean isValid()检查AABB对象是否合法方法public boolean testOverlap(AABB box)检测两个AABB对象是否重叠(碰撞)方法提示 使用此类对象创建边界时,使用的度量单位为现实世界中的单位(m-米)。同时AABB应该永远大于等于物体实际所占区域。10.2.2 JBox2D中常用类的介绍(2)3BodyDef类(刚体描述)该类属于org.jbox2d.dynamics包,继承自java.lang.Object类,其对象用于存储刚体的一些描述性信息,主要是在创建刚体时调用。该类的构造器与常用方法及属性如表10-4所列。表10-4 构造器与常用方法方法、属性或构造器签名含 义类 型public BodyDef()创建BodyDef对象构造器public boolean allowSleep是否允许刚体休眠的标志位 属性public float angle该刚体在世界坐标系中的角度属性public boolean isBullet设置是不是时刻检测碰撞(一般为子弹类刚体服务)属性public boolean isSleeping表示刚体当前是否处于休眠状态的标志位属性public MassData massData刚体的质量属性public Vec2 position刚体的位置属性4World类(世界)该类属于org.jbox2d.dynamics包,继承自java.lang.Object类,表示的是物理世界。一个物理世界就是物体、形状和约束相互作用的集合。JBox2D 支持同时创建多个世界,但这通常是不必要的。要创建一个世界对象,首先需要创建一个世界的AABB包围盒,JBox2D使用AABB包围盒来加速碰撞检测。该类构造器与常用方法及属性如表10-5所列。表10-5 构造器与常用方法方法、属性或构造器签名含 义类 型public World(AABB worldAABB,Vec2 gravity,boolean doSleep)创建World类的对象worldAABB 整个世界的AABB包围盒gravity重力向量doSleep是否允许刚体休眠构造器public Body createBody(BodyDef def)根据给出的BodyDef对象创建刚体方法public Joint createJoint(JointDef def)根据给出的JointDef对象创建关节方法public void destroyBody(Body b)从世界中销毁刚体,如游戏中的物体爆炸后消失就可以采用其完成方法public void destroyJoint(Joint j)销毁关节,这个可能影响连接的刚体进行碰撞方法public int getBodyCount()得到刚体的数量方法public Body getBodyList()得到刚体的列表方法public Vec2 getGravity()得到重力向量方法public AABB getWorldAABB()得到世界的AABB包围盒对象方法public void setGravity(Vec2 gravity)设置重力向量方法public void step(float dt,int iterations)进行一轮迭代模拟dt模拟的频率iterations迭代次数。迭代越大,模拟越精确、同时性能越低方法 5ShapeDef类(形状描述)该类属于org.jbox2d.collision包,继承自java.lang.Object类,其对象用来存储形状的描述性信息。该类有两个子类,分别为CircleDef(圆形描述),PolygonDef(多边形描述),3个类的继承关系如图10-14所示。图10-14 ShapeDef类的继承树10.2.2 JBox2D中常用类的介绍(3)该类的基本属性如表10-6所列。表10-6 ShapeDef类属性属性签名含 义public float density密度,单位为kg/m2public float friction摩擦系数public float restitution弹性系数(碰撞恢复系数)public java.lang.Object userData用这个来存储自定义的用户数据6CircleDef类(圆形描述)该类属于org.jbox2d.collision包,继承自ShapeDef类,其对象用于存储圆形的一些描述性信息,如圆心坐标、半径等。该类的构造器及属性如表10-7所列。表10-7 CircleDef类构造器及属性构造器及属性签名含 义类 型public CircleDef()创建CircleDef对象构造器public float radius圆的半径属性public Vec2 localPosition圆心坐标属性7PolygonDef类(多边形描述)该类属于org.jbox2d.collision包,继承自ShapeDef类,其对象用于存储多边形的顶点信息。要特别注意的是,这里的多边形指的是凸多边形,并且在卷绕凸多边形顶点时,顺序是顺时针的。基本情况如图10-15所示。图10-15 凹凸多边形及卷绕顺序该类的构造器与主要方法如表10-8所列。表10-8 PolygonDef类构造器与常用方法构造器及方法签名含 义类 型public PolygonDef()创建PolygonDef对象构造器public void addVertex(Vec2 v)为该多边形添加一个顶点方法public void clearVertices()移除所有的顶点方法public int getVertexCount()得到顶点的数量方法续表构造器及方法签名含 义类 型public java.util.List getVertexList()得到所有顶点的集合方法public void setAsBox(float hx,float hy)把多边形设定为一个矩形的形状hx 宽度的一半hy 高度的一半方法8Body类(刚体)该类属于org.jbox2d.dynamics包,继承自java.lang.Object类,其对象表示一个刚体。在创建该类的对象时,不可以直接从构造器创建,必须通过World类对象的.createBody(BodyDef bd)方法创建。然后调用其createShape(ShapeDef sd)方法创建刚体对应的几何形状,再调用setMassFromShapes()方法计算出该刚体的质量。该类常用的方法如表10-9所列。表10-9 Body类的常用方法方法签名含 义public Shape createShape(ShapeDef def)创建一个几何形状,并将其添加进刚体中public void destroyShape(Shape s)销毁一个几何形状public float getAngle()获得角度(单位为弧度)public float getAngularVelocity()获得角速度public Vec2 getLinearVelocityFromWorldPoint (Vec2 worldPoint)获得此刚体质心的平移速度public float getMass()获得刚体的质量public Body getNext()获得列表中的下一个刚体public Vec2 getPosition()获得刚体定位点的位置public Shape getShapeList()获得刚体包含的几何形状的列表public World getWorld()获得刚体所属的世界对象public Vec2 getWorldCenter()获得刚体质心在世界坐标系的位置public boolean isSleeping()判断该刚体是不是活动的public boolean isStatic()判断该刚体是不是静止的public void setMassFromShapes()根据密度及几何形状自动计算该刚体的质量本小节对JBox2D中的一些常用类的基本原理与API进行了简要的介绍,详细的使用将在后继章节的具体案例中一一给出。10.3 球体撞击木块金字塔案例上一小节主要介绍了JBox2D的一些基本概念,但是只讲概念就相当于纸上谈兵-不切实际。而且考虑到大篇幅的概念介绍只会使得本章更显得枯燥,因此特意准备了几个小案例,以供参考。首先给出一个钢球撞击木块金字塔的案例。提示 由于本案例开发时使用了第三方的物理引擎JBox2D,因此需要在项目中添加相应的支持jar包jbox2d-2.0.1-library-only.jar。如果读者不清楚如何在Eclipse中为项目添加jar包,可以查阅相关资料,本书篇幅所限不再赘述。没有jar包的读者可以到JBox2D的官方网站下载并解压即可。10.3.1 案例运行效果本小节给出的是一个钢球撞击木块金字塔的案例。案例一旦开始运行,从屏幕上方有一只球按照一定的初速度加速下落,并撞击下方的金字塔。组成金字塔的木块被撞飞,其效果如图10-16、图10-17、图10-18及图10-19所示。图10-16 案例开始运行图10-17 开始碰撞图10-18 碰撞至中间图10-19 碰撞至最后说明 图10-15表示的是钢球开始撞击木块金字塔,图10-16为钢球继续向下碰撞时的效果图,图10-17为钢球碰撞至木块金字塔中间的效果图,图10-18为钢球碰撞至木块金字塔底层的效果图。另外,请读者注意,由于某些自制Android系统的2D绘制问题,案例运行时可能会出现砖块及其他形状空心的现象,这并不影响程序的正确性,读者可以刷机或修改绘图方式来解决。10.3.2 案例的基本框架结构介绍本案例之前,首先需要介绍本案例的框架结构,理解本案例的框架结构有助于读者对本案例的学习。本案例的框架结构如图10-20所示。MyBox2dActivity类为本案例的主控制类。案例开始运行时首先调用此类中的onCreate(Bundle savedInstanceState)方法,在该方法中主要是生成MyRectColor类与MyCircleColor类的对象,并存入到ArrayList集合中。最后跳转至GameView界面。Constant类为本案例的常量类。该类主要是声明屏幕与现实世界的比例、线程标志位、模拟频率及迭代次数,屏幕宽度以及屏幕高度。图10-20 案例基本框架结构MyBody类为自定义的抽象类,是所有自定义刚体的父类。此类中的成员变量为刚体(Body)与颜色,同时自定义了绘制图形的抽象方法。MyCircleColor类为自定义的圆形刚体类。此类继承自MyBody类,首先通过构造器初始化相应的成员变量,然后重写MyBody类中自定义的抽象方法。MyRectColor类为自定义的矩形刚体类。此类也是继承自MyBody类,与MyCircleColor类相似。首先通过构造器初始化相应的成员变量,然后重写MyBody类中自定义的抽象方法。Box2DUtil类为生成MyCircleColor类与MyRectColor类对象的工具类。该类的主要作用是创建圆形或者矩形刚体,然后创建MyCircleColor类与MyRectColor类对象,并返回。ColorUtil类是自定义的颜色工具类。其主要作用是在固定的颜色二维数组中,随机地选取其中的一组,作为其中某一个刚体的颜色。GameView类是案例要显示的界面。此类主要是创建画笔、获取画布以及开启刷帧线程,并绘制案例的场景。DrawThread类为本案例的线程类。主要是不断地刷新画布使得游戏场景时时更新。同时为了使JBox2D物理引擎起到实质作用,需要调用step(float dt,int iterations)方法。10.3.3 常量类-Constant该类为本案例中的常量类,主要作用是声明本案例中使用到的常量与变量,其代码如下。代码位置:见随书光盘中源代码/第10章/Box2DBHeap/src/com.bn.box2d.bheap目录下的Constant.java。1. 1 package com.bn.box2d.bheap; /声明包名 2. 2 public class Constant 3. 3 public static final float RATE = 10; /屏幕与现实世界的比例 4. 4 public static final boolean DRAW_THREAD_FLAG=true; /绘制线程工作标志位 5. 5 public static final float TIME_STEP = 2.0f/60.0f; /模拟的频率 6. 6 public static final int ITERA = 10; /迭代次数 7. 7 public static int SCREEN_WIDTH; /屏幕宽度 8. 8 public static int SCREEN_HEIGHT; /屏幕高度 9. 9 说明 该类主要声明的常量有RATE(屏幕与现实世界的比例)、DRAW_THREAD_ FLAG(线程标志位)、TIME_STEP(模拟频率)及ITERA(迭代次数),变量有SCREEN_WIDTH(屏幕宽度)及SCREEN_HEIGH(屏幕高度)。10.3.4 抽象类-MyBody该类为自定义的抽象类,是所有自定义刚体类的基类。由于JBox2D中的刚体类(Body)对象仅具有物理仿真计算的功能,并没有提供Android平台下的绘制功能,直接使用不是很方便。因此,这里定义了MyBody类对自定义刚体的绘制及JBox2D物理仿真对象(Body类对象)进行了封装,其代码如下。代码位置:见随书光盘中源代码/第10章/Box2DBHeap/src/com.bn.box2d.bheap目录下的MyBody.java。1. 1 package com.bn.box2d.bheap; /声明包名 2. 2 import org.jbox2d.dynamics.Body; /导入相关包 3. 3 import android.graphics.Canvas; 4. 4 import android.graphics.Paint; /导入相关包 5. 5 public abstract class MyBody /自定义刚体根类 6. 6 Body body; /JBox2D物理引擎中的刚体 7. 7 int color; /刚体的颜色 8. 8 public abstract void drawSelf(Canvas canvas,Paint paint); /绘制的方法 9. 9 提示 读者可能发现此类非常简单,只有两个成员变量及一个抽象方法。这是因为抽象基类中一般只有描述所有子类共性的内容,因此,一般都不复杂,具体不同的业务逻辑留待非抽象子类根据各自的需要实现。10.3.5 圆形刚体类-MyCircleColor上一小节主要介绍的是自定义的刚体抽象类MyBody,在本小节中主要介绍的是其子类MyCircleColor。该类的主要作用是对圆形刚体的功能进行封装,其代码如下。代码位置:见随书光盘中源代码/第10章/Box2DBHeap/src/com.bn.box2d.bheap目录下的MyCircleColor.java。1. 1 package com.bn.box2d.bheap; /声明包名 2. 2 import org.jbox2d.dynamics.Body; /导入相关包 3. 3 ./该处省略了部分导入相关类的代码,读者可以自行查阅随书光盘的源代码 4. 4 import static com.bn.box2d.bheap.Constant.*; /静态导入 5. 5 public class MyCircleColor extends MyBody /自定义的圆形类 6. 6 float radius; /圆形半径 7. 7 public MyCircleColor(Body body,float radius,int color) /构造器 8. 8 this.body=body; /初始化成员变量 9. 9 this.radius=radius; /初始化成员变量 10. 10 this.color=color; /初始化成员变量 11. 11 12. 12 public void drawSelf(Canvas canvas,Paint paint) /绘制方法 13. 13 paint.setColor(color&0x8CFFFFFF); /设置颜色 14. 14 float x=body.getPosition().x*RATE; /设置圆心X坐标 15. 15 float y=body.getPosition().y*RATE; /设置圆心Y坐标 16. 16 canvas.drawCircle(x, y, radius, paint); /绘制圆 17. 17 paint.setStyle(Paint.Style.STROKE); /设置画笔样式 18. 18 paint.setStrokeWidth(1); /设置画笔宽度 19. 19 paint.setColor(color); /设置颜色 20. 20 canvas.drawCircle(x, y, radius, paint); /绘制边 21. 21 paint.reset(); /恢复画笔设置 22. 22 23. 23 第7-11行为此类的构造器,其主要作用是初始化相关成员变量。第12-22行为此类的绘制逻辑。首先设置颜色,并计算出圆心位置,然后绘制圆形,接着设置画笔的样式和颜色为圆形绘制边框。最后恢复画笔的设置,以免影响后继的绘制。提示 由于MyRectColor类与该类结构相同,同样是继承自MyBody类,只是作用为对矩形刚体的封装。因此,在本书中就不再对其进行赘述,读者可自行查阅随书光盘中本案例的代码。10.3.6 生成刚体形状的工具类-Box2DUtil上一小节中介绍了自定义的圆形刚体类,可以看出其中有一个成员变量body是JBox2D中的刚体(Body)。由于创建Body的代码并不十分简单,因此,为了使用方便,本案例中开发了一个工具类Box2Dutil,它负责提供两个工厂方法,分别接收参数生成MyCircleColor类与MyRectColor类的对象。生成MyCircleColor类与MyRectColor类对象的方法分别为createCircle与createBox,其具体代码如下。代码位置:见随书光盘中源代码/第10章/Box2DBHeap/src/com.bn.box2d.bheap目录下的Box2DUtil.java。1. 1 package com.bn.box2d.bheap; /声明包 2. 2 import org.jbox2d.collision.CircleDef; /导入相关类 3. 3 ./该处省略了部分导入相关类的代码,读者可以自行查阅随书光盘的源代码 4. 4 import static com.bn.box2d.bheap.Constant.*; /静态导入 5. 5 public class Box2DUtil /生成刚体形状的工具类 6. 6 public static MyRectColor createBox( /创建矩形物体(颜色) 7. 7 float x, /x坐标 8. 8 float y, /y坐标 9. 9 float halfWidth, /半宽 10. 10 float halfHeight, /半高 11. 11 boolean isStatic, /是否为静止的 12. 12 World world, /世界 13. 13 int color) /颜色 14. 14 15. 15 PolygonDef shape = new PolygonDef(); /创建多边形描述对象 16. 16 if(isStatic) /判断isStatic是否为true 17. 17 shape.density = 0; /密度为0 18. 18 else 19. 19 shape.density = 1.0f; /密度为1.0f 20. 20 21. 21 shape.friction = 0.0f; /设置摩擦系数 22. 22 shape.restitution = 0.6f; /设置能量损失率 23. 23 shape.setAsBox(halfWidth/RATE, halfHeight/RATE); 24. 24 BodyDef bodyDef = new BodyDef(); /创建刚体描述对象 25. 25 bodyDef.position.set(x/RATE, y/RATE); /设置位置 26. 26 Body bodyTemp= world.createBody(bodyDef); /在世界中创建刚体 27. 27 bodyTemp.createShape(shape); /指定刚体形状 28. 28 bodyTemp.setMassFromShapes(); /设置物体质量 29. 29 return new MyRectColor(bodyTemp,halfWidth,halfHeight,color); 30. 30 31. 31 public static MyCircleColor createCircle( /创建圆形(颜色) 32. 32 float x, /x坐标 33. 33 float y, /y坐标 34. 34 float radius, /半径 35. 35 World world, /世界 36. 36 int color) /颜色 37. 37 CircleDef shape = new CircleDef(); /创建圆描述对象 38. 38 shape.density = 2; /设置密度 39. 39 shape.friction = 0.0f; /设置摩擦系数 40. 40 shape.restitution = 0.95f; /设置能量损失率 41. 41 shape.radius = radius/RATE; /设置半径 42. 42 BodyDef bodyDef = new BodyDef(); /创建刚体描述对象 43. 43 bodyDef.position.set(x/RATE, y/RATE); /设置位置 44. 44 Body bodyTemp = world.createBody(bodyDef); /在世界中创建刚体 45. 45 bodyTemp.createShape(shape); /指定刚体形状 46. 46 bodyTemp.setMassFromShapes(); 47. 47 return new MyCircleColor(bodyTemp,radius,color); /返回MyCircleColor对象 48. 48 49. 49 第7-14行是createBox方法的参数,主要有矩形的中心点坐标、矩形的半宽和半高、是否静止标志、刚体所属World类对象及颜色。第15-23行为创建多边形描述对象,同时设置密度、摩擦系数以及能量损失率,并创建包围盒。第24-25行为创建刚体描述对象并设置其具体位置。第26-28行为创建Body(刚体)类对象的具体方法。在创建刚体对象时不可以直接使用构造器,必须通过createBody(BodyDef bd)创建Body对象,然后调用createShape(ShapeDef sd)为刚体指定形状,最后需要通过调用setMassFromShapes()方法为刚体指定质量。提示 第31-48行为创建圆形刚体的方法,该方法与6-30行的创建矩形刚体相似。在这里就不再对该方法进行赘述,读者在看该方法时可以参考创建矩形刚体的方法。10.3.7 颜色工具类-ColorUtil细心的读者会发现,本案例每次运行后,小球和木块的颜色与上一次运行均不相同。这种效果是基于本小节将要介绍的颜色工具类-ColorUtil来实现的,其代码如下。代码位置:见随书光盘中源代码/第10章/Box2DBHeap/src/com.bn.box2d.bheap目录下的ColorUtil.java。1. 1 package com.bn.box2d.bheap; /声明包 2. 2 public class ColorUtil /创建颜色类 3. 3 static int result= /创建颜色数组 4. 4 ./该处省略了该数组的具体数据,读者可自行查阅随书光盘中源代码 5. 5 ; 6. 6 public static int getColor(int index) /创建静态获得颜色的方法 7. 7 int rgb=resultindex%result.length; /创建int类型的数组 8. 8 int result=0xff000000; /声明常量 9. 9 resultresult=result|(rgb016); /红色色彩通道左移16位并入结果 10. 10 resultresult=result|(rgb18); /绿色色彩通道左移8位并入结果 11. 11 resultresult=result|(rgb2); /蓝色色彩通道并入结果 12. 12 return result; /返回结果 13. 13 第3-5行表示的是一个二维数组,该数组中存储了许多组自定义颜色的(RGB)值。第6-13行为获取颜色的方法,调用者传入颜色索引号index,此方法将RGB 3个色彩通道的值组装成ARGB顺序32比特颜色整数返回。10.3.8 主控制类-MyBox2dActivity(1)上一小节介绍的是颜色工具类,在本节中主要介绍本案例的主控制类的框架。此类的主要任务为,初始化整个物理世界中的各个物体(包括球和组成金字塔的所有木块),并将物体放入列表中,其代码如下。代码位置:见随书光盘中源代码/第10章/Box2DBHeap/src/com.bn.box2d.bheap目录下的MyBox2dActivity.java。1. 1 package com.bn.box2d.bheap; /声明包 2. 2 import java.util.ArrayList; /导入相关类 3. 3 ./该处省略了部分导入相关类的代码,读者可以自行查阅随书光盘的源代码 4. 4 import static com.bn.box2d.bheap.Constant.*; /静态导入 5. 5 public class MyBox2dActivity extends Activity /创建继承Activity的类 6. 6 AABB worldAABB; /创建 一个管理碰撞的世界 7. 7 World world; /成员变量world 8. 8 Random random=new Random(); /创建生成伪随机数的类 9. 9 ArrayList bl=new ArrayList(); /存储物体列表的集合 10. 10 public void onCreat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论