11.碰撞

你是否看到过车祸?是否跟什么物体相撞过?就像车的相撞一样,刚体对象也可以互相碰撞,当它们互相接触的时候,就认为发生了碰撞。当碰撞发生时,会触发一系列事件,它可以被完全忽略。

碰撞筛选

碰撞筛选允许你启用或者阻止形状之间碰撞的发生,引擎支持使用类型,组位掩码来进行碰撞筛选。

Cocos2d-x 有 32 个支持的碰撞类型,对于每个形状都可以指定其所属的类型。还可以指定有哪些类型可以与这个形状进行碰撞,这些是通过掩码来完成的。例如:

C++
auto sprite1 = addSpriteAtPosition(Vec2(s_centre.x - 150,s_centre.y));
sprite1->getPhysicsBody()->setCategoryBitmask(0x02);    // 0010
sprite1->getPhysicsBody()->setCollisionBitmask(0x01);   // 0001sprite1 = addSpriteAtPosition(Vec2(s_centre.x - 150,s_centre.y + 100));
sprite1->getPhysicsBody()->setCategoryBitmask(0x02);    // 0010
sprite1->getPhysicsBody()->setCollisionBitmask(0x01);   // 0001auto sprite2 = addSpriteAtPosition(Vec2(s_centre.x + 150,s_centre.y),1);
sprite2->getPhysicsBody()->setCategoryBitmask(0x01);    // 0001
sprite2->getPhysicsBody()->setCollisionBitmask(0x02);   // 0010auto sprite3 = addSpriteAtPosition(Vec2(s_centre.x + 150,s_centre.y + 100),2);
sprite3->getPhysicsBody()->setCategoryBitmask(0x03);    // 0011
sprite3->getPhysicsBody()->setCollisionBitmask(0x03);   // 0011}

你可以通过检查判断类型和掩码来确定碰撞的发生:

C++
if ((shapeA->getCategoryBitmask() & shapeB->getCollisionBitmask()) == 0|| (shapeB->getCategoryBitmask() & shapeA->getCollisionBitmask()) == 0)
{// shapes can't collideret = false;
}

碰撞组允许你指定一个完整的组索引,你可以让具有相同组索引的形状总是一直碰撞(正索引)或者一直不碰撞(负索引和零索引)。对于组索引不同的形状。可以根据类型和掩码进行筛选,也就是说,组筛选比类型筛选具有更高的优先级。

代码::   body->setGroup(整型数字) ;body->getGroup(整型数字)

连接/关节

回想一下之前提到的术语,关节是把不同刚体连接在一起的一种方式,就好像人体的关节是把人体的不同部位连接在一起。关节连接了不同的刚体,刚体可以是静态的,每一个关节类都是PhysicsJoint 的子类,你可以通过设置 joint->setCollisionEnable(false) 来避免相互关联的刚体互相碰撞。关节的定义需要你提供一些几何数据,大多关节都是通过锚点来定义的,其余一些关节有各自的定义方式。

  • PhysicsJointFixed:固定点关节,将两个刚体固定在一个特定的点上。如果要创建一些后续会断裂的复合刚体,使用固定关节是非常合适的。
  • PhysicsJointLimit:限制关节,限制了两个刚体的最大距离,就好像它们被绳子连接了一样。
  • PhysicsJointPin:钉式关节,可以让两个刚体独立的围绕一个锚点进行旋转,就好像被钉在一起了一样。
  • PhysicsJointDistance:固定距离关节,设定了两个刚体间的固定距离。
  • PhysicsJointSpring:弹簧关节,就好像将一个弹簧连接了两个刚体,刚体会互相牵引和弹开。
  • PhysicsJointRotarySpring:弹簧旋转关节,类似弹簧关节,只是两个刚体位置的互相影响变成了旋转的互相影响。
  • PhysicsJointRotaryLimit:限制旋转关节,类似限制关节,只是两个刚体位置的互相影响变成了旋转的互相影响
  • PhysicsJointRatchet:与套筒扳手的工作类似。
  • PhysicsJointGear:传动关节,使一对刚体的角速度比值保持不变。
  • PhysicsJointMotor:马达关节,使一对刚体的相对角速度保持不变。

碰撞检测

碰撞(Contact) 是一种由物理引擎创建的用于管理两个形状碰撞的对象。Contact 对象不是由用户手动创建的,而是自动创建的。这里有两个相关的术语:

  • contact point:碰撞点指两个形状相接触的那个点
  • contact normal:碰撞法线指从一个形状指向另一个形状的单位矢量

你可以从一个 contact 对象中获取到 PhysicsShape,从而获取到刚体:

C++
bool onContactBegin(PhysicsContact& contact)
{auto bodyA = contact.getShapeA()->getBody();auto bodyB = contact.getShapeB()->getBody();return true;
}

