最近学习这个物理引擎,资料超级难找只好死啃demo。我准备把他们全部翻译出来希望方便自己和大家学习。第一次翻译鸟语。不足之处希望大家多包含~~
Simple.c
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "chipmunk.h"
#include "drawSpace.h"
#include "ChipmunkDemo.h"
cpSpace *space;
cpBody *staticBody;
//Init函数用来初始化本程序
static cpSpace *
init(void)
{
//创建一个无限重量的刚体来装其他所有形状对象
//我们并不需要将这个刚体添加进虚拟空间,因为我们不需要它去模拟任何动作
//我们只希望静态刚体能够永远呆在他们原来的地方就好
staticBody = cpBodyNew(INFINITY, INFINITY);
//创建一个空间,它模拟了一个虚拟的世界,在世界里模拟刚体的运动,处理它们之间的碰撞,并模拟它们之间的接缝.
space = cpSpaceNew();
//现在来设置一些space的属性
//更多的迭代器会让仿真更准确,但运行速度会更慢.
space->terations = 10;
//下面两个属性影响着碰撞检测效率
cpSpaceResizeStaticHash(space, 30.0f, 1000);
cpSpaceResizeActiveHash(space, 30.0f, 1000);
//给这个空间设置一个重力
space->gravity = cpv(0, -100);
//创建一个沿着屏幕底边的形状(边界)
cpShape *ground = cpSegmentShapeNew(staticBody, cpv(-320,-240), cpv(320,-240), 0.0f);
//给这个形状设置一些属性
ground->e = 1.0f; //弹性系数
ground->u = 1.0f; //摩擦系数
ground->layers = NOT_GRABABLE_MASK; //设置位掩码(暂时不明白这个属性的用意)
//将这个形状作为一个静态形状添加到虚拟空间中
//如果一个形状你决定将来不改变它的位置,那么将他作为一个静态的形状添加到空间中,Chipmunk物理引擎便知道
//只需要在添加进空间时计算一次它的碰撞信息
//作为静态形状添加进空间后请不要再改变它的位置
cpSpaceAddStaticShape(space, ground);
//添加一个运动的圆形对象
cpFloat radius = 15.0f; //半径
cpFloat mass = 10.0f; //质量
// 我们需要在这个圆形创建时给它设置一个质量和惯性
cpBody *ballBody = cpBodyNew(mass, cpMomentForCircle(mass, 0.0f, radius, cpvzero));
// 给它设置一些属性
ballBody->p = cpv(0, -240 + radius+5);//位置
//添加这个刚体到虚拟空间,它会模拟现实中的运动
cpSpaceAddBody(space, ballBody);
//添加一个圆形的球,
//其实形状相当于是附着在刚体上的一个隐形的东西
//当刚体移动活旋转时,对应的形状也会和它一起运行
//另外,所有类似cpSpaceAdd*()这样的函数都会返回当前添加进对应空间的形状,所以你可以在同一行创建和添加.
//目前支持3种碰撞图形,圆形,线段,凸多边形,我会另外写一篇文章专门介绍这3个图形的创建
cpShape *ballShape = cpSpaceAddShape(space, cpCircleShapeNew(ballBody, radius, cpvzero));
ballShape->e = 0.0f;
ballShape->u = 0.9f;
return space;
}
// Update 函数每一帧都会被调用
static void
update(int ticks)
{
cpSpaceStep(space, 1.0f/60.0f);//设置空间的刷新率
}
//destroy函数用来销毁创建的所有对象
static void
destroy(void)
{
cpBodyFree(staticBody);
cpSpaceFreeChildren(space);
cpSpaceFree(space);
}
const chipmunkDemo Simple = {
"Simple",
NULL,
init,
update,
destroy,
};