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

游戏中武器和角色在一个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. [android] 线性布局和布局的组合

    /****************2016年4月25日 更新******************************/ 知乎:对于开发者来说,Android 的开发者选项里有哪些实用的功能? 汤涛 ...

  2. Java并发编程-看懂AQS的前世今生

    在具备了volatile.CAS和模板方法设计模式的知识之后,我们可以来深入学习下AbstractQueuedSynchronizer(AQS),本文主要想从AQS的产生背景.设计和结构.源代码实现及 ...

  3. intellij error updating changes svn解决办法

    乌龟检出的svn版本为1.8,而1.8在IntelliJ 上跑起来貌似有问题, 经过多次尝试,当Format改为1.7后,问题被解决.

  4. [转]Javascript实现图片的预加载详解

    下面的函数实现了一个我们想要的最基本的图片预加载效果 function preloadimages(arr){ var newimages=[] var arr=(typeof arr!=" ...

  5. 上了IPD和CMMI,为什么还要搞敏捷?

    文/资深顾问 杨学明 现在国内许多产品创新型企业一旦研发团队上了规模,就会进行IPD体系的变革或CMMI的认证,但现在还有一种更加流程的开发模式,就是敏捷,华为公司早在2009年正式发文在全公司现在流 ...

  6. JSON基础知识点

    一.介绍: JSON是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成. 二.数据格式: 1.JSON建构于两种数据格式: “名称/值”对(键值对)的集合,不同的语言中,它被理解为 ...

  7. python高级(2)—— 基础回顾2

    回顾知识 一 操作系统的作用: 隐藏丑陋复杂的硬件接口,提供良好的抽象接口 管理.调度进程,并且将多个进程对硬件的竞争变得有序 关于操作系统的发展史,可以参考我之前的一篇博文:传送门 二 多道技术: ...

  8. array_walk函数与call_user_func_array函数

    一, php手册的解释: call_user_func_array - 调用回调函数,并把一个数组参数作为回调函数的参数  说明: mixed  call_user_func_array  ( cal ...

  9. 【PAT】B1012 数字分类

    注意逻辑的描述,只要认真看题,就能做对,如果自己结果一直不正确,请仔细推一下样例结果 #include<stdio.h> int arr[1005]; int main(){ int N, ...

  10. Linux 小知识翻译 - 「LDAP」

    这次聊聊「LDAP」. LDAP是「Lightweight Directory Access Protocol」的所有,从名字上可以看出是协议的一种. LDAP是访问数据库(层次型数据库)的组件.管理 ...