在Cocos2D中改变动态物体为静态物体

在Cocos2D中改变动态物体为静态物体,第1张

概述原文链接,有压缩和简化 1.导入一个新的头文件 首先你要知道,不是所有Chimpunk特性都通过Cocos2d的类暴露出来,比如CCPhysicsNode和CCPhysicsBody.对于一些更高级的特性你需要使用实际的Objective-Chipmunk API. 在Cocos2d 3.0中你需要导入一个特殊的头文件去访问CCPhysicalNode和CCPhysicsBody中位于Chipmu

原文链接,有压缩和简化

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中改变动态物体为静态物体全部内容,希望文章能够帮你解决在Cocos2D中改变动态物体为静态物体所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1072572.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存