在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值是用来确保回调只调用一次.这在删除对象的操作中非常重要,但在这个例子中也有意义,因为你不想多次改变节点类型.

时间: 2024-09-01 04:29:25

在Cocos2D中改变动态物体为静态物体的相关文章

实例:JSP中把动态页面转换为静态页面

js|动态|静态|页面|转换 要自动生成静态页面,用Filter截获jsp请求并先进行预处理,自动生成Html,是个不错的主意.一个很容易想到的方法是在Filter截获Request后,导向一个Servlet,在这个Servlet中向本机发送一个http请求,然后将响应写入一个文件: URLConnection urlConn = URLConnection.open(http://localhost/req); 注意要避免递归. 另一个方法是不模拟http,而是定制Response,把服务器返

深入解析C++中的动态类型转换与静态类型转换运算符_C 语言

dynamic_cast 运算符将操作数 expression 转换成类型为type-id 的对象. 语法 dynamic_cast < type-id > ( expression ) 备注 type-id 必须是一个指针或引用到以前已定义的类类型的引用或"指向 void 的指针".如果 type-id 是指针,则expression 的类型必须是指针,如果 type-id 是引用,则为左值. 有关静态和动态强制转换之间区别的描述,以及各在什么情况下适合使用,请参见 st

JSP中把动态页面转换为静态页面

要自动生成静态页面,用Filter截获jsp请求并先进行预处理,自动生成Html,是个不错的主意.一个很容易想到的方法是在Filter截获Request后,导向一个Servlet,在这个Servlet中向本机发送一个http请求,然后将响应写入一个文件: URLConnection urlConn = URLConnection.open(http://localhost/req); 注意要避免递归. 另一个方法是不模拟http,而是定制Response,把服务器返回的JSP响应输出到我们自己的

JSP页面的动态包含和静态包含示例及介绍_JSP编程

一.静态包含 本文介绍JSP静态包含语句,即使用JSP的include指令来完成的包含操作. JSP中,有两种包含其它文件的方式,一种是静态包含,一种是动态包含.本文介绍其中的静态包含. 所谓静态包含,跟ASP中的包含是一样的效果,即将所有包含的文件,先静态的包含进来,组成一个大的JSP文件,然后再经过编译器统一编译,生成HTML代码. JSP静态包含的语句为: 复制代码 代码如下: <%@ include file="file.jsp" %> 这里的file.jsp就是要

Linux系统中“动态库”和“静态库”那点事儿【转】

转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情.       在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式.ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应

gcc中动态库和静态库的链接顺序

so文件:动态库a文件: 静态库exe文件:可执行程序(linux下以文件属性来标示是否是可执行文件,与后缀名无关) 经过自己写的一些测试程序,大致了解了下gcc中链接顺序问题,总结出以下几点:1,动态库中可以包含另一个静态库,通过参数 -lxxx 把静态库libxxx.a加入so文件中,这样so文件中   就包含了libxxx.a的所有实现.当然,如果不包含libxxx.a也没有问题,这样生成的so会小一点.   如果不包含libxxx.a,最终使用这个so的可执行文件,在其生成时必须加入 -

thinkphp中的 s函数静态缓存 和 memcache动态缓存 和 静态页面 三者关系

问题描述 thinkphp中的 s函数静态缓存 和 memcache动态缓存 和 静态页面 三者关系 thinkphp中的 s函数静态缓存 和 memcache动态缓存 和 静态页面 这三者是什么关系呢?分不清. 知道s函数和memcache是缓存数据,静态页面是生成静态页面. 可是都生 成静态页面 了为什么还要 s函数和memcache的缓存数据 呢?

监控-GIS中怎么动态改变marker图标size 改变图标用marker.setUrl();

问题描述 GIS中怎么动态改变marker图标size 改变图标用marker.setUrl(); 就是目前刚接触gis 在做一个驾培监控系统,目前功能 要求 根据特定条件比如有车辆超速了 需要提醒 但是在地图中 要求用一个标注,此标注图标和原来的不一样 且大小不一样,现在能改变图标 但是不能动态改变大小 求解!

php 静态页面中显示动态内容_php技巧

最近在做一个站点时,需要生成静态页面,但是生成的静态页面中有些内容是需要动态获取的,怎不能每天生成一下吧.. 最后上网查了一下,再加上个要总结,呵....终于实现了..发出来,大家一起研究..呵... <span class="STYLE1">应用一</span>:文章计数,获取动态内容 计数页:count.php 复制代码 代码如下: <?php require_once './global.php'; $DB->query("updat