Chipmunk2D 基础

优质
小牛编辑
138浏览
2023-12-01

概述

在Chimpmunk中有4种基本对象类型,分别是

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

内存管理

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

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

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

另外当你需要在栈上分配临时结构体,或者在写一个语言绑定又或者在一个低内存容量的环境下编码,这时你需要更多分配和初始化的控制权,便可以使用下面的函数。大部分人永远都不会使用下面几个函数。

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

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

基本类型

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

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

数学运算

首先,Chipmunk默认使用双精度浮点数进行数学计算。在大多数现代台式机处理器下这样很可能更快点,并意味着你可以不用过多担心浮点舍入误差。在编译库的时候你可以修改Chipmunk使用的浮点类型。请查看chipmunk_types.h

Chipmunk为一些常用的数学函数定义了别名以便你可以用Chimpmunk的浮点型来代表float或者double类型计算。在你的代码里,这或许不是一个很充分的理由,但在你使用了错误的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的线性插值

浮点数无穷大被定义为INFINITY, 很多数学库中这样定义,但这实际上并不是C标准库的一部分。