【cocos2d-x官方文档】Chipmunk(转)
转自: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),做如下更改:
- // At top of file
- #include "chipmunk.h"
- // Inside @interface
- cpSpace* m_pSpace;
在这里,你只需要引入chipmunk头文件,然后声明一个实例变量来记录Chipmunk空间,因为你会经常使用它!
然后切换到cpp文件(ChipmunkTest.cpp),做如下修改:
- void ChipmunkTestLayer::initPhysics()
- {
- #if CC_ENABLE_CHIPMUNK_INTEGRATION
- // init chipmunk
- //cpInitChipmunk();
- m_pSpace = cpSpaceNew();
- m_pSpace->gravity = cpv(0, -100);
- // Physics debug layer
- m_pDebugLayer = CCPhysicsDebugNode::create(m_pSpace);
- this->addChild(m_pDebugLayer, Z_PHYSICS_DEBUG);
- #endif
- }
第一行调用了cpSpaceNew方法来创建一个新的Chipmunk虚拟空间,将其存放到实例变量中。
第二行设置Chipmunk空间的重力为:x轴方向无,y轴方向适当。在这里设定的值将会极大影响游戏中的“正确感觉”。
添加“墙”
对于很多游戏,向Chipmunk空间中添加物体来表示“墙”是非常有用的。比如,在这个游戏中,我们打算创建一个线段形状,从左下延伸到右下。这样做,可以让我们创建的物理碰撞到地面,而不是掉出屏幕!
添加地面,需要到ChipmunkTestLayer::initPhysics()方法中做如下修改:
- // rogue shapes
- // We have to free them manually
- //
- // bottom
- m_pWalls[0] = cpSegmentShapeNew( m_pSpace->staticBody,
- cpv(VisibleRect::leftBottom().x,VisibleRect::leftBottom().y),
- cpv(VisibleRect::rightBottom().x, VisibleRect::rightBottom().y), 0.0f);
- // top
- m_pWalls[1] = cpSegmentShapeNew( m_pSpace->staticBody,
- cpv(VisibleRect::leftTop().x, VisibleRect::leftTop().y),
- cpv(VisibleRect::rightTop().x, VisibleRect::rightTop().y), 0.0f);
- // left
- m_pWalls[2] = cpSegmentShapeNew( m_pSpace->staticBody,
- cpv(VisibleRect::leftBottom().x,VisibleRect::leftBottom().y),
- cpv(VisibleRect::leftTop().x,VisibleRect::leftTop().y), 0.0f);
- // right
- m_pWalls[3] = cpSegmentShapeNew( m_pSpace->staticBody,
- cpv(VisibleRect::rightBottom().x, VisibleRect::rightBottom().y),
- cpv(VisibleRect::rightTop().x, VisibleRect::rightTop().y), 0.0f);
- for( int i=0;i
- e = 1.0f;
- m_pWalls[i]->u = 1.0f;
- cpSpaceAddStaticShape(m_pSpace, m_pWalls[i] );
- }
添加刚体/形状
下面,我们将要创建一个helper方法,它用来向场景中添加一个动态(可移动的)Chipmunk刚体。
- void ChipmunkTestLayer::addNewSpriteAtPosition(CCPoint pos)
- {
- #if CC_ENABLE_CHIPMUNK_INTEGRATION
- int posx, posy;
- CCNode *parent = getChildByTag(kTagParentNode);
- posx = CCRANDOM_0_1() * 200.0f;
- posy = CCRANDOM_0_1() * 200.0f;
- posx = (posx % 4) * 85;
- posy = (posy % 3) * 121;
- int num = 4;
- cpVect verts[] = {
- cpv(-24,-54),
- cpv(-24, 54),
- cpv( 24, 54),
- cpv( 24,-54),
- };
- cpBody *body = cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, verts, cpvzero));
- body->p = cpv(pos.x, pos.y);
- cpSpaceAddBody(m_pSpace, body);
- cpShape* shape = cpPolyShapeNew(body, num, verts, cpvzero);
- shape->e = 0.5f; shape->u = 0.5f;
- cpSpaceAddShape(m_pSpace, shape);
- CCPhysicsSprite *sprite = CCPhysicsSprite::createWithTexture(m_pSpriteTexture, CCRectMake(posx, posy, 85, 121));
- parent->addChild(sprite);
- sprite->setCPBody(body);
- sprite->setPosition(pos);
- #endif
- }
这和第三步看起来十分类似。
你只需要调用cpBodyNew方法就可以在点击屏幕的时候创建一个动态(可移动的)刚体。
设定触摸事件
我们需要在触摸屏幕的时候创建一个新的刚体。我将会向你展示实现此功能最简便的方法。
- void ChipmunkTestLayer::ccTouchesEnded(CCSet* touches, CCEvent* event)
- {
- //Add a new body/atlas sprite at the touched location
- CCSetIterator it;
- CCTouch* touch;
- for( it = touches->begin(); it != touches->end(); it++)
- {
- touch = (CCTouch*)(*it);
- if(!touch)
- break;
- CCPoint location = touch->getLocation();
- addNewSpriteAtPosition( location );
- }
- }
我们在这里调用getLocation,这个方法返回触摸点在Cocos2D坐标系中的位置。最终,我们调用addNewSpriteAtPosition方法来在点击处添加精灵。
编译并运行
编译并运行!如果都正常的话,当你点击屏幕的时候,可以看到刚体掉落到地面,弹起一些,然后再落下.
【cocos2d-x官方文档】Chipmunk(转)相关推荐
- OpenCV-Python官方文档学习笔记(上)
整理自OpenCV-Python官方文档 一. OpenCV-Python Tutorials 1 安装及验证 2 图片读写,展示 3 视频读写,展示 4 绘图功能(绘制几何形状:线.圆.椭圆.矩形. ...
- Ant Design 入门-参照官方文档使用组件
微信小程序开发交流qq群 173683895 承接微信小程序开发.扫码加微信. 先来一个按钮组件使用的对比,官方文档的(不能直接用)和实际能用的. 官网demo: import { Tabl ...
- 坑爹的微软官方文档:SQL无人值守安装
我在部署项目的时候,需要用批处理无人值守安装SQLserver,.Net等组件. 于是查了微软官方文档,其中一项内容如下: http://msdn.microsoft.com/zh-cn/librar ...
- Tomcat官方文档关于数据源配置的内容
虽然有网上有网友自己总结的文章,但说明得总是不够清晰,还是参考官方文档理解得比较透彻: http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html h ...
- python-66:BS4实例--下载BS4官方文档
2019独角兽企业重金招聘Python工程师标准>>> 前面已经对BS4有了简单的认识和讲解,该讲的都讲了,原本也已经想好了一个实例,但是现在想往后推一推,因为我实在受不了了,我们前 ...
- k8s多master建议用几个_Kubernetes 教程之跟着官方文档从零搭建 K8S
前言 本文将带领读者一起, 参照者 Kubernetes 官方文档, 对其安装部署进行讲解. Kubernetes 更新迭代很快, 书上.网上等教程可能并不能适用于新版本, 但官方文档能. 阅读这篇文 ...
- 文件标识符必须为双精度类型的整数值标量_【翻译】VTK官方文档 - vtk文件格式
本文翻译自vtk官方文档:vtk_file_format 文末有链接 VTK提供了许多源对象和编写器对象,用于读取和写入流行的数据文件格式,此外,VTK也提供了自己的文件格式.创建一种数据文件格式的主 ...
- 深入理解Java 8 Lambda表达式(Oracle官方文档版)
Java 8 问世三年了,9马上也要问世了,所以,嗯,我要开始学8了-- 官方文档:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdae ...
- 《Redis官方文档》用Redis构建分布式锁
<Redis官方文档>用Redis构建分布式锁 用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现 ...
- python数据科学和机器学习常用库的官方文档
文章目录 Matplotlib Numpy Pandas sklearn sklearn_crfsuite SciPy Matplotlib 进入matplotlib官网地址:https://matp ...
最新文章
- 最新消息!腾讯紧急宣布再度延期复工时间到24号!附各大企业最新复工时间表...
- [转载]C#中实现强制整除 来源:网络
- Java计算器接口策略_Java 基础 接口 ——运算
- oledb 访问接口sqlncli10返回了消息 没有活动事务_这样理解分布式事务你是不是就会懂了?...
- 上传文件页面回显_数据回显、删除以及excel导出
- 工作86:防抖和节流的问题
- 银行界加强计算机病毒管理,银行计算机管理系统维护现状与对策研究(7.12).doc...
- dockerfile 修改文件权限_网易技术实践|Docker文件系统实战
- Qt工作笔记-视图(QGraphicsView)的放大和缩小(通过滚轮)
- 哈希表、冲突处理方法、查找长度
- MAMP 无法启动Mysql,错误信息Can't start server : Bind on unix socket: Address already in use...
- [转载]用SQL语句添加删除修改字段
- erlang四大behaviour简述
- webstorm如何支持markdown
- Ubuntu18.04使用记录
- 高数 | 【微分方程】技巧性例题 及 李林880详解
- C-V2X行业现状、产业化部署与演进路线
- html的lang属性
- 计算机休眠无法共享,WIN10从睡眠中唤醒后共享打印机不可用
- java通过FTP连接到NAS服务器
热门文章
- 真的了解 Handler 源码吗
- 2019-9-2-图论加法
- CSS优先级的一些理解
- Spring Boot 项目的jsp页面引用css、js、img、fonts的问题解决
- 用计算机视觉可以做什么项目,面向初学者的10个热门计算机视觉项目
- 调色技巧,超实用的可选颜色经验大全
- 约瑟夫问题I(由n个人坐成一圈,按顺时针由1开始给他们编号。然后由第一个人开始报数,数到m的人出局。现在需要求的是最后一个出局的人的编号。)
- 计算机控制整体液压提升滑移技术采用了,钢结构滑移施工技术
- 简历上的项目经历怎么写 ?这 3 条原则不可忽视 !
- python取反操作_在python中对于bool布尔值的取反操作