分类:
版权声明:本文为博主原创文章,未经博主允许不得转载。
游戏中经常会用到一些变换:
游戏中武器和角色在一个layer上,为了效率,会考虑将bullet,effect和 PhysicsParticle分别放到不用的层上,对应的层上使用batchnode来提高效率
武器和PhysicsParticleLauncher(粒子发射器)绑定,发射的时候,会向PhysicsParticleLayer的武器相同的位置上生成一个物理粒子特效
会经常用到convertToNodeSpace和convertToWorldSpace转换坐标
我们加三个sprite,r0,r1,r2,
r0的父节点是layer,父节点下坐标(0,100,100)
r1的父节点是r0,父节点下坐标(0,100)
r2的父节点是r1,父节点下坐标(0,20)
如何将r2的坐标转换为世界坐标?
如何将r2的坐标转换为r0的局部坐标?
copy
//获得r2的世界坐标,两种方法
//方法1:以r2坐标系为起点,向根节点(世界坐标)变换,坐标必须为(0,0)
Pointp2world=r2->convertToWorldSpace(Point(0,0); background-color:inherit">//方法2:以r1坐标系为起点,向根节点(世界坐标)变换,坐标为r2在父节点r1内的坐标
p2world=r1->convertToWorldSpace(r2->getPosition());
//获得r2在r0坐标系中的坐标
//convertToNodeSpace要传入的坐标为世界坐标
Pointpt=r0->convertToNodeSpace(p2world);
方法如上:
工作原理详见cocos2dx代码
copy
PointNode::convertToWorldSpace(constPoint&nodePoint)const
kmMat4tmp=getNodeToWorldTransform();
kmVec3vec3={nodePoint.x,nodePoint.y,0};
kmVec3ret;
kmVec3Transform(&ret,&vec3,&tmp);
return Point(ret.x,ret.y);
kmMat4Node::getNodeToWorldTransform() kmMat4t=this->getNodeToParentTransform();
for(Node*p=_parent;p!=nullptr;p=p->getParent())
kmMat4Multiply(&t,&p->getNodeToParentTransform(),&t);
returnt;
}
cocos2d-x 坐标系详解: http://www.tairan.com/archives/3367