3.0以后最box2d和chipmunk这两个物理引擎进行了封装,使用起来非常的便利。
官方链接地址:英文版
泰然网:中文教程
offset:重心点
velocity:速度
dadamping:阻尼
rerestitution:弹力
mamaterial:材质
mass:质量
moment:力矩,当他碰到另一个刚体时候 ,会产生一股扭转力,做旋转运动
body:刚体,表示物理世界中的抽象实体,附带有物理属性
shape:刚体的形状,同一个body可以附加多个shape 该shape们不会发生碰撞
joint:关节,可以连接>=2个刚体
1.physicsBody
001.
/** 创建一个body mass和moment为默认值 */
002.
static
PhysicsBody* create();
003.
/** 创建一个质量为mass的body moment为默认值. */
004.
static
PhysicsBody* create(
float
mass);
005.
/** 创建一个body 并为mass 和moment赋值 */
006.
static
PhysicsBody* create(
float
mass,
float
moment);
007.
/**创建一个shape为圆形的body */
008.
static
PhysicsBody* createCircle(
float
radius,
const
PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT,
const
Point& offset = Point::ZERO);
009.
/** 创建一个shape为四边形的body. */
010.
static
PhysicsBody* createBox(
const
Size& size,
const
PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT,
const
Point& offset = Point::ZERO);
011.
/**创建一个动态多边形刚体,多边形的顶点存放在Point array[ ]中 示例:Point array[ ]={ point(1,1),point(2,2)} 注意:顶点必须按顺时针存放,并且图形为凸状,不能是凹的*/
012.
static
PhysicsBody* createPolygon(
const
Point* points,
int
count,
const
PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT,
const
Point& offset = Point::ZERO);
013.
014.
/** 创建一个静态的线状刚体. */
015.
static
PhysicsBody* createEdgeSegment(
const
Point& a,
const
Point& b,
const
PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT,
float
border =
1
);
016.
/** 创建一个静态四边形刚体. */
017.
static
PhysicsBody* createEdgeBox(
const
Size& size,
const
PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT,
float
border =
1
,
const
Point& offset = Point::ZERO);
018.
/** 创建一个静态多边形刚体. */
019.
static
PhysicsBody* createEdgePolygon(
const
Point* points,
int
count,
const
PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT,
float
border =
1
);
020.
/** 创建一个链条状刚体 */
021.
static
PhysicsBody* createEdgeChain(
const
Point* points,
int
count,
const
PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT,
float
border =
1
);
022.
023.
/*
024.
添加一个shape mass和moment赋值true
025.
*/
026.
virtual PhysicsShape* addShape(PhysicsShape* shape, bool addMassAndMoment =
true
);
027.
/*通过shape移除shape*/
028.
void
removeShape(PhysicsShape* shape, bool reduceMassAndMoment =
true
);
029.
/*通过tag移除shape*/
030.
void
removeShape(
int
tag, bool reduceMassAndMoment =
true
);
031.
/* 移除body的所有shape */
032.
void
removeAllShapes(bool reduceMassAndMoment =
true
);
033.
/* 获取body的shapes */
034.
inline
const
Vector<PhysicsShape*>& getShapes()
const
{
return
_shapes; }
035.
/* 获取第一个shape. */
036.
inline PhysicsShape* getFirstShape()
const
{
return
_shapes.size() >=
1
? _shapes.at(
0
) : nullptr; }
037.
/* 通过tag从body中获取shape */
038.
PhysicsShape* getShape(
int
tag)
const
;
039.
040.
/**给body施加一个循序渐进的力,物体会受加速度影响,越来越快,像火车一样*/
041.
virtual
void
applyForce(
const
Vect& force);
042.
/** offset为偏移度 指碰到物体时 body旋转 偏移 一般设为默认值 值越大 旋转越快 偏移角度越大*/
043.
virtual
void
applyForce(
const
Vect& force,
const
Point& offset);
044.
/** 重置施加在body上的力 清0了. */
045.
virtual
void
resetForces();
046.
/** 不会产生力,直接与body的速度叠加 产生新的速度. */
047.
virtual
void
applyImpulse(
const
Vect& impulse);
048.
/** Applies a continuous force to body. */
049.
virtual
void
applyImpulse(
const
Vect& impulse,
const
Point& offset);
050.
/**施加一个扭转力到刚体上 就像向前翻转一块大石头一样. */
051.
virtual
void
applyTorque(
float
torque);
052.
053.
/** 设置刚体的速度*/
054.
virtual
void
setVelocity(
const
Vect& velocity);
055.
/** 获取刚体的速度 */
056.
virtual Point getVelocity();
057.
/** 设置刚体角速度 就是单位时间内转动的弧度*/
058.
virtual
void
setAngularVelocity(
float
velocity);
059.
/** 通过一个局部点获取刚体的角速度*/
060.
virtual Point getVelocityAtLocalPoint(
const
Point& point);
061.
/** 通过世界点获取刚体的角速度*/
062.
virtual Point getVelocityAtWorldPoint(
const
Point& point);
063.
/** 获取刚体的角速度 */
064.
virtual
float
getAngularVelocity();
065.
/** 设置速度的极限值*/
066.
virtual
void
setVelocityLimit(
float
limit);
067.
/**获取速度的极限值 */
068.
virtual
float
getVelocityLimit();
069.
/** 设置角速度极限值 */
070.
virtual
float
getAngularVelocityLimit();
071.
072.
/** 从world中移除body */
073.
void
removeFromWorld();
074.
075.
/** 获取world */
076.
inline PhysicsWorld* getWorld()
const
{
return
_world; }
077.
/**获取body的所有关节 */
078.
inline
const
std::vector<PhysicsJoint*>& getJoints()
const
{
return
_joints; }
079.
080.
/** 取得body设置的sprite. */
081.
inline Node* getNode()
const
{
return
_node; }
082.
083.
/**
084.
* A mask that defines which categories this physics body belongs to.
085.
* Every physics body in a scene can be assigned to up to 32 different categories, each corresponding to a bit in the bit mask. You define the mask values used in your game. In conjunction with the collisionBitMask and contactTestBitMask properties, you define which physics bodies interact with each other and when your game is notified of these interactions.
086.
* The default value is 0xFFFFFFFF (all bits set).
087.
*/
没搞懂
088.
void
setCategoryBitmask(
int
bitmask);
089.
/**
090.
* A mask that defines which categories of bodies cause intersection notifications with this physics body.
091.
* When two bodies share the same space, each body’s category mask is tested against the other body’s contact mask by performing a logical AND operation. If either comparison results in a non-zero value, an PhysicsContact object is created and passed to the physics world’s delegate. For best performance, only set bits in the contacts mask for interactions you are interested in.
092.
* The default value is 0x00000000 (all bits cleared).
093.
*/
094.
void
setContactTestBitmask(
int
bitmask);
095.
/**
096.
* A mask that defines which categories of physics bodies can collide with this physics body.
097.
* When two physics bodies contact each other, a collision may occur. This body’s collision mask is compared to the other body’s category mask by performing a logical AND operation. If the result is a non-zero value, then this body is affected by the collision. Each body independently chooses whether it wants to be affected by the other body. For example, you might use this to avoid collision calculations that would make negligible changes to a body’s velocity.
098.
* The default value is 0xFFFFFFFF (all bits set).
099.
*/
100.
void
setCollisionBitmask(
int
bitmask);
101.
/** get the category bit mask */
102.
inline
int
getCategoryBitmask()
const
{
return
_categoryBitmask; }
103.
/** get the contact test bit mask */
104.
inline
int
getContactTestBitmask()
const
{
return
_contactTestBitmask; }
105.
/** get the collision bit mask */
106.
inline
int
getCollisionBitmask()
const
{
return
_collisionBitmask; }
107.
108.
/**
109.
* set the group of body
110.
* Collision groups let you specify an integral group index. You can have all fixtures with the same group index always collide (positive index) or never collide (negative index)
111.
* it have high priority than bit masks
112.
*/
113.
void
setGroup(
int
group);
114.
/** get the group of body */
115.
inline
int
getGroup()
const
{
return
_group; }
116.
117.
/** 获取body坐标 */
118.
Point getPosition()
const
;
119.
/** 获取body角度. */
120.
float
getRotation()
const
;
121.
122.
/**判断body是否静止*/
123.
inline bool isDynamic()
const
{
return
_dynamic; }
124.
/**设置body状态 false为静态 true为动态*/
125.
void
setDynamic(bool dynamic);
126.
127.
/**设置mass值 如果需要增加mass 有addmass方法 不要在这里做加减 */
128.
void
setMass(
float
mass);
129.
/** 取得mass. */
130.
inline
float
getMass()
const
{
return
_mass; }
131.
/**
132.
* @brief add mass to body.
133.
* if _mass(mass of the body) == PHYSICS_INFINITY, it remains.
134.
* if mass == PHYSICS_INFINITY, _mass will be PHYSICS_INFINITY.
135.
* if mass == -PHYSICS_INFINITY, _mass will not change.
136.
* if mass + _mass <= 0, _mass will equal to MASS_DEFAULT(1.0)
137.
* other wise, mass = mass + _mass;
138.
*/
增加质量
139.
void
addMass(
float
mass);
140.
141.
/**
142.
* @brief set the body moment of inertia.
143.
* @note if you need add/subtract moment to body, don't use setMoment(getMoment() +/- moment), because the moment of body may be equal to PHYSICS_INFINITY, it will cause some unexpected result, please use addMoment() instead.
144.
*/
设置力矩
145.
void
setMoment(
float
moment);
146.
/** 获取惯性的力矩. */
147.
inline
float
getMoment(
float
moment)
const
{
return
_moment; }
148.
/**
149.
* @brief add moment of inertia to body.
150.
* if _moment(moment of the body) == PHYSICS_INFINITY, it remains.
151.
* if moment == PHYSICS_INFINITY, _moment will be PHYSICS_INFINITY.
152.
* if moment == -PHYSICS_INFINITY, _moment will not change.
153.
* if moment + _moment <= 0, _moment will equal to MASS_DEFAULT(1.0)
154.
* other wise, moment = moment + _moment;
155.
*/
增加力矩
156.
void
addMoment(
float
moment);
157.
/** 取得线性阻尼 */
158.
inline
float
getLinearDamping()
const
{
return
_linearDamping; }
159.
/**
160.
* 设置阻尼值
161.
*它用来模拟body在气体或者液体中的摩擦力
162.
*取值范围是 0.0f to 1.0f.
163.
*/
164.
inline
void
setLinearDamping(
float
damping) { _linearDamping = damping; }
165.
/** 获取角阻尼 */
166.
inline
float
getAngularDamping()
const
{
return
_angularDamping; }
167.
/**
168.
* 设置角阻尼
169.
* 它用来模拟body在气体或者液体中的角阻尼
170.
* the value is 0.0f to 1.0f.
171.
*/
172.
inline
void
setAngularDamping(
float
damping) { _angularDamping = damping; }
173.
174.
/** 判断body是否是 休息状态 */
175.
bool isResting()
const
;
176.
/**
177.
*判断body能否在物理世界中模拟
178.
*/
179.
inline bool isEnabled()
const
{
return
_enable; }
180.
/**
181.
设置body能否在物理世界中模拟
182.
*/
183.
void
setEnable(bool enable);
184.
185.
/** whether the body can rotation */
186.
inline bool isRotationEnabled()
const
{
return
_rotationEnable; }
187.
/**设置能否旋转*/
188.
void
setRotationEnable(bool enable);
189.
190.
/** 判断body是否受引力影响 */
191.
inline bool isGravityEnabled()
const
{
return
_gravityEnable; }
192.
/** 设置body是否受引力影响 */
193.
void
setGravityEnable(bool enable);
194.
195.
/** 取得body 的tag值 */
196.
inline
int
getTag()
const
{
return
_tag; }
197.
/** 设置body tag值*/
198.
inline
void
setTag(
int
tag) { _tag = tag; }
199.
200.
/** 转换 世界点 到 局部点 类似 世界坐标和 局部坐标的转换*/
201.
Point world2Local(
const
Point& point);
202.
/** 转换局部坐标到 世界坐标 */
203.
Point local2World(
const
Point& point);
2.PhysicsShape
01.
/** 通过shape 取得body */
02.
inline PhysicsBody* getBody()
const
{
return
_body; }
03.
/** 返回shape的类型 */
04.
inline Type getType()
const
{
return
_type; }
05.
/** 返回shape的面积 */
06.
inline
float
getArea()
const
{
return
_area; }
07.
/** 取得moment 力矩 */
08.
inline
float
getMoment()
const
{
return
_moment; }
09.
/** Set moment, it will change the body's moment this shape attaches */
10.
void
setMoment(
float
moment);
//设置力矩
11.
inline
void
setTag(
int
tag) { _tag = tag; }
//设置标签tag
12.
inline
int
getTag()
const
{
return
_tag; }
//取得tag标签
13.
14.
/**获取质量 */
15.
inline
float
getMass()
const
{
return
_mass; }
16.
/** Set mass, it will change the body's mass this shape attaches */
17.
void
setMass(
float
mass);
//设置质量
18.
inline
float
getDensity()
const
{
return
_material.density; }
//density为密度
19.
void
setDensity(
float
density);
//获取密度
20.
inline
float
getRestitution()
const
{
return
_material.restitution; }
//获取弹性
21.
void
setRestitution(
float
restitution);
//设置弹性
22.
inline
float
getFriction()
const
{
return
_material.friction; }
//friction为摩擦力
23.
void
setFriction(
float
friction);
//设置摩擦力
24.
const
PhysicsMaterial& getMaterial()
const
{
return
_material; }
//Material为材质
25.
void
setMaterial(
const
PhysicsMaterial& material);设置材质
26.
27.
/** 返回默认力矩 其值为0 */
28.
virtual
float
calculateDefaultMoment() {
return
0
.0f; }
29.
/** 取得重心 初始值为zero */
30.
virtual Point getOffset() {
return
Point::ZERO; }
31.
/** 获取shape的重心点 */
32.
virtual Point getCenter() {
return
getOffset(); }
33.
/**shape是否包含该点 */
34.
bool containsPoint(
const
Point& point)
const
;
35.
36.
/** 改变重心点 */
37.
static
void
recenterPoints(Point* points,
int
count,
const
Point& center = Point::ZERO);
38.
/** 取得多边形的重心点 */
39.
static
Point getPolyonCenter(
const
Point* points,
int
count);
40.
41.
/**
42.
* A mask that defines which categories this physics body belongs to.
43.
* Every physics body in a scene can be assigned to up to 32 different categories, each corresponding to a bit in the bit mask. You define the mask values used in your game. In conjunction with the collisionBitMask and contactTestBitMask properties, you define which physics bodies interact with each other and when your game is notified of these interactions.
44.
* The default value is 0xFFFFFFFF (all bits set).
45.
*/
46.
inline
void
setCategoryBitmask(
int
bitmask) { _categoryBitmask = bitmask; }
47.
inline
int
getCategoryBitmask()
const
{
return
_categoryBitmask; }
48.
/**
49.
* A mask that defines which categories of bodies cause intersection notifications with this physics body.
50.
* When two bodies share the same space, each body’s category mask is tested against the other body’s contact mask by performing a logical AND operation. If either comparison results in a non-zero value, an PhysicsContact object is created and passed to the physics world’s delegate. For best performance, only set bits in the contacts mask for interactions you are interested in.
51.
* The default value is 0x00000000 (all bits cleared).
52.
*/
53.
inline
void
setContactTestBitmask(
int
bitmask) { _contactTestBitmask = bitmask; }
54.
inline
int
getContactTestBitmask()
const
{
return
_contactTestBitmask; }
55.
/**
56.
* A mask that defines which categories of physics bodies can collide with this physics body.
57.
* When two physics bodies contact each other, a collision may occur. This body’s collision mask is compared to the other body’s category mask by performing a logical AND operation. If the result is a non-zero value, then this body is affected by the collision. Each body independently chooses whether it wants to be affected by the other body. For example, you might use this to avoid collision calculations that would make negligible changes to a body’s velocity.
58.
* The default value is 0xFFFFFFFF (all bits set).
59.
*/
60.
inline
void
setCollisionBitmask(
int
bitmask) { _collisionBitmask = bitmask; }
61.
inline
int
getCollisionBitmask()
const
{
return
_collisionBitmask; }
62.
63.
void
setGroup(
int
group);
64.
inline
int
getGroup() {
return
_group; }