cpShape
Chipmunk目前支持3种碰撞图形。
1.圆形(速度最快而且最简单)
2.线段(多用做静态图形,但不能线段之间实现碰撞)
3.凸多边形(最慢,但是却最灵活)
接下来看看cpShape这个结构
typedef unsigned int cpCollisionType;
typedef unsigned int cpLayers;
typedef unsigned int cpGroup;
typedef struct cpShape
{
const cpShapeClass *klass;
//记录着附加的刚体
cpBody *body;
//记录着该形状的边界,如果想改变它你需要调用cpShapCacheBB或者cpSpaceStep函数
cpBB bb;
//这个形状是否是一个sensor, sensor只会调用碰撞函数, 而不会真正的去碰撞
int sensor;
//弹性系数0.0-1.0
cpFloat e;
//摩擦系数
cpFloat u;
//该形状的速度
cpVect surface_v;
//自定义字段,一般直接解释为对应的精灵
void *data;
//碰撞类型
cpCollisionType collision_type;
//多个形状在同一个非零集合时不会发生碰撞默认为0
cpCollisionGroup group;
//碰撞掩码
cpLayers layers;
} cpShape;
圆形:
cpCircleShape *cpCircleShapeAlloc(void)
cpCircleShape *cpCircleShapeInit(cpCircleShape *circle, cpBody *body, cpVect offset, cpFloat radius)
cpShape *cpCircleShapeNew(cpBody *body, cpFloat radius, cpVect offset)
body 形状附加的刚体
radius 半径
offset 当前坐标和重心的一个偏移
cpVect cpCircleShapeGetOffset(cpShape *circleShape)
cpFloat cpCircleShapeGetRadius(cpShape *circleShape)
得到圆形的一些属性值,如果非圆调用会抛出一个提示
线段:
cpSegmentShape* cpSegmentShapeAlloc(void)
cpSegmentShape* cpSegmentShapeInit(cpSegmentShape *seg, cpBody *body, cpVect a, cpVect b, cpFloat radius)
cpShape* cpSegmentShapeNew(cpBody *body, cpVect a, cpVect b, cpFloat radius)
body 形状附加的刚体
a , b 线段端点
radius 线段的厚度
cpVect cpSegmentShapeGetA(cpShape *shape)
cpVect cpSegmentShapeGetB(cpShape *shape)
cpVect cpSegmentShapeGetNormal(cpShape *shape)
cpFloat cpSegmentShapeGetRadius(cpShape *shape)
得到线段的一些属性值,如果非线段调用会抛出一个提示
凸多边形
cpPolyShape *cpPolyShapeAlloc(void)
cpPolyShape *cpPolyShapeInit(cpPolyShape *poly, cpBody *body, int numVerts, cpVect *verts, cpVect offset)
cpShape *cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset)
body 形状附加的刚体
verts 顺时针旋转的凸多边形定点序列
offset 当前坐标和重心的一个偏移
如果不是凸多边形会抛出一个提示.
int cpPolyShapeGetNumVerts(cpShape *shape)
cpVect cpPolyShapeGetVert(cpShape *shape, int index)
得到凸多边形的一些属性值,如果非线段调用会抛出一个提示