游戏中常常会用到一些变换:

游戏中武器和角色在一个layer上,为了效率。会考虑将bullet, effect和 PhysicsParticle分别放到不用的层上,相应的层上使用batchnode来提高效率

武器和PhysicsParticleLauncher(粒子发射器)绑定,发射的时候。会向PhysicsParticleLayer的武器同样的位置上生成一个物理粒子特效

会常常常使用到convertToNodeSpace和convertToWorldSpace转换坐标

我们加三个sprite,r0,r1,r2,

r0的父节点是layer, 父节点下坐标(0,0,100,100)

r1的父节点是r0,父节点下坐标(0,0,100,100)

r2的父节点是r1。父节点下坐标(0,0,100,20)

bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() ) {
return false;
} // r0增加到根节点上(Layer) 坐标(0,0)
Sprite* r0 = Sprite::create("data/pic/gun.png");
r0->setAnchorPoint(Point(0.f, 0.f));
this->addChild(r0); // r1增加到r0上
Sprite* r1 = Sprite::create("data/pic/gun.png");
r1->setAnchorPoint(Point(0.f, 0.f));
r1->setPosition(Point(100, 0));
r0->addChild(r1); // r2增加到r1上
Sprite* r2 = Sprite::create("data/pic/gun.png");
r2->setAnchorPoint(Point(0.f, 0.f));
r2->setPosition(Point(100, 20));
r1->addChild(r2); }

怎样将r2的坐标转换为世界坐标?

怎样将r2的坐标转换为r0的局部坐标?

    // 获得r2的世界坐标,两种方法
// 方法1:以r2坐标系为起点。向根节点(世界坐标)变换,坐标必须为(0,0)
Point p2world = r2->convertToWorldSpace(Point(0, 0)); // 方法2:以r1坐标系为起点。向根节点(世界坐标)变换,坐标为r2在父节点r1内的坐标
p2world = r1->convertToWorldSpace(r2->getPosition()); // 获得r2在r0坐标系中的坐标
// convertToNodeSpace要传入的坐标为世界坐标
Point pt = r0->convertToNodeSpace(p2world);

方法如上:

工作原理详见cocos2dx代码

Point Node::convertToWorldSpace(const Point& nodePoint) const
{
kmMat4 tmp = getNodeToWorldTransform();
kmVec3 vec3 = {nodePoint.x, nodePoint.y, 0};
kmVec3 ret;
kmVec3Transform(&ret, &vec3, &tmp);
return Point(ret.x, ret.y); } kmMat4 Node::getNodeToWorldTransform() const
{
kmMat4 t = this->getNodeToParentTransform(); for (Node *p = _parent; p != nullptr; p = p->getParent())
kmMat4Multiply(&t, &p->getNodeToParentTransform(), &t); return t;
}

cocos2d-x 坐标系具体解释:http://www.tairan.com/archives/3367
【cocos2dx游戏开发】之坐标系(一) 点击这里

【COCOS2DX-游戏开发之三一】之 坐标系(下) convertToNodeSpace和convertToWorldSpace的更多相关文章

  1. 【Unity3D游戏开发】NGUI之多分辨率下完美分布式协同开发 (五)

    NGUI多分辨率下完美分布式协同开发:不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 NGUI多分辨率下完美分布式协同开发不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 开发问题 原因分析 ...

  2. cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发

     cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发 的产生 视持续更新中.... 视频存放地址例如以下:http://ipd.pps.tv/user/1058663622     ...

  3. Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo完结篇

    懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 ) 写下这些东西的同时 旁边放了两部电影 周星驰的<还魂夜> 甄子丹的<特殊身份& ...

  4. cocos2d-x游戏开发系列教程-前言

    cocos2d-x游戏开发前景: 最近企业对于Cocos2D-X开发人才的用人需求很大,而且所提供的薪资相当可观. 为满足广大向往游戏开发行业同学的需求,特推出适合新手的Cocos2D-X手游开发教程 ...

  5. cocos2d-x 游戏开发之有限状态机(FSM) (四)

    cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge ...

  6. cocos2d-x 游戏开发之有限状态机(FSM) (二)

    cocos2d-x 游戏开发之有限状态机(FSM)  (二) 1 状态模式

  7. 《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴

    上一节学习了使用Cocos2d-x播放音乐的方法,但是那种方法一般只适合于播放较大的音乐,而一般比较短小的音乐(如游戏中的打斗.按键音效等)则要通过playEffect来播放.本节使用该方法以及之前学 ...

  8. 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音

    <Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...

  9. 《Cocos2d-x游戏开发实战精解》学习笔记1--在Cocos2d中显示图像

    Cocos2d-x中的图像是通过精灵类来显示的.在Cocos2d-x中游戏中的每一个角色.怪物.道具都可以理解成是一个精灵,游戏背景作为一种特殊的单位将其理解成是一个精灵也没有什么不妥.在源文件本章目 ...

随机推荐

  1. Debug始于71年前

    摘要: 纪念Grace Hopper发现世界上第一个计算机BUG! 1947年9月9日,Grace Hopper的计算科学团队在哈佛的哈弗Mark II电脑运行程序时遇到一个技术故障.她在发生故障的M ...

  2. HDU6187(对偶图生成树)

    Destroy Walls Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)T ...

  3. js 移动端上拉刷新(基于ng1)

    //分页下拉 var ajaxScroll = function() { var screenHeight = window.screen.height; $(document).scroll(fun ...

  4. js 字符串转数组

    var obj = "123456".replace(/(.)(?=[^$])/g, "$1,").split(",");    conso ...

  5. 【20190130】CSS-文字排版

    字间距:letter-space:**px: 禁止中文词内换行:给每个单词设置 white-space: nowrap;

  6. spring boot 集成 redis lettuce

    一.简介 spring boot框架中已经集成了redis,在1.x.x的版本时默认使用的jedis客户端,现在是2.x.x版本默认使用的lettuce客户端,两种客户端的区别如下 # Jedis和L ...

  7. arcgis建立拓扑分析(检验矢量图)

    目的:矢量图画好后,检查是否有伪节点,悬挂节点等,线要素和面要素都可以检查.伪节点,两条线应该相交但是画的没相交:悬挂节点,两条线看似相交了但是没有节点,因此路径不同(类似于高架桥和交叉口,悬挂节点就 ...

  8. java内存分配与垃圾回收

    JVM的内存分配主要基于两种,堆和栈. 我们来看一下java程序运行时候的内存分配策略: 1):静态存储区(方法区): 2):栈区: 3):堆区: 1):主要存放静态数据,全局static数据和常量. ...

  9. Loadrunner 脚本优化-事务函数简介

    脚本优化-事务函数简介 by:授客 QQ:1033553122 1.事务的开始和结束名称需要相同 lr_start_transaction(“transaction_name”); …//事务处理 l ...

  10. Android为TV端助力 post带数据请求方式,传递的数据格式包括json和map

    如下: public static String httpPost(String url, String json) { try { URL u = new URL(url); HttpURLConn ...