转自:http://www.ityran.com/archives/3313

本文由 sharyu 翻译,转载请注明原出处!!
介绍
Chipmunk是如何工作的?
在空间内添加物体
告诉Chipmunk这些物体上受到了哪些力的作用
偶尔给Chipmunk一段时间来更新模拟结果
根据物理模拟的结果更新你“真实”的Cocos2D世界
刚体和形状
Cocos2d-x Chipmunk示例代码概览
创建Chipmunk空间
添加“墙”
添加刚体/形状
设定触摸事件
编译并运行
参考

介绍
Chipmunk是一个用c写的游戏物理库,是Cocos2D引擎的一部分。使用它,可以让你游戏中的物体像现实生活中一样行动——它们会受重力影响,与其它物体碰撞,到处弹跳,以及其它更多行为。
 Chipmunk是怎样工作的?
Chipmunk在一个“虚拟的Chipmunk空间”中模拟了物理行为。而你需要做的是:
在这个空间内添加物体。
例如:表示动物,花朵或者布偶的形状。
告诉Chipmunk这些物体上受到了哪些力的作用。
例如:重力,风,外星人的引力光线,等等。
偶尔给Chipmunk一段时间来更新模拟结果。
例如:Chipmunk可能会运算出一个动物相比上个时刻掉落了一段距离,一朵鲜花在风中微微倾斜,Gonzo可能被拉向空中。
 根据物理模拟的结果更新你“真实”的Cocos2D世界。
例如:设置你的动物,鲜花,或者布偶精灵的位置,使它们与Chipmunk模拟的虚拟物体位置相同。
上面需要理解的最关键的点是:Chipmunk空间和Cocos2D空间完全不同。
Bodies and Shapes 刚体和形状
在你深入研究代码之前,还有一点需要理解:Chipmunk的刚体和形状的概念。
一个Chipmunk刚体代表了Chipmunk虚拟世界中的一个物体。刚体可以包含一个或多个Chipmunk形状来表示其几何定义,如下图所示。
这幅图展示了我们用来表示猫咪床的Chipmunk刚体。它包含三个Chipmunk形状——床的左侧部分,右侧部分和床的底部。
有两种Chipmunk刚体:
动态刚体是可以移动的——大多数情况下会用到。
静态刚体永远不会移动——它们通常被用于制作游戏中的地面和其它永久静止的装置。
对于每个Chipmunk刚体,你可以定义它的质量。质量越大,它移动起来就越困难,并且变的很重。
当你创建形状时,你可以制定它们是矩形盒,圆形,多边形,段落(有厚度的直线段)。对于每个形状,你可以设定下面一些属性:
弹性:代表物体的弹力如何。如果设置为0,它就一点弹性没有。如果设置为1,物体会以相同的反弹力回弹。如果设置大于1,那么会以更大的力回弹!
摩擦:表示物体有多滑。如果设置为0,它就会相当光滑。如果设置为1或更高,那么它就一点都不滑。
Cocos2d-x Chipmunk示例代码概览
这是你第一次看到如何向Chipmunk场景中添加物体,因此,让我们一段一段地学习。
创造一些墙,确保物体不会掉出屏幕。
向Chipmunk空间添加各种形状。
设定触摸事件,实现点击屏幕时可以添加精灵。
下面的工程在cocos2d-x的示例工程中被命名为ChipmunkTest。
创建Chipmunk空间
下面这一步创建一个虚拟的Chipmunk空间,用来模拟物理的运行。
用一个对象cpSpace来表示Chipmunk空间——你只需要创建并初始化它。
切换到头文件(这里是:ChipmunkTest.h),做如下更改:

  1. // At top of file
  2. #include "chipmunk.h"
  3. // Inside @interface
  4. cpSpace* m_pSpace;

在这里,你只需要引入chipmunk头文件,然后声明一个实例变量来记录Chipmunk空间,因为你会经常使用它!
然后切换到cpp文件(ChipmunkTest.cpp),做如下修改:

  1. void ChipmunkTestLayer::initPhysics()
  2. {
  3. #if CC_ENABLE_CHIPMUNK_INTEGRATION
  4. // init chipmunk
  5. //cpInitChipmunk();
  6. m_pSpace = cpSpaceNew();
  7. m_pSpace->gravity = cpv(0, -100);
  8. // Physics debug layer
  9. m_pDebugLayer = CCPhysicsDebugNode::create(m_pSpace);
  10. this->addChild(m_pDebugLayer, Z_PHYSICS_DEBUG);
  11. #endif
  12. }

