zoukankan      html  css  js  c++  java
  • 【COCOS2DX-游戏开发之三一】之 坐标系(下) convertToNodeSpace和convertToWorldSpace

    游戏中常常会用到一些变换:

    游戏中武器和角色在一个layer上,为了效率。会考虑将bullet, effect和 PhysicsParticle分别放到不用的层上,相应的层上使用batchnode来提高效率

    武器和PhysicsParticleLauncher(粒子发射器)绑定,发射的时候。会向PhysicsParticleLayer的武器同样的位置上生成一个物理粒子特效


    会常常常使用到convertToNodeSpace和convertToWorldSpace转换坐标


    我们加三个sprite,r0,r1,r2,

    r0的父节点是layer, 父节点下坐标(0,0,100,100)

    r1的父节点是r0,父节点下坐标(0,0,100,100)

    r2的父节点是r1。父节点下坐标(0,0,100,20)


    bool HelloWorld::init()
    {
        //////////////////////////////
        // 1. super init first
    	if ( !Layer::init() ) {
            return false;
        }
        
        // r0增加到根节点上(Layer) 坐标(0,0)
        Sprite* r0 = Sprite::create("data/pic/gun.png");
        r0->setAnchorPoint(Point(0.f, 0.f));
        this->addChild(r0);
        
        // r1增加到r0上
        Sprite* r1 = Sprite::create("data/pic/gun.png");
        r1->setAnchorPoint(Point(0.f, 0.f));
        r1->setPosition(Point(100, 0));
        r0->addChild(r1);
        
        // r2增加到r1上
        Sprite* r2 = Sprite::create("data/pic/gun.png");
        r2->setAnchorPoint(Point(0.f, 0.f));
        r2->setPosition(Point(100, 20));
        r1->addChild(r2);
        
    }

    怎样将r2的坐标转换为世界坐标?

    怎样将r2的坐标转换为r0的局部坐标?

        // 获得r2的世界坐标,两种方法
        // 方法1:以r2坐标系为起点。向根节点(世界坐标)变换,坐标必须为(0,0)
        Point p2world = r2->convertToWorldSpace(Point(0, 0));
        
        // 方法2:以r1坐标系为起点。向根节点(世界坐标)变换,坐标为r2在父节点r1内的坐标
        p2world = r1->convertToWorldSpace(r2->getPosition());
        
        // 获得r2在r0坐标系中的坐标
        // convertToNodeSpace要传入的坐标为世界坐标
        Point pt = r0->convertToNodeSpace(p2world);


    方法如上:

    工作原理详见cocos2dx代码

    Point Node::convertToWorldSpace(const Point& nodePoint) const
    {
        kmMat4 tmp = getNodeToWorldTransform();
        kmVec3 vec3 = {nodePoint.x, nodePoint.y, 0};
        kmVec3 ret;
        kmVec3Transform(&ret, &vec3, &tmp);
        return Point(ret.x, ret.y);
    
    }
    
    kmMat4 Node::getNodeToWorldTransform() const
    {
        kmMat4 t = this->getNodeToParentTransform();
    
        for (Node *p = _parent; p != nullptr; p = p->getParent())
            kmMat4Multiply(&t, &p->getNodeToParentTransform(), &t);
    
        return t;
    }


    cocos2d-x 坐标系具体解释:http://www.tairan.com/archives/3367


    【cocos2dx游戏开发】之坐标系(一) 点击这里

  • 相关阅读:
    指针与数组实例练习(指针运算)
    C语言数组和函数实例练习(二)
    C语言数组和函数实例练习(一)
    近一个月的学习总结(4.8—5.12)
    Java网页小程序——Java Applet
    数据结构(二)线性表——链表
    JDBC的使用(MySQL数据库)
    Python变量类型及变量
    Shell编程语法
    文本处理三剑客
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10782722.html
Copyright © 2011-2022 走看看