你可以通过碰撞监听器来访问碰撞,碰撞监听器支持四种事件:begin, pre-solve, post-solve,separate

  • begin:收到这个事件时两个形状刚开始接触。在回调函数中返回 true 可以使碰撞继续被处理,若返回 false,则物理引擎会将整个碰撞忽略掉,preSolve()postSolve() 回调函数也会被跳过。不过当两个形状停止重叠时,你仍然可以收到 separate 事件。
  • pre-solve:收到这个事件时两个形状接触在一起。如果在回调函数中返回 false,那么物理引擎会忽略掉这次碰撞,如果返回 true,碰撞会继续被处理。此外,你可以使用setRestitution()setFriction()setSurfaceVelocity() 方法设置自定义的恢复系数,摩擦,表面速度,从而覆盖默认的碰撞属性。
  • post-solve:收到这个事件时两个形状已经接触,并且它们的碰撞已被处理。
  • separate:收到这个事件时两个形状刚刚停止了接触。

你还可以使用 EventListenerPhysicsContactWithBodies,EventListenerPhysicsContactWithShapes,EventListenerPhysicsContactWithGroup 来监听你感兴趣的刚体,形状,组的一些事件。额外的,还需要设置与物理碰撞相关的掩码。注意:默认情况下单单创建事件监听器,是收不到碰撞事件的。

示例:

C++
bool init()
{//create a static PhysicsBodyauto sprite = addSpriteAtPosition(s_centre,1);sprite->setTag(10);sprite->getPhysicsBody()->setContactTestBitmask(0xFFFFFFFF);sprite->getPhysicsBody()->setDynamic(false);//adds contact event listenerauto contactListener = EventListenerPhysicsContact::create();contactListener->onContactBegin = CC_CALLBACK_1(PhysicsDemoCollisionProcessing::onContactBegin, this);_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);schedule(CC_SCHEDULE_SELECTOR(PhysicsDemoCollisionProcessing::tick), 0.3f);return true;return false;
}void tick(float dt)
{auto sprite1 = addSpriteAtPosition(Vec2(s_centre.x + cocos2d::random(-300,300),s_centre.y + cocos2d::random(-300,300)));auto physicsBody = sprite1->getPhysicsBody();physicsBody->setVelocity(Vec2(cocos2d::random(-500,500),cocos2d::random(-500,500)));physicsBody->setContactTestBitmask(0xFFFFFFFF);
}bool onContactBegin(PhysicsContact& contact)
{auto nodeA = contact.getShapeA()->getBody()->getNode();auto nodeB = contact.getShapeB()->getBody()->getNode();if (nodeA && nodeB){if (nodeA->getTag() == 10){nodeB->removeFromParentAndCleanup(true);}else if (nodeB->getTag() == 10){nodeA->removeFromParentAndCleanup(true);}}//bodies can collidereturn true;
}

12.网络访问

使用 HTTP 进行网络访问

有时候我们需要从网络上获取资源数据,一种常见的解决方法就是使用 HTTP 进行网络访问。

使用 HTTP 进行网络访问有三个步骤:

  1. 创建一个 HTTP 请求 HttpRequest
  2. 通过 setResponseCallback() 设置一个请求完成时的回调函数
  3. 使用 HttpClient 发送 HttpRequest

#注意:包涵头文件#include "network/HttpClient.h",使用cosos2d::network 名称

HttpRequest 有四种类型:POST PUT DELETE UNKNOWN。除非指定请求的类型,否则就默认 UNKNOWN。HttpClient 对象负责请求的发送,也负责数据的接收。

示例:

C++
HttpRequest* request = new (std :: nothrow) HttpRequest();
request->setUrl("http://just-make-this-request-failed.com");
request->setRequestType(HttpRequest::Type::GET);
request->setResponseCallback(CC_CALLBACK_2 (HttpClientTest::onHttpRequestCompleted, this));HttpClient::getInstance()->sendImmediate(request);request->release();

注意,我们通过 setResponseCallback() 设置请求完成时的回调函数了。这样做,在请求完成时,我们就能查看返回的数据,并提取出我们需要的。

回调函数的写法很简单,可以像这样做:

C++
void HttpClientTest::onHttpRequestCompleted(HttpClient* sender, HttpResponse* response)
{if (!response){return;}// Dump the datastd::vector<char>* buffer = response->getResponseData();for (unsigned int i = 0; i <buffer-> size (); i ++){log ("% c", (* buffer) [i]);}
}

13.Cocos2d-x 性能优化建议

  1. 始终使用批量绘图,将同一图层中的精灵图像打包成一个大的图集
  2. 根据经验,尽量保持 绘制调用(draw call) 次数低于 50,总之尽量减少就对了!
  3. 在 原始 32 位(RGBA8888)纹理上,优先使用 16 位(RGBA4444 + 抖动)的处理方式
  4. 使用压缩纹理,在 iOS 中使用 PVRTC 纹理,在 Android 平台上,使用 ETC1,但是 ETC1 没有 alpha 通道,你可能需要编写自定义着色器并为 alpha 通道提供单独的 ETC1 图像
  5. 不要使用系统字体作为您的游戏得分计数器,它很慢的,尝试使用 TTF 或 BMFont,BMFont 更快
  6. 尝试在使用音频和其它游戏对象前,进行预加载
  7. 使用 armabi-v7a 构建 Android 工程,这会有更好的性能表现
  8. 使用烘焙光照,而不是动态光照
  9. 避免使用复杂的像素着色器
  10. 避免在像素着色器中使用丢弃和 alpha 测试,它会影响 HSR 优化


