在Cocos2D中改变动态物体为静态物体
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中改变动态物体为静态物体的更多相关文章
- Linux中的动态库和静态库(.a/.la/.so/.o)
Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...
- DOM中的动态NodeList与静态NodeList
GitHub版本号: https://github.com/cncounter/translation/blob/master/tiemao_2014/NodeList/NodeList.md 副标题 ...
- JSP中的动态包含和静态包含的区别
本文转载自http://blog.csdn.net/xuxu198899223/article/details/8501044 1. 语法格式 (1)静态包含:<%@ include file= ...
- Android笔记(二十七) Android中的动态广播和静态广播
广播接收器注册一共有两种形式 : 静态注册和动态注册. 两者及其接收广播的区别: 1.动态注册的广播 永远要快于 静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低>\ ...
- ARP缓存记录种类动态条目和静态条目
ARP缓存记录种类动态条目和静态条目 为使广播量最小,ARP维护IP地址到MAC地址映射的缓存以便将来使用.根据缓存的有效期时间,ARP缓存中包含动态和静态条目本文选自ARP协议全面实战手册. 这里首 ...
- [转]JSP页面的动态包含和静态包含示例及介绍
原文地址:http://www.jb51.net/article/53659.htm 一.静态包含 本文介绍JSP静态包含语句,即使用JSP的include指令来完成的包含操作.JSP中,有两种包含其 ...
- Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名
Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名 转载自:http://b ...
- Linux系统中“动态库”和“静态库”那点事儿【转】
转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...
- Linux系统中“动态库”和“静态库”那点事儿
摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在 ...
随机推荐
- Ruby方法参数默认值的一个小技巧在Rails中的应用
我们需要生成一个gravatar格式的html.image标示,于是写了如下方法: def gravatar_for(user) gravatar_id = Digest::MD5::hexdiges ...
- VirtualBox: Resize a Fedora, CentOS, or Windows Dynamic Guest Virtual Disk (VDI) in VirtualBox
Here's the scenario: you've set up Dynamically Allocated Storage for the hard drive on your Guest VM ...
- 计算机网络之文件传送协议FTP
FTP 文件传送协议FTP(File Transfer Protocol)是因特网上使用最广泛的文件传送协议. FTP 提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限.FTP ...
- springMVC源码分析--AbstractHandlerMethodMapping获取url和HandlerMethod对应关系(十)
在之前的博客springMVC源码分析--AbstractHandlerMapping(二)中我们介绍了AbstractHandlerMethodMapping的父类AbstractHandlerMa ...
- 用Python最原始的函数模拟eval函数的浮点数运算功能(2)
这应该是我编程以来完成的难度最大的一个函数了.因为可能存在的情况非常多,需要设计合理的参数来控制解析流程.经验概要: 1.大胆假设一些子功能能够实现,看能否建立整个框架.如果在假设的基础上都无法建立, ...
- SQLite Select 语句(http://www.w3cschool.cc/sqlite/sqlite-select.html)
SQLite Select 语句 SQLite 的 SELECT 语句用于从 SQLite 数据库表中获取数据,以结果表的形式返回数据.这些结果表也被称为结果集. 语法 SQLite 的 SELECT ...
- C控制台实现模拟平抛运动算法
平抛运动这个相信读了高中物理都知道这个概念了,详细的我就不说了,不明白的看看百度: 平抛运动 接下来看看用控制台实现的平抛运动算法: #include <stdio.h> #include ...
- PyCharm 开发Django ,错误汇总
近期略微接触了一下Django.在学习的过程中可谓是坎坎坷坷,遇到了很多的问题. 下面就来谈一谈我对Django的一点点的见解. Django项目的创建 使用PyCharm来开发Django项目是非常 ...
- Linux/Unix--设备类型
在Linux以及所有的Unix系统中,设备被分为以下三种类型: 块设备 字符设备 网络设备 块设备通常写为 blkdev ,它是可以寻址的 ...
- 修改android应用包名
由于项目需要,要修改已经开发好的应用包名,这本身很简单,但是如果你没找到门道,可能会白白浪费许多时间. 修改包名有三个地方要改,这三个地方的修改一定要按顺序来,否则你可能会遇到许多不必要的麻烦. 1. ...