第一行调用了cpSpaceNew方法来创建一个新的Chipmunk虚拟空间,将其存放到实例变量中。
第二行设置Chipmunk空间的重力为:x轴方向无,y轴方向适当。在这里设定的值将会极大影响游戏中的“正确感觉”。
添加“墙”
对于很多游戏,向Chipmunk空间中添加物体来表示“墙”是非常有用的。比如,在这个游戏中,我们打算创建一个线段形状,从左下延伸到右下。这样做,可以让我们创建的物理碰撞到地面,而不是掉出屏幕!
添加地面,需要到ChipmunkTestLayer::initPhysics()方法中做如下修改:

  1. // rogue shapes
  2. // We have to free them manually
  3. //
  4. // bottom
  5. m_pWalls[0] = cpSegmentShapeNew( m_pSpace->staticBody,
  6. cpv(VisibleRect::leftBottom().x,VisibleRect::leftBottom().y),
  7. cpv(VisibleRect::rightBottom().x, VisibleRect::rightBottom().y), 0.0f);
  8. // top
  9. m_pWalls[1] = cpSegmentShapeNew( m_pSpace->staticBody,
  10. cpv(VisibleRect::leftTop().x, VisibleRect::leftTop().y),
  11. cpv(VisibleRect::rightTop().x, VisibleRect::rightTop().y), 0.0f);
  12. // left
  13. m_pWalls[2] = cpSegmentShapeNew( m_pSpace->staticBody,
  14. cpv(VisibleRect::leftBottom().x,VisibleRect::leftBottom().y),
  15. cpv(VisibleRect::leftTop().x,VisibleRect::leftTop().y), 0.0f);
  16. // right
  17. m_pWalls[3] = cpSegmentShapeNew( m_pSpace->staticBody,
  18. cpv(VisibleRect::rightBottom().x, VisibleRect::rightBottom().y),
  19. cpv(VisibleRect::rightTop().x, VisibleRect::rightTop().y), 0.0f);
  20. for( int i=0;i
  21. e = 1.0f;
  22. m_pWalls[i]->u = 1.0f;
  23. cpSpaceAddStaticShape(m_pSpace, m_pWalls[i] );
  24. }

添加刚体/形状
下面,我们将要创建一个helper方法,它用来向场景中添加一个动态(可移动的)Chipmunk刚体。

  1. void ChipmunkTestLayer::addNewSpriteAtPosition(CCPoint pos)
  2. {
  3. #if CC_ENABLE_CHIPMUNK_INTEGRATION
  4. int posx, posy;
  5. CCNode *parent = getChildByTag(kTagParentNode);
  6. posx = CCRANDOM_0_1() * 200.0f;
  7. posy = CCRANDOM_0_1() * 200.0f;
  8. posx = (posx % 4) * 85;
  9. posy = (posy % 3) * 121;
  10. int num = 4;
  11. cpVect verts[] = {
  12. cpv(-24,-54),
  13. cpv(-24, 54),
  14. cpv( 24, 54),
  15. cpv( 24,-54),
  16. };
  17. cpBody *body = cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, verts, cpvzero));
  18. body->p = cpv(pos.x, pos.y);
  19. cpSpaceAddBody(m_pSpace, body);
  20. cpShape* shape = cpPolyShapeNew(body, num, verts, cpvzero);
  21. shape->e = 0.5f; shape->u = 0.5f;
  22. cpSpaceAddShape(m_pSpace, shape);
  23. CCPhysicsSprite *sprite = CCPhysicsSprite::createWithTexture(m_pSpriteTexture, CCRectMake(posx, posy, 85, 121));
  24. parent->addChild(sprite);
  25. sprite->setCPBody(body);
  26. sprite->setPosition(pos);
  27. #endif
  28. }

这和第三步看起来十分类似。
你只需要调用cpBodyNew方法就可以在点击屏幕的时候创建一个动态(可移动的)刚体。
设定触摸事件
我们需要在触摸屏幕的时候创建一个新的刚体。我将会向你展示实现此功能最简便的方法。

  1. void ChipmunkTestLayer::ccTouchesEnded(CCSet* touches, CCEvent* event)
  2. {
  3. //Add a new body/atlas sprite at the touched location
  4. CCSetIterator it;
  5. CCTouch* touch;
  6. for( it = touches->begin(); it != touches->end(); it++)
  7. {
  8. touch = (CCTouch*)(*it);
  9. if(!touch)
  10. break;
  11. CCPoint location = touch->getLocation();
  12. addNewSpriteAtPosition( location );
  13. }
  14. }

我们在这里调用getLocation,这个方法返回触摸点在Cocos2D坐标系中的位置。最终,我们调用addNewSpriteAtPosition方法来在点击处添加精灵。
编译并运行
编译并运行!如果都正常的话,当你点击屏幕的时候,可以看到刚体掉落到地面,弹起一些,然后再落下.

