Chipmunk2D 基础

    • 刚体:一个刚体容纳着一个对象的物理属性(如质量、位置、角度、速度等)。默认它并不具有一个形状直到你添加一个或者多个碰撞形状进去。如果你以前做过物理粒子,刚体和它不同的是刚体可以旋转。在游戏中,通常刚体都是和一个精灵一一对应关联。你应该构建你的游戏以便可以使用刚体的位置和角度来绘制你的精灵。
    • 碰撞形状:因为形状与刚体相关联,所以你可以为一个刚体定义形状。为了定义一个复杂的形状,你可以给刚体绑定足够多的形状。形状包含着一个对象的表面属性如摩擦力、弹性等。
    • 约束/关节:约束和关节被用来描述刚体之间是如何关联的

    对于你将使用的大多数结构体来说,Chipmunk采用了一套或多或少标准和简单直接的内存管理方式。拿结构体来举例:

    • cpSpaceNew() - 分配并初始化一个cpSpace结构体。它先后调用cpSpaceAlloc()了和cpSpaceInit(cpSpace *space)
    • cpSpaceFree(cpSpace *space) - 破环并释放cpSpace结构体

    你对所分配过空间的任何结构体都负有释放的责任。 Chipmunk没有采用引用计数和垃圾回收机制。 如果你调用了一个new函数,则必须匹配调用free函数来释放空间,否则会引起内存泄漏。

    • cpSpaceAlloc() - 为一个cpSpace结构体分配空间,但不进行初始化。所有的分配空间的函数看起来或多或少就像这样:return (cpSpace *)cpcalloc(1, sizeof(cpSpace));。 如果需要的话你可以自己实现自己的分配空间函数
    • cpSpaceInit(cpSpace *space) - 初始化结构体
    • cpSpaceDestroy(cpSpace *space) - 释放由cpSpaceInit()申请的所有内存空间,但并不释放cpSpace结构体本身

    就像newfree函数的对应调用一样,任何由alloc函数分配的内存都要由cpfree()或类似的函数来释放,任何对象由init函数初始化申请的空间要对象的destroy函数来释放。

    定义了Chipmunk使用的一些基本数据类型。这些数据类型可以在编译时改变以便适应你的需求:

    • cpFloat: 浮点型,默认为double
    • cpVect: 2D矢量,cpVect相关文档
    • cpDataPointer: 指针类型,可以是回调、用户自定义数据的指针,默认是void*
    • cpCollistionType: 碰撞形状类型的唯一标识符,默认是unsigned int。自定义类型必须支持==运算符
    • cpGroup: 碰撞组唯一标识符,默认是unsigned int。当你不想区分组别的时候,可以定义一个CP_NO_GROUP。自定义类型必须支持==运算符
    • cpLayers: 该类型被用作为层的掩码,默认是unsigned int。CP_ALL_LAYERS被用来定义为所有层位。自定义类型必须支持位操作&运算符

    Chipmunk为一些常用的数学函数定义了别名以便你可以用Chimpmunk的浮点型来代表float或者double类型计算。在你的代码里,这或许不是一个很充分的理由,但在你使用了错误的版本的数学函数而造成了2%的性能损失,请使用这些别名函数。

    有一些函数或许你会发现非常有用:

    • cpFloat cpfclamp(cpFloat f, cpFloat min, cpFloat max) - 截断f在min和max之间
    • cpFloat cpflerp(cpFloat f1, cpFloat f2, cpFloat t) - 对f1和f2进行线性插值
    • cpFloat cpflerpconst(cpFloat f1, cpFloat f2, cpFloat d) - 从f1到f2不超过d的线性插值