在Cocos2D中改变动态物体为静态物体
2015-10-12 09:49
387 查看
原文链接,有压缩和简化
1.导入一个新的头文件
首先你要知道,不是所有Chimpunk特性都通过Cocos2d的类暴露出来,比如CCPhysicsNode和CCPhysicsBody.对于一些更高级的特性你需要使用实际的Objective-Chipmunk API.
在Cocos2d 3.0中你需要导入一个特殊的头文件去访问CCPhysicalNode和CCPhysicsBody中位于Chipmunk之中的部分:
2.添加一个后处理(post-step)回调
最简单的解决办法是在碰撞处理器中改变bodyType的值从dynamic到static.问题是碰撞处理器在Chipmunk计算物理步骤中被调用(Chipmunk is calculating a physics step),在计算步骤中会解决碰撞和物体的移动.Chipmunk会在计算过程中锁定Chipmunk里CCPhysicsNode的空间(Space),因为在计算碰撞期间改变或删除对象会导致不可预期行为.
所以你只能在计算完成之后改变CCPhysicsNode的bodyType.你需要添加一个后处理回调,示例如下:
无论何时企鹅被激烈碰撞后都会变成静态物体.真正有趣的代码如下:
因为之前新的头文件被导入,所以我们可以访问物理节点的ChipmunkSpace,我们正是在那里添加postStepBlock.该block在Chipmunk完成步骤计算之后调用,我们在block中改变物理对象为static.
其中的key值是用来确保回调只调用一次.这在删除对象的操作中非常重要,但在这个例子中也有意义,因为你不想多次改变节点类型.
1.导入一个新的头文件
首先你要知道,不是所有Chimpunk特性都通过Cocos2d的类暴露出来,比如CCPhysicsNode和CCPhysicsBody.对于一些更高级的特性你需要使用实际的Objective-Chipmunk API.
在Cocos2d 3.0中你需要导入一个特殊的头文件去访问CCPhysicalNode和CCPhysicsBody中位于Chipmunk之中的部分:
#import "CCPhysics+ObjectiveChipmunk.h"
2.添加一个后处理(post-step)回调
最简单的解决办法是在碰撞处理器中改变bodyType的值从dynamic到static.问题是碰撞处理器在Chipmunk计算物理步骤中被调用(Chipmunk is calculating a physics step),在计算步骤中会解决碰撞和物体的移动.Chipmunk会在计算过程中锁定Chipmunk里CCPhysicsNode的空间(Space),因为在计算碰撞期间改变或删除对象会导致不可预期行为.
所以你只能在计算完成之后改变CCPhysicsNode的bodyType.你需要添加一个后处理回调,示例如下:
- (void)ccPhysicsCollisionPostSolve:(CCPhysicsCollisionPair *)pair penguin:(CCNode *)penguin wildcard:(CCNode *)nodeB { if (nodeB == _catapultArm) { // penguin shall not stick to catapultArm return; } float energy = [pair totalKineticEnergy]; // if energy is large enough, make penguin static if (_currentPenguin.launched && (energy > 10000.f)) { [[_physicsNode space] addPostStepBlock:^{ penguin.physicsBody.type = CCPhysicsBodyTypeStatic; } key:penguin]; } }
无论何时企鹅被激烈碰撞后都会变成静态物体.真正有趣的代码如下:
[[_physicsNode space] addPostStepBlock:^{ penguin.physicsBody.type = CCPhysicsBodyTypeStatic; } key:penguin];
因为之前新的头文件被导入,所以我们可以访问物理节点的ChipmunkSpace,我们正是在那里添加postStepBlock.该block在Chipmunk完成步骤计算之后调用,我们在block中改变物理对象为static.
其中的key值是用来确保回调只调用一次.这在删除对象的操作中非常重要,但在这个例子中也有意义,因为你不想多次改变节点类型.
相关文章推荐
- Cocos2D中的Framerate状态
- Cocos2D中的Framerate状态
- Cocos2D中的Framerate状态
- Cocos2d-x 地图步行实现1:图论Dijkstra算法
- cocos2d-x2.2.6项目在eclipse上搭建
- cocos2d 消除类游戏简单的算法 (一)
- cocos2d-x 3.4 之 三消类游戏——万圣大作战(附加篇)
- 给Cocos2D视图添加手势支持
- 给Cocos2D视图添加手势支持
- 给Cocos2D视图添加手势支持
- Windows台cocos2d-x 3.2下载一个新的项目,创造的过程
- Cocos-2d-3.8学习之路:(1)helloworld-新项目的创建。
- Cocos2d-x 3.X, Android Studio版添加多盟广告平台
- 用Android studio创建Cocos2d-x 3.X项目
- Cocos2d-x在线粒子编辑器
- 如何将用Xcode编写的Cocos2d-x项目代码在Android Studio中运行
- [Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--子弹类(一)
- cocos2dx 的Hello world的简单分析
- cocos2dx 3.x 实现 A星(A*)(A-star)算法自动寻路(一)
- 解决启动cocosjs服务时遇到的ascii' codec can't decode byte问题