1、OpenGL坐标系:该坐标系原点在屏幕左下角,x轴向右,y轴向上。这也就是cocos2dx中用到的坐标系。
2、屏幕坐标系:该坐标系的原点在屏幕左上角,x轴向右,y轴向下,其实和OpenGL坐标系的差别也就是y轴的方向拉。假设游戏场景的分辨率为(500,500),其中一个点的坐标为(200,200),那么它在OpenGL坐标系中的坐标还是(200,200),在屏幕坐标系中则要倒过来,则为(200,500-200)。
3、世界坐标系:又名绝对坐标系,概念啥的就不多说了,我们只要知道世界坐标系和OpenGL坐标系方向一致,原点在屏幕左下角,x轴向右,y轴向上。
4、节点坐标系:又名相对坐标系,和OpenGL坐标系方向一致,不同的是原点在父节点左下角。
Node类中:
坐标转换
Vec2 convertToNodeSpace(const Vec2& worldPoint) const;
//会转换openGL触摸点转成.tmx 地图或者其他近似的坐标
Vec2 convertToWorldSpace(const Vec2& nodePoint) const;
Vec2 convertToNodeSpaceAR(const Vec2& worldPoint) const;
Vec2 convertToWorldSpaceAR(const Vec2& nodePoint) const;
Vec2 convertTouchToNodeSpace(Touch * touch) const;
Vec2 convertTouchToNodeSpaceAR(Touch * touch) const;
convertToNodeSpace:
举例,convertToNodeSpace用于tile-based的游戏,即有一个大地图。convertToNodeSpace会转换openGL触摸点转成.tmx 地图或者其他近似的坐标。
例子:
下面的图片会展现,node1的锚点(0,0),node2的锚点是(1,1)。
我们会调用CCPoint point = node1->convertToNodeSpace(node2->getPosition()); 转换node2的屏幕坐标为node1的位置。结果是,node2的位置是(-25,-60).
convertToWorldSpace:
convertToWorldSpace(常量 CCPoint& nodePoint) 转换node坐标为SCREEN坐标。convertToWorldSpace会经常返回你的精灵的SCREEN位置,如果你想捕获精灵的taps而且需要移动/缩放layer的时候,这可能非常有帮助。
CCPoint point = node1->convertToWorldSpace(node2->getPosition());
上面的代码会转换node2坐标为node2在屏幕上对应的坐标。
convertToWorldSpaceAR
convertToWorldSpaceAR返回相对锚点的位置:所以如果你的场景 – 根layer有一个锚点位于ccp(0.5f, 0.5f)。- 默认的,convertToNodeSpaceAR应返回相对于屏幕中心的位置。
convertToNodeSpaceAR – 和convertToWorldSpaceAR是一样的逻辑。
示例代码:
CCSprite *sprite1 = CCSprite::create("CloseNormal.png"); sprite1->setPosition(ccp(20,40)); sprite1->setAnchorPoint(ccp(0,0)); this->addChild(sprite1); CCSprite *sprite2 = CCSprite::cteate("CloseNormal.png"); sprite2->setPosition(ccp(-5,-20)); sprite2->setAnchorPoint(ccp(1,1)); this->addChild(sprite2); CCPoint point1 = sprite1->convertToNodeSpace(sprite2->getPosition()); CCPoint point2 = sprite1->convertToWorldSpace(sprite2->getPosition()); CCPoint point3 = sprite1->convertToNodeSpaceAR(sprite2->getPosition()); CCPoint point4 = sprite1->convertToWorldSpaceAR(sprite2->getPosition()); CCLog("position = (%f,%f)",point1.x,point1.y); CCLog("position = (%f,%f)",point2.x,point2.y); CCLog("position = (%f,%f)",point3.x,point3.y); CCLog("position = (%f,%f)",point4.x,point4.y);
结果:
position = (-25.000000,-60.000000) position = (15.000000,20.000000) position = (-25.000000,-60.000000) position = (15.000000,20.000000)
Director 类中
Vec2 convertToGL(const Vec2& point);
Vec2 convertToUI(const Vec2& point);
bool HelloWorld::onTouchBegan(Touch* touch,Event* event)
{
auto point = touch->getLocation();//获得OpenGl坐标系
CCLOG("Location point x=%f , y=%f",point.x,point.y);
auto point2 = touch->getLocationInView();//获得屏幕坐标
CCLOG("LocationInView point x=%f , y=%f",point2.x,point2.y);
point2 = Director::getInstance()->convertToGL(point2);//将屏幕坐标转成OpenGL坐标
CCLOG("convertToGL1 point x=%f , y=%f",point2.x,point2.y);
point = Director::getInstance()->convertToUI(point2);//将OpenGL坐标转成屏幕坐标
CCLOG("convertToGL2 point x=%f , y=%f",point.x,point.y);
return true;
}
设置锚点 即参考点 旋转缩放等都是围绕锚点进行的
virtual void setAnchorPoint(const Vec2& anchorPoint);
范围 0--1;
左下角为Vec2(0, 0);
中心为Vec2(0.5f, 0.5f);
例子
auto l = LayerColor::create(Color4B(255, 0, 0, 255), 150, 150);
l->setAnchorPoint(Vec2(0.5f, 0.5f));
l->setPosition(Vec2( s.width/2, s.height/2));