手持终端
Eclipse平台下Android开发环境的搭建
PhoneGap配置到Eclipse开发环境
使用PhoneGap开发Android应用程序
PhoneGap3.0以上版本配置到Eclipse开发环境
使用PhoneGap3.0版本开发Android应用程序
PhoneGap3.0的第三方Android插件
Cordova配置到Android Studio开发环境
Android系统基本架构
Android的字符串颜色图片样式
Android的常用控件及菜单
Android的消息提示及传递
Android系统的组件通信
Android系统的Service
Android的广播消息接收
Android的数据存储与访问
Android系统的网络应用
Android图形图像处理
Android的Fragment框架
Android系统的并发编程
Java源文件结构与保留字
Java语言的数据类型与变量
Java的运算符与流程控制
Java语言的数组及操作
Java面向对象编程
Java的常用类
Android开发常用工具及命令
Android应用程序权限管理
Android系统提供的R类内置资源
Android系统的控件类及其方法
Android系统的菜单类及其方法
Android系统的对话框
Android应用程序模型及组件
Android的绘图类及方法
Android系统的动画效果
Android的数据库操作
Android的多媒体功能
Android系统照相机的使用
Android的文本朗读TTS
获取Android系统信息
Android系统的电话操作
Android系统的定位
Android系统的传感器
JBox2D是开源的2D物理引擎,能够根据开发人员设定的参数,如重力、密度、摩擦系数和弹性系数等,自动进行2D刚体物理运动的模拟。JBox2D中有很多常用的类。
1. 二维向量Vec2类:
Vec2类表示二维向量,它是由两个float类型的数组成,支持+=、-=和*=操作符。Vec2在JBox2D中使用频率非常高,通常用于表示物体的位置、速度等。Vec2的属性有:
属性 |
含义 |
float x |
表示向量的x轴分量或坐标系中的x坐标值 |
float y |
表示向量的y轴分量或坐标系中的y坐标值 |
Vec2的构造器为:
构造器 |
含义 |
Vec2() |
创建Vec2类对象 |
Vec2(float x, float y) |
创建Vec2类对象,x/y表示向量的x/y轴分量 |
Vec2的方法有:
方法 |
含义 |
void setZero() |
将向量设置为0向量 |
Vec2 set(float x, float y) |
设置两个分量值 |
float length() |
计算向量的长度 |
float lengthSquared() |
计算向量长度的平方 |
float normalize() |
将此向量转化为单位向量 |
Vec2 skew() |
计算向量的垂直向量,x分量为原向量的-y,y分量为原向量的x值 |
boolean isValid() |
检测向量的数据是否合法 |
2. 包围盒AABB类:
该类表示轴对称的包围盒,也就是边界盒子。轴对齐是指左、右边界与y轴平行,同时上、下侧边界与x轴平行,其主要功能为加速碰撞检测,所以包围盒应大于等于物体实际所占的区域。包围盒的属性有:
属性 |
含义 |
Vec2 lowerBound |
表示包围盒的左下角顶点 |
Vec2 upperBound |
表示包围盒的右上角顶点 |
包围盒的常用方法有:
方法 |
含义 |
Vec2 getCenter() |
计算包围盒的中心点坐标 |
Vec2 getExtents() |
计算出从包围盒中心点指向包围盒右上角的向量 |
float getPerimeter() |
计算包围盒的周长 |
boolean isValid() |
判断包围盒的数据是否合法 |
3. 刚体描述BodyDef类:
该类主要用于存储一些刚体的属性信息,在创建刚体时是通过该类的实例给出刚体的相关属性信息,主要包括刚体位置坐标、线速度值、角速度值、线性阻尼、角度阻尼等。
属性 |
含义 |
BodyType type |
表示刚体的类型,默认值是静态staticBody |
Vec2 position |
表示刚体位置的坐标轴,默认值是Vec2(0.0f, 0.0f) |
float angle |
表示姿态,弧度值,默认值是0.0f |
Vec2 linearVelocity |
表示线速度值,默认值是Vec2(0.0f, 0.0f) |
float angularVelocity |
表示角速度值,默认值是0.0f |
float linearDamping |
表示线性阻尼值,默认值是0.0f |
float angularDamping |
表示角度阻尼值,默认值是0.0f |
boolean allowSleep |
表示是否允许休眠,默认值是true |
boolean awake |
表示是否被唤醒,默认值是true |
boolean fixedRotation |
表示是否锁定旋转,默认值是false |
boolean bullet |
表示刚体是否充当类似子弹等运行速度很快的物体,默认false |
boolean active |
表示是否被激活,默认值是true |
float gravityScale |
表示加在刚体上的重力值系数,默认值是1.0f |
Object userData |
用来存储用户数据,默认值NULL |
BodyDef类的构造器为:
BodyDef() |
用于创建刚体描述对象 |
BodyDef的刚体类型有3种,分别是静态物体staticBody、动态物体dynamicBody和不受重力影响匀速直线运动的物体kinematicBody。
4. 世界World类:
该类表示物理世界,物理世界就是物体、形状和约束相互作用的集合,可以在物理世界中创建或删除所需的刚体或关节以实现所需的物理模拟。要创建物理世界,必须给出其重力向量。
物理世界的构造器为:
World(Vec2 gravity) |
创建World对象,gravity表示要设置的重力向量 |
World类的常用方法有:
方法 |
含义 |
Body createBody(BodyDef def) |
创建刚体,def表示对应刚体描述类的引用 |
void destroyBody(Body body) |
删除刚体,body表示要删除刚体对象的引用 |
Joint createJoint(JointDef def) |
创建一个关节,def表示对应关节描述类的引用 |
void destroyJoint(Joint joint) |
删除关节,joint表示要删除关节对象的引用 |
Body getBodyList() |
获取刚体的列表,返回值为刚体列表第一个元素的引用 |
Joint getJointList() |
获取关节的列表,返回值为关节列表第一个元素的引用 |
Contact getContactList() |
获取碰撞的列表,返回值为碰撞列表第一个元素的引用 |
int getProxyCount() |
获取代理的数量,返回值为获取的代理数量值 |
int getBodyCount() |
获取刚体的数量,返回值为获取的刚体数量值 |
int getJointCount() |
获取关节的数量,返回值为获取的关节数量值 |
int getContactCount() |
获取碰撞的数量,返回值为获取的碰撞数量值 |
int getTreeHeight() |
获取嵌入树的高度,返回值为获取的嵌入树的高度值 |
int getTreeBalance() |
获取嵌入树的平衡值,返回值为获取的嵌入树的平衡值 |
int getTreeQuality() |
获取嵌入树的质量,返回值为获取的嵌入树的质量值 |
void setGravity(Vec2 gravity) |
设置物理世界的重力向量 |
Vec2 getGravity() |
获取物理世界的重力向量 |
Profile getProfile() |
获取当前配置 |
void step ( float timeStep, int velocityIterations, int position Iterations) |
进行一轮迭代模拟,timeStep为模拟的时间步进,velocity Iterations为速度迭代次数,positionIterations为位置迭代次数 |
World类的其他方法还有:
方法 |
含义 |
void setDestructionListener ( Destruction Listener listener) |
注册摧毁监听器 |
void setContactFilter(ContactFilter filter) |
注册碰撞过滤器 |
void setContactListener(ContactListener listener) |
注册碰撞监听器 |
void clearForces() |
清除作用力 |
void setAllowSleeping(boolean flag) |
开启/禁用物体休眠,flag为ture表示开启,否则表示禁用 |
boolean getAllowSleeping() |
查看是否开启物体休眠,若开启了则返回true |
void setWarmStarting(boolean flag) |
开启/禁用用于测试的热启动,flag为ture表示开启 |
boolean getWarmStarting() |
查看是否开启了用于测试的热启动,若开启了则返回true |
void setContinuousPhysics(boolean flag) |
开启/禁用连续物理模拟,flag为ture表示开启 |
boolean getContinuousPhysics() |
查看是否开启了连续物理模拟,若开启了则返回true |
void setSubStepping(boolean flag) |
开启/禁用连续单步物理模拟,flag为ture表示开启 |
boolean getSubStepping() |
查看是否开启了连续单步物理模拟,若开启了则返回true |
void setAutoClearForces(boolean flag) |
设置每一个时间步后是否自动清除力,flag为ture表示开启 |
boolean getAutoClearForces() |
获取在每个时间步之后是否自动清除力,若开启了返回true |
boolean isLocked() |
检测世界是否被锁定,若被锁定了返回true |
void shiftOrigin(Vec2 newOrigin) |
改变世界的原点坐标,newOrigin为新的坐标原点 |
ContactManager getContactManager() |
获取碰撞管理器,返回值为获得的碰撞管理器对象 |
void queryAABB(QueryCallback callback, AABB aabb) |
查询世界中所有可能与指定AABB包围盒重叠的刚体,callback表示查询回调对象的引用,aabb为指定的包围盒 |
void rayCast(RayCastCallback callback, Vec2 point1, Vec2 point2) |
查询世界中所有可能被指定射线射中的刚体,callback表示查询回调对象的引用,后面参数为射线的起点和终点坐标 |
5. 形状Shape类:
JBox2D物理引擎中,刚体都需要有指定的形状,形状包括圆形CircleShape、多边形PolygonShape、线段形EdgeShape、链形ChainShape。这四种形状对应的实现类都继承自Shape。
Shape类的常用属性有:
属性 |
含义 |
ShapeType m_type |
表示形状类型 |
float m_radius |
表示形状的半径 |
Shape类的常用方法有:
方法 |
含义 |
Shape clone() |
使用分配器来克隆形状,返回值为克隆的形状对象的引用 |
ShapeType getType() |
获取当前形状的类型 |
int getChildCount() |
获取子顶点元素的数量 |
boolean testPoint(final Transform xf, final Vec2 p) |
判断指定点是否在形状包含的区域范围内,xf为给定的变换,p为指定的点 |
boolean rayCast(RayCastOutput output, RayCastInput input, Transform transform, int childIndex) |
判断形状是否与指定的射线相交,若是则返回true。output为计算结果类对象的引用,类中包含了交点对应的射线方程参数值以及射线与形状相交的法线,input为射线的信息类对象,包含射线起点终点及允许相交时射线方程的最大参数值,transform为给定的变换,childIndex为子的索引值 |
void computeAABB (AABB aabb, Transform xf, int childIndex) |
计算形状的AABB包围盒,xf为给定的变换,childIndex为子索引值 |
void computeMass (MassData massData, float density) |
计算形状的质量,MassData为计算结果对象的引用,density为给定的密度值 |
6. 圆形CircleShape类:
圆形的实现类是CircleShape,其对象主要用于存储描述圆形形状所需的一些信息,同时还提供一些实用方法。CircleShape的常用属性有:
属性 |
含义 |
Vec2 m_p |
表示位置坐标 |
CircleShape的构造器为:
构造器 |
含义 |
CircleShape() |
创建圆形类的对象 |
CircleShape的常用方法有:
方法 |
含义 |
int getVertexCount() |
获取顶点的数量,对于圆形返回值总为1 |
Vec2 getVretex(int index) |
根据指定索引值获取对应顶点的坐标 |
int getSupport(Vec2 d) |
根据给出的方向向量获取指定方向上的支撑点索引 |
Vec2 getSupportVertex( Vec2 d) |
根据给出的方向向量获取指定方向上的支撑点 |
7. 多边形PolygonShape类:
多边形主要用于存储描述多边形形状所需的一些信息。其构造器为:
构造器 |
含义 |
PolygonShape() |
创建多边形类的对象 |
PolygonShape常用的属性有:
属性 |
含义 |
Vec2 m_centroid |
表示多边形的质心坐标 |
Vec2 m_vertices[] |
表示构成多边形的顶点数组 |
Vec2 m_normals[] |
表示多边形的法线数组 |
int m_count |
表示多边形的顶点总数 |
PolygonShape常用的方法有:
方法 |
含义 |
void set(Vec2 points, int3 count) |
根据指定顶点序列和顶点数量创建多边形对象,points表示顶点序列中第1个顶点坐标的引用,count表示顶点的数量 |
void setAsBox(float hx, float hy) |
将多边形设置为矩形,hx表示矩形半宽,hy表示矩形的半高 |
void setAsBox(float hx, float hy, Vec2 center, float angle) |
将多边形设置为指定位置和姿态的矩形,hx表示矩形半宽,hy表示矩形的半高,center表示矩形中心点坐标,angle表示旋转角度 |
int getVertexCount() |
获取顶点的数量,返回值为获取的顶点数量 |
Vec2 getVretex(int index) |
获取给定索引对应顶点的坐标,index为给定的顶点索引值 |
boolean validate() |
检测是否为凸多边形,若是则返回true |
多边形的顶点数在3~maxPolygonVertices范围内,maxPolygonVertices是JBox2D预定义的一个静态常量,值为8。如果这个值不够,可以通过org.jbox2d.commin包下的Settings类的静态常量maxPolygonVertices自行修改。此值在满足需要情况下越小越好,否则增加计算量。
JBox2D支持的多边形必须是凸多边形,对凹多边形不能正确进行碰撞计算。凸多边形是指任意两个顶点的连线不会划过多边形外部区域的多边形。初始化多边形时给出的多边形顶点坐标需要按照逆时针顺序进行卷绕,否则也会影响计算的正确性。
8. 线段形状EdgeShape类:
线段形状的实现类是EdgeShape,主要用于存储描述线段形状所需的一些信息。构造器为:
构造器 |
含义 |
EdgeShape() |
创建线段类的对象 |
EdgeShape常用的属性有:
属性 |
含义 |
Vec2 m_vertex0 |
表示可选的相邻顶点1,用于平滑碰撞检测 |
Vec2 m_vertex1 |
表示线段的一个顶点 |
Vec2 m_vertex2 |
表示线段的另一个顶点 |
Vec2 m_vertex3 |
表示可选的相邻顶点2,用于平滑碰撞检测 |
boolean m_hasVertex0 |
表示是否有相邻顶点1 |
boolean m_hasVertex3 |
表示是否有相邻顶点3 |
EdgeShape常用的方法有:
方法 |
含义 |
void set(Vec2 v1,Vec2 v2) |
设置线段的两个顶点,v1、v2分别表示两个端点的坐标 |
9. 链形ChainShape类:
链形是一个自由形式的线段序列,就像链条这一类由多段首尾相连构成的形状。JBox2D的链形可以首尾相连构成闭环,支持双面碰撞,可用来开发闭环内部和外部都有碰撞的应用。
链形的实现类是ChainShape,主要用于存储描述链形所需的一些信息。构造器为:
构造器 |
含义 |
ChainShape() |
创建链形类的对象 |
ChainShape常用的属性有:
属性 |
含义 |
Vec2 m_vertices |
表示链形顶点序列中第一个顶点 |
int m_count |
表示顶点的数量 |
Vec2 m_prevVertex |
表示第一个顶点的前导顶点 |
Vec2 m_nextVertex |
表示最后一个顶点的后继顶点 |
boolean m_hasPrevVertex |
表示是否存在第一个顶点的前导顶点 |
boolean m_hasNextVertex |
表示是否存在最后一个顶点的后继顶点 |
ChainShape常用的方法有:
方法 |
含义 |
void createLoop (Vec2 vectices, int count) |
将链条对象创建为环,vertices表示链形顶点序列中第1个顶点的坐标,count表示顶点的数量 |
void createChain (Vec2 vectices, int count) |
将链条对象创建为非闭环链,vertices表示链形顶点序列中第1个顶点的坐标,count表示顶点的数量 |
void setPrevVertex (Vec2 prevVertex) |
设置第1个顶点的前导顶点,prevVertex表示前导顶点坐标 |
void setNextVertex (Vec2 nextVertex) |
设置最后1个顶点的后继顶点,prevVertex表示后继顶点坐标 |
void getChildEdge (EdgeShape edge, int index) |
根据给定的索引获取链中对应的线段,edge表示线段形状对象的引用以存储获取的结果,index表示给定的索引值 |
初始给出的顶点数据不能形成自身交叉的情况,也即给出的顶点数据构成的线段相互之间不可以有交叉。
10. 刚体Body类:
刚体在JBox2D中是一个最重要的概念,由Body类实现。使用JBox2D进行物理模拟时主要是通过刚体进行的。刚体的常用方法有:
方法 |
含义 |
Fixture createFixture(FixtureDef def) |
创建刚体物理信息对象,def表示刚体物理描述类对象的引用 |
Fixture createFixture(Shape shape, float density) |
创建刚体物理信息对象,shape表示形状类对象引用,density表示密度值 |
void destroyFixture (Fixture fixture) |
销毁刚体物理信息对象 |
Vec2 getPosition () |
获取位置坐标 |
float getAngle () |
获取刚体姿态角弧度值 |
void setLinearVelocity (Vec2 v) |
设置线速度 |
Vec2 getLinearVelocity () |
获取线速度 |
void setAngularVelocity (float omega) |
设置角速度 |
float getAngularVelocity () |
获取角速度 |
float getMass() |
获取刚体质量 |
float setMassData(MassData data) |
设置刚体质量数据 |
float getMassData(MassData data) |
获取刚体质量数据 |
void resetMassData() |
重置刚体质量数据 |
float getInertia () |
获取刚体的转动惯量 |
float getGravityScale () |
获取重力比例值 |
void setGravityScale (float scale) |
设置重力比例 |
void setType (BotyType type) |
设置刚体类型 |
BodyType getType () |
获取刚体类型 |
Object getUserData () |
获取用户数据 |
void setUserData(Object data) |
设置用户数据 |
Vec2 getWorldCenter () |
获取刚体质心在世界坐标系中的位置 |
Vec2 getLocalCenter () |
获取刚体质心在局部坐标系中的位置 |
刚体还有一些设置或获取刚体属性及各种状态的方法:
方法 |
含义 |
void setTransform(Vec2 position, float angle) |
设置刚体位置和姿态角,position表示要设置的位置坐标,angle表示要设置的姿态角弧度 |
Transform getTransform() |
获取刚体的变换信息 |
float getLinearDamping () |
获取线性阻尼值 |
void setLinearDamping (float linear Damping) |
设置线性阻尼值 |
float getAngularDamping () |
获取角度阻尼值 |
void setAngularDamping (float angularDamping) |
设置角度阻尼值 |
void setBullet (boolean flag) |
设置刚体是否充当类似子弹等运行速度很快的物体 |
boolean isBullet() |
获取刚体是否充当类似子弹等运行速度很快的物体 |
void setSleepingAllowed (boolean flag) |
设置是否允许休眠 |
boolean isSleepingAllowed () |
获取是否允许休眠 |
void setAwake(boolean flag) |
设置是否唤醒 |
boolean isAwake() |
获取唤醒状态 |
void setActive(boolean flag) |
设置是否激活 |
boolean isActive() |
查看是否激活 |
void setFixedRotation(boolean flag) |
设置是否锁定旋转 |
boolean isFixedRotation() |
查看是否锁定旋转 |
void applyTorque (float torque, boolean wake) |
给刚体施加力矩 |
void applyLinearImpulse (Vec2 impulse, Vec2 point, boolean wake) |
给刚体施加冲量 |
void applyAngularImpulse (float impulse, boolean wake) |
给刚体施加角冲量 |
Fixture getFixtureList () |
获取刚体物理信息对象列表 |
JointEdge getJointList () |
获取关节列表 |
ContactEdge getContactList () |
获取碰撞列表 |
Body getNext () |
获取世界刚体列表中的下一个刚体对象 |
void applyForce (Vec2 force, Vec2 point, boolean wake) |
给刚体施加力 |
void applyForceToCenter (Vec2 force, boolean wake) |
给刚体的质心施加力 |
刚体还有关于坐标变换的一些方法:
方法 |
含义 |
Vec2 getWorldPoint(Vec2 localPoint) |
获取提供的局部坐标点在世界坐标系中的位置 |
Vec2 getWorldVector(Vec2 localPoint) |
获取提供的局部向量在世界坐标系中的对应向量 |
Vec2 getLocalPoint(Vec2 worldPoint) |
获取提供的世界坐标系中的坐标点在局部坐标系中对应的坐标点 |
Vec2 getLocalVector(Vec2 worldPoint) |
获取提供的世界坐标系中的向量在局部坐标系中对应的向量 |
Vec2 getLinearVelocityFromWorldPoint(const Vec2 worldPoint) |
获取关联到此刚体的指定点在世界坐标系中的线速度 |
Vec2 getLinearVelocityFromLocalPoint(const Vec2 localPoint) |
获取关联到此刚体的指定点在世界坐标系中的线速度 |
刚体的创建需要用到World类对象的CreateBody方法,而没有构造器。
11. 刚体物理描述FixtureDef类:
刚体物理描述的实现是由FixtureDef类完成的,主要是包含一些记录不同物理属性的成员,如摩擦系数、弹性系数以及密度。FixtureDef类的构造器为:
构造器 |
含义 |
FixtureDef() |
创建刚体物理描述类的对象 |
FixtureDef常用的属性有:
属性 |
含义 |
Shape shape |
表示刚体的形状,默认null |
void userData |
表示用户的数据,默认为null |
float friction |
表示刚体的摩擦系数值,默认0.2f |
float restitution |
表示刚体的弹性系数,默认0.0f |
float density |
表示刚体的密度值,默认0.0f |
boolean isSensor |
表示刚体碰撞后是否由JBox2D进行物理模拟,还是采用自定义物理模拟,默认为false,由JBox2D进行物理模拟。为true时仅由JBox2D进行碰撞检测,不模拟碰撞后的物理运动,而自定义运动方式 |
Filter filter |
表示刚体过滤信息 |
12. 刚体物理信息Fixture类:
刚体相关的一些物理信息的管理和组织由Fixture类完成,如设置刚体的密度、摩擦系数和弹性系数等。常用方法有:
方法 |
含义 |
ShapeType getType() |
获取刚体的形状,返回值为形状类型类的对象 |
Shape getShape() |
获取刚体的形状,返回值为形状类的对象 |
void setSensor(boolean sensor) |
设置刚体碰撞后是否由JBox2D进行物理模拟,sensor为true时表示仅仅由JBox2D进行碰撞检测,而不模拟碰撞后运动 |
boolean isSensor() |
获取刚体碰撞后是否由JBox2D进行物理模拟 |
void setFilterData(Filter filter) |
设置刚体的碰撞过滤信息 |
Filter getFilterData() |
获取刚体的碰撞过滤信息 |
void refilter() |
当希望把先前由ContactFilter接口中ShouldCollide方法禁用的碰撞重新建立时可以调用此方法 |
Body getBody() |
获取刚体的父刚体 |
Fixture getNext() |
获取刚体物理信息列表的下一刚体物理信息对象 |
Object getUserData() |
获取用户数据,返回值为获取的用户数据类的对象 |
void setUserData(Object data) |
设置用户数据,data表示要设置的用户数据类对象的引用 |
void getMassData(MassData massData) |
获取刚体的质量数据,data为指向质量数据的引用 |
void setDensity(float density) |
设置密度 |
float getDensity() |
获取密度 |
void setFriction(float friction) |
设置摩擦系数 |
float getFriction() |
获取摩擦系数 |
void setRestitution(float restitution) |
设置弹性系数 |
float getRestitution() |
获取弹性系数 |
boolean testPoint(Vec2 p) |
判断指定点是否在此对象包含的区域范围内,p为指定的点坐标 |
boolean rayCast(RayCastOutput output, RayCastInput input, int childIndex) |
判断形状是否与指定的射线相交,output为计算结果类对象的引用,其中包含了交点对应的射线方程参数以及射线与形状相交的法线,input为射线的相关信息类对象的引用,其中包含射线起点终点及允许相交时射线方程的最大参数值 |
AABB getAABB(int childIndex) |
获取此对象的AABB包围盒 |