Cocos2dx 世界、屏幕、openGL、本地等坐标系

本文参考小塔的博客:点击跳转

刚开始学Cocos2dx的时候会感觉各种坐标系很容易混淆,现在做一下概述,直接上代码:

bool CoordinateScene::init(){
    if (!Layer::init())
        return false;

    //opengl的坐标系和世界坐标系相同,都是以屏幕左下角为原点,向右为x轴的增加方向,向上为y轴的增加方向
    //这里的世界指的是游戏世界
    //屏幕坐标系是以左上角为原点,是我们熟悉的
    //本地坐标系也叫节点坐标系,世界坐标系是相对于整体而言的,而本地坐标系是相对于父节点而言的,理解这点很重要

    //Director::getInstance()->convertToGL() 转换到OPENGL坐标系
    //Director::getInstance()->convertToUI 转换到屏幕坐标系
    //Node::convertToWorldSpace()   把本地坐标系转换到世界坐标系
    //Node::convertToNodeSpace()    把世界坐标系转换到本地坐标系

    //图片的大小为(195,270)
    Sprite* s1 = Sprite::create("HelloWorld.png");
    s1->setPosition(Vec2(150, 150));
    addChild(s1);

    //将s2添加到s1节点中,这时候是以s1的左下角为原点,虽然s1的锚点是在它图片的中间
    Sprite* s2 = Sprite::create("HelloWorld.png");
    s2->setColor(Color3B(100, 100, 100));
    //这里是本地坐标,是相对于s1来说的
    s2->setPosition(Vec2(200, 200));
    s1->addChild(s2);

    Vec2 v_s2 = s2->getPosition();
    log("s2: x = %f, y = %f", v_s2.x, v_s2.y);

    //convertToWorldSpace的传入参数是s2的节点坐标系(本地坐标),也就是setPosition中传入的参数,而convertToNodeSpace的传入参数是s2的世界坐标系
    //看清谁是调用者,传入的参数又是什么,其实含义就是把s1上面的某一点转换成世界坐标或者本地坐标
    Vec2 wv_s2 = s1->convertToWorldSpace(v_s2);
    log("world s2: x = %f, y = %f", wv_s2.x, wv_s2.y);  //此处应该输出(252.5, 215.0)
    Vec2 nv_s2 = s1->convertToNodeSpace(wv_s2);
    log("node s2: x = %f, y = %f", nv_s2.x, nv_s2.y);   //此处应该输出(200, 200)

    //以下俩个函数完成同样的功能,只不过这次的s2的坐标是基于s1的锚点的,而不是左下角了,试着把s1上面的(125,125)这一点进行转换
    Vec2 wa = s1->convertToWorldSpaceAR(Vec2(125, 125));
    log("world anchor: x = %f, y = %f", wa.x, wa.y);    //输出(275, 275)
    Vec2 na = s1->convertToNodeSpaceAR(wa);
    log("node anchor: x = %f, y = %f", na.x, na.y); //输出(125, 125)

    //convertToUI中传入的是opengl坐标系,因为opengl坐标和世界坐标系是相同的,所以我们传入世界坐标
    //屏幕分辨率为(480, 320)
    Vec2 ui = Director::getInstance()->convertToUI(wv_s2);
    log("ui s2: x = %f, y = %f", ui.x, ui.y);       //输出(252.5, 105)
    Vec2 opengl = Director::getInstance()->convertToGL(ui);
    log("opengl s2: x = %f, y = %f", opengl.x, opengl.y);   //输出(252.5, 215)

    //补充一点: Sprite::create(const std::string& filename, const Rect& rect)
    //只获取图片的一部分创建精灵,第二个参数rect的坐标原点是图片的左上角
    Sprite* s3 = Sprite::create("HelloWorld.png", Rect(0, 0, 100, 100));
    s3->setPosition(Vec2(400, 100));
    addChild(s3);

    return true;
}

Cocos2dx 世界、屏幕、openGL、本地等坐标系_第1张图片

你可能感兴趣的:(Cocos2dx)