【cocos2d-x官方文档】Chipmunk(转)相关推荐

  1. OpenCV-Python官方文档学习笔记(上)

    整理自OpenCV-Python官方文档 一. OpenCV-Python Tutorials 1 安装及验证 2 图片读写,展示 3 视频读写,展示 4 绘图功能(绘制几何形状:线.圆.椭圆.矩形. ...

  2. Ant Design 入门-参照官方文档使用组件

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 先来一个按钮组件使用的对比,官方文档的(不能直接用)和实际能用的. 官网demo: import { Tabl ...

  3. 坑爹的微软官方文档:SQL无人值守安装

    我在部署项目的时候,需要用批处理无人值守安装SQLserver,.Net等组件. 于是查了微软官方文档,其中一项内容如下: http://msdn.microsoft.com/zh-cn/librar ...

  4. Tomcat官方文档关于数据源配置的内容

    虽然有网上有网友自己总结的文章,但说明得总是不够清晰,还是参考官方文档理解得比较透彻: http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html h ...

  5. python-66:BS4实例--下载BS4官方文档

    2019独角兽企业重金招聘Python工程师标准>>> 前面已经对BS4有了简单的认识和讲解,该讲的都讲了,原本也已经想好了一个实例,但是现在想往后推一推,因为我实在受不了了,我们前 ...

  6. k8s多master建议用几个_Kubernetes 教程之跟着官方文档从零搭建 K8S

    前言 本文将带领读者一起, 参照者 Kubernetes 官方文档, 对其安装部署进行讲解. Kubernetes 更新迭代很快, 书上.网上等教程可能并不能适用于新版本, 但官方文档能. 阅读这篇文 ...

  7. 文件标识符必须为双精度类型的整数值标量_【翻译】VTK官方文档 - vtk文件格式

    本文翻译自vtk官方文档:vtk_file_format 文末有链接 VTK提供了许多源对象和编写器对象,用于读取和写入流行的数据文件格式,此外,VTK也提供了自己的文件格式.创建一种数据文件格式的主 ...

  8. 深入理解Java 8 Lambda表达式(Oracle官方文档版)

    Java 8 问世三年了,9马上也要问世了,所以,嗯,我要开始学8了-- 官方文档:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdae ...

  9. 《Redis官方文档》用Redis构建分布式锁

    <Redis官方文档>用Redis构建分布式锁 用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现 ...

  10. python数据科学和机器学习常用库的官方文档

    文章目录 Matplotlib Numpy Pandas sklearn sklearn_crfsuite SciPy Matplotlib 进入matplotlib官网地址:https://matp ...

最新文章

  1. 最新消息!腾讯紧急宣布再度延期复工时间到24号!附各大企业最新复工时间表...
  2. [转载]C#中实现强制整除 来源:网络
  3. Java计算器接口策略_Java 基础 接口 ——运算
  4. oledb 访问接口sqlncli10返回了消息 没有活动事务_这样理解分布式事务你是不是就会懂了?...
  5. 上传文件页面回显_数据回显、删除以及excel导出
  6. 工作86:防抖和节流的问题
  7. 银行界加强计算机病毒管理,银行计算机管理系统维护现状与对策研究(7.12).doc...
  8. dockerfile 修改文件权限_网易技术实践|Docker文件系统实战
  9. Qt工作笔记-视图(QGraphicsView)的放大和缩小(通过滚轮)
  10. 哈希表、冲突处理方法、查找长度
  11. MAMP 无法启动Mysql,错误信息Can't start server : Bind on unix socket: Address already in use...
  12. [转载]用SQL语句添加删除修改字段
  13. erlang四大behaviour简述
  14. webstorm如何支持markdown
  15. Ubuntu18.04使用记录
  16. 高数 | 【微分方程】技巧性例题 及 李林880详解
  17. C-V2X行业现状、产业化部署与演进路线
  18. html的lang属性
  19. 计算机休眠无法共享,WIN10从睡眠中唤醒后共享打印机不可用
  20. java通过FTP连接到NAS服务器

热门文章

  1. 真的了解 Handler 源码吗
  2. 2019-9-2-图论加法
  3. CSS优先级的一些理解
  4. Spring Boot 项目的jsp页面引用css、js、img、fonts的问题解决
  5. 用计算机视觉可以做什么项目,面向初学者的10个热门计算机视觉项目
  6. 调色技巧,超实用的可选颜色经验大全
  7. 约瑟夫问题I(由n个人坐成一圈,按顺时针由1开始给他们编号。然后由第一个人开始报数,数到m的人出局。现在需要求的是最后一个出局的人的编号。)
  8. 计算机控制整体液压提升滑移技术采用了,钢结构滑移施工技术
  9. 简历上的项目经历怎么写 ?这 3 条原则不可忽视 !
  10. python取反操作_在python中对于bool布尔值的取反操作