【COCOS2DX-游戏开发之三一】之 坐标系(下) convertToNodeSpace和convertToWorldSpace
游戏中常常会用到一些变换:
游戏中武器和角色在一个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的更多相关文章
- 【Unity3D游戏开发】NGUI之多分辨率下完美分布式协同开发 (五)
NGUI多分辨率下完美分布式协同开发:不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 NGUI多分辨率下完美分布式协同开发不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 开发问题 原因分析 ...
- cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发
cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发 的产生 视持续更新中.... 视频存放地址例如以下:http://ipd.pps.tv/user/1058663622 ...
- Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo完结篇
懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 ) 写下这些东西的同时 旁边放了两部电影 周星驰的<还魂夜> 甄子丹的<特殊身份& ...
- cocos2d-x游戏开发系列教程-前言
cocos2d-x游戏开发前景: 最近企业对于Cocos2D-X开发人才的用人需求很大,而且所提供的薪资相当可观. 为满足广大向往游戏开发行业同学的需求,特推出适合新手的Cocos2D-X手游开发教程 ...
- cocos2d-x 游戏开发之有限状态机(FSM) (四)
cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge ...
- cocos2d-x 游戏开发之有限状态机(FSM) (二)
cocos2d-x 游戏开发之有限状态机(FSM) (二) 1 状态模式
- 《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴
上一节学习了使用Cocos2d-x播放音乐的方法,但是那种方法一般只适合于播放较大的音乐,而一般比较短小的音乐(如游戏中的打斗.按键音效等)则要通过playEffect来播放.本节使用该方法以及之前学 ...
- 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音
<Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...
- 《Cocos2d-x游戏开发实战精解》学习笔记1--在Cocos2d中显示图像
Cocos2d-x中的图像是通过精灵类来显示的.在Cocos2d-x中游戏中的每一个角色.怪物.道具都可以理解成是一个精灵,游戏背景作为一种特殊的单位将其理解成是一个精灵也没有什么不妥.在源文件本章目 ...
随机推荐
- Prism 学习:从配置文件中加载 Module
之前我们已经了解过,如何从指定的目录中来加载 Module(原文),现在我们来看,如何从应用程序的配置文件中来加载 Module.以这种方式来加载 Module 的优点包括:1. 被加载的 Modul ...
- [android] 表格布局和绝对布局
/*****************2016年4月28日 更新*************************************/ 知乎:为什么Android没有像iOS一样提供autolay ...
- SpringMVC 的运行原理
0. 灵魂的拷问 问:SpringMVC 是什么?它有什么作用? 答:SpringMVC 的全称是 Spring Web Model-View-Controller,它是 Spring Fram ...
- 我是如何解决java.security.cert.CertPathValidatorException异常的
目录 问题来了 问题分析 解决问题 重新安装服务器端证书 日志带来曙光 刨根到底 总结 附录 tomcat的SSL配置 服务器端证书配置 Keytool命令常用参数 问题来了 昨天,我还在我的工位上愉 ...
- a dive in react lifecycle
背景:我在react文档里找生命周期的图,居然没有,不敢相信我是在推特上找到的... 正文 react v16.3 新生命周期: static getDerivedStateFromProps get ...
- 什么是xss攻击,如何预防(初级)?
概念: XSS(Cross Site Scripting),即跨站脚本攻击,是一种常见于web应用程序中的计算机安全漏洞.XSS通过在用户端注入恶意的可运行脚本,若服务器端对用户输入不进行处理,直接将 ...
- HDU3038(KB5-D加权并查集)
How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- 常见js面试题
包含内容: Array indexOf(). 数组扁平化 isArray() 数组的去重 Object.is() Array.filter 用一行代码实现数组扁平化? JavaScript isArr ...
- Redis 开启远程连接
默认 bind 127.0.0.1 即绑定本机 IP,只能本机访问,你也可以绑定别的 IP 地址,如果注释掉,表示不限制 IP,所有 IP 都能访问 # ~~~ WARNING ~~~ If the ...
- IntelliJ IDEA 编译Java程序出现 'Error:java: 无效的源发行版: 9' 的解决方案
最新安装的IntelliJ IDEA 2018.1编译器,创建Java Project,并选择之前安装好的Eclipse配置的JDK,如图所示: 在工程中添加 Main.class, main函数中写 ...