学习小计(部分摘自cocos官方文档) 2相关推荐

  1. 学习小计(部分摘自cocos官方文档)1

     1.AutoPolygon 裁剪矩形图片的透明部分,使资源所占空间更小. AutoPolygon 是一个工具类,它可以在程序运行时,通过跟踪关键点和三角测量,将一个矩形图像划分成一系列小三角形块 ...

  2. 微信小程序(note1:官方文档)

    官方文档 关于微信小程序这块儿,主要练习怎么查看文档,因为微信开发文档特别全面,没有必要再额外写什么笔记. 但是对小程序开发文档的熟练度是非常重要的,所以此系列笔记,着重于常用的组件.接口- 微信小程 ...

  3. tensorflow学习笔记十7:tensorflow官方文档学习 How to Retrain Inception's Final Layer for New Categories

    现代物体识别模型有数以百万计的参数,可能需要数周才能完全训练.学习迁移是一个捷径,很多这样的工作,以充分的训练模式的一组类ImageNet技术,并从现有的权重进行新课.在这个例子中,我们将从头再训练最 ...

  4. YII2 路由问题-摘自yii2官方文档

    路由 当入口脚本在调用 run() 方法时,它进行的第一个操作就是解析输入的请求,然后实例化对应的控制器动作处理这个请求. 该过程就被称为引导路由(routing). 路由相反的操作会将给定的路由和参 ...

  5. UE4学习(一)C++编程官方文档解读

    文档地址:https://docs.unrealengine.com/zh-CN/Programming/Introduction/index.html 文档详细介绍了C++编程的基础,一些宏和常用变 ...

  6. 微信小程序学习记录【1】【项目结构构成、官方文档构成、基本配置】

    微信小程序学习记录[1][项目结构构成.基本配置]文章目录 项目结构构成 官方文档结构 基本配置 1. 小程序配置 1.1 app.json 1.2 page(页面名).json 1.3 sitema ...

  7. 微信小程序入门:初步了解官方文档(循环、视图容器、icon、image)

    今天是正式学习微信小程序的第一天,学习微信小程序先从了解官方文档开始吧. 这一节开始学习微信小程序官方文档中的for循环.视图容器.icon.image等. 打开index文件夹下的index.wxm ...

  8. mysql中括号_手把手教你看MySQL官方文档

    前言: 在学习和使用MySQL的过程中,难免会遇到各种问题.不知道当你遇到相关问题时会怎么做,我在工作或写文章的过程中,遇到不懂或需要求证的问题时通常会去查阅官方文档.慢慢的,阅读文档也有了一些经验, ...

  9. 如何全文搜索oracle官方文档

    如何全文搜索oracle官方文档 [技巧]如何全文搜索oracle官方文档 一.1  BLOG文档结构图 一.2  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它 ...

最新文章

  1. IP地址审计在事件追溯中的应用
  2. ThinkPHP5表单令牌+表单数据验证验证规则
  3. layui循环数据并渲染_layui使用表格渲染获取行数据的例子
  4. 不拆分单词也可以做NLP,哈工大最新模型在多项任务中打败BERT,还能直接训练中文...
  5. springboot整合websocket实现一对一消息推送和广播消息推送
  6. python使用笔记
  7. 首航节能:光热行业刚起步 子公司处于亏损状态
  8. token和session的区别
  9. 特征筛选11——ExtraTrees筛选特征
  10. 文件服务器定时开关机,云服务器定时开关机
  11. 腾讯会议共享屏幕,ppt如何使用演讲者模式
  12. 华为手机动态修改手机型号参数
  13. 【安全研究】免杀对抗之源码免杀
  14. Firefox版哔哩哔哩助手,修改自chrome1.2.1版
  15. 周期性的方波 matlab,matlab产生方波脉冲和周期性方波信号 - 副本
  16. 简洁但功能强大的EditPlus UltraEdit
  17. linux修改用户名命令6,linux用命令改用户名
  18. UCenter 1.6 数据字典
  19. Android SOS功能模块开发
  20. vs2008编译QT开源项目--太阳神三国杀源码分析(一) 项目编译及整体分析

热门文章

  1. IPV4优先于IPV6设置
  2. js调用java线程_100%原生的JavaScript多线程和并行执行库:Hamsters.js
  3. Ant Design Pro 使用proxy无法设置cookies
  4. Ubuntu安装Sqoop1
  5. 【C语言初阶】C语言%(%d,%c...)
  6. 数据库读写分离架构详解
  7. scrapy爬取需要登录的网站(知乎)
  8. 最优二叉搜索树java_动态规划-最优二叉搜索树
  9. 一篇博客学会一个Point 1 | 条件概率 Conditional probability
  10. 求生之路显示服务器的指令,求生之路的所有控制台指令!