本文主要是介绍ConvertToNodeSpace和convertToWorldSpace函数的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
触摸点(Touch position)
所以在处理触摸事件时需要用重写以下四个函数:
1 2 3 4 | virtual bool onTouchBegan(Touch *touch, Event * event); virtual void onTouchEnded(Touch *touch, Event * event); virtual void onTouchCancelled(Touch *touch, Event * event); virtual void onTouchMoved(Touch *touch, Event * event); |
在函数中获取到touch,我们在设计游戏逻辑时需要用到触摸点在Cocos2d坐标系中的位置,就需要将touch的坐标转换成OpenGL坐标系中的点坐标。
Touch position是屏幕坐标系中的点,OpenGL position是Cocos2d-x用到的OpenGL坐标系上的点坐标。通常我们在开发中会使用两个接口getLocation()
和getLocationInView()
来进行相应坐标转换工作。
在开发中一般使用getLocation()
获取触摸点的GL坐标,而getLocation()
内部实现是通过调用Director::getInstance()->convertToGL(_point);
返回GL坐标。
此外,关于世界坐标系和本地坐标系的相互转换,在Node中定义了以下四个常用的坐标变换的相关方法。
1 2 3 4 5 6 7 8 9 10 11 | // 把世界坐标转换到当前节点的本地坐标系中 Point convertToNodeSpace( const Point& worldPoint) const ; // 把基于当前节点的本地坐标系下的坐标转换到世界坐标系中 Point convertToWorldSpace( const Point& nodePoint) const ; // 基于Anchor Point把基于当前节点的本地坐标系下的坐标转换到世界坐标系中 Point convertToNodeSpaceAR( const Point& worldPoint) const ; // 基于Anchor Point把世界坐标转换到当前节点的本地坐标系中 Point convertToWorldSpaceAR( const Point& nodePoint) const ; |
下面通过一个例子来说明这四个方法的理解和作用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | auto *sprite1 = Sprite::create( "HelloWorld.png" ); sprite1->setPosition(ccp(20,40)); sprite1->setAnchorPoint(ccp(0,0)); this ->addChild(sprite1); //此时添加到的是世界坐标系,也就是OpenGL坐标系 auto *sprite2 = Sprite::create( "HelloWorld.png" ); sprite2->setPosition(ccp(-5,-20)); sprite2->setAnchorPoint(ccp(1,1)); this ->addChild(sprite2); //此时添加到的是世界坐标系,也就是OpenGL坐标系 //将 sprite2 这个节点的坐标ccp(-5,-20) 转换为 sprite1节点 下的本地(节点)坐标系统的 位置坐标 Point point1 = sprite1->convertToNodeSpace(sprite2->getPosition()); //将 sprite2 这个节点的坐标ccp(-5,-20) 转换为 sprite1节点 下的世界坐标系统的 位置坐标 Point point2 = sprite1->convertToWorldSpace(sprite2->getPosition()); log ( "position = (%f,%f)" ,point1.x,point1.y); log ( "position = (%f,%f)" ,point2.x,point2.y); |
1 2 3 4 | 运行结果: Cocos2d: position = (-25.000000,-60.000000) Cocos2d: position = (15.000000,20.000000) |

其中:Point point1 = sprite1->convertToNodeSpace(sprite2->getPosition());
相当于sprite2
这个节点添加到(实际没有添加,只是这样理解)sprite1
这个节点上,那么就需要使用sprite1
这个节点的节点坐标系统,这个节点的节点坐标系统的原点在(20,40),而sprite1
的坐标是(-5,-20),那么经过变换之后,sprite1
的坐标就是(-25,-60)。
其中:Point point2 = sprite1->convertToWorldSpace(sprite2->getPosition());
此时的变换是将sprite2
的坐标转换到sprite1
的世界坐标系下,而其中世界坐标系是没有变化的,始终都是和OpenGL等同,只不过sprite2
在变换的时候将sprite1
作为了”参照“而已。所以变换之后sprite2
的坐标为:(15,20)。
原地址:http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v3/coordinate-system/zh.md
这篇关于ConvertToNodeSpace和convertToWorldSpace函数的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!