cocos2d-x-3.3rc2 坐标转换和锚点

来源:互联网 发布:linux文件目录 编辑:程序博客网 时间:2024/06/08 02:12

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));



0 0