【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游戏开发】之坐标系(一) 点击这里

【cocos2dx游戏开发】之 坐标系(二) convertToNodeSpace和convertToWorldSpace

时间: 2024-08-09 02:08:36

【cocos2dx游戏开发】之 坐标系(二) convertToNodeSpace和convertToWorldSpace的相关文章

cocos2d-x 游戏开发之坐标系

cocos2d-x 游戏开发之坐标系 坐标系很令人迷糊.特记录如下. 说明: 1)cocos2d-x的坐标系是右手系. 2)初始化场景时通过下面的函数得到显示范围左下角(VisibleOrigin)坐标: Point origin = Director::getInstance()->getVisibleOrigin(); 3)初始化场景时通过下面的函数得到显示范围(VisibleSize)尺寸: Size visibleSize = Director::getInstance()->getV

cocos2dx游戏开发——微信打飞机学习笔记(二)——游戏框架

一.游戏的基本框架: WelcomeScene    ——>    GameScene   ——>   GameOverScene ||                                       ||                                    || ∨                                      ∨                                   ∨ WelcomeLayer            

cocos2d-x 游戏开发之有限状态机(FSM) (二)

cocos2d-x 游戏开发之有限状态机(FSM)  (二) 1 状态模式 State是状态基类.它其实是一个接口,它有3个实现类,分别对应每个状态.Monkey类只需要维护State类,而具体的行为通过3个实现类完成.这就是多态.下面是完整的代码: 2 状态基类 // State.h // #ifndef STATE_H_ #define STATE_H_ class Monkey; struct State { virtual void execute(Monkey *mk) = 0; };

cocos2dx游戏开发——别踩白块学习笔记(二)——经典模式的实现

一.创建GameScene以及GameLayer 就是简单创建一个Scene而已,在此就不多说啦~,可以参照我的打飞机的学习笔记(2). 二.添加一个开始栏 很简单,就是调用Block中的create方法就可以啦~,只是需要传入大小和颜色等等的参数即可. void GameLayer::addStartLine() { auto block = Block::createWithArgs(Color3B::YELLOW, Size(visibleSize.width,visibleSize.he

Cocos2d-x游戏开发技术精解读书摘要(2016-5-27 10:52)

 Cocos2d-x游戏开发技术精解 刘剑卓 著 2013年6月第1版 chap2 Cocos2d-x引擎的开发环境 2.1跨平台的开发 2.2建立开发环境 2.2.1 PC开发环境 2.2.2 Android开发环境 2.2.3 iOS开发环境 2.3引擎中的混合编译 2.3.1 Java与C++的混合编译 2.3.2 Objective-C与C++的混合编译 2.4引擎的起点 2.4.1应用程序入口 2.4.2引擎应用入口 2.5丰富的示例程序 2.5.1 TestCpp示例项目 2.5

cocos2dx游戏开发学习笔记2-从helloworld开始

一.新建工程 具体安装和新建工程的方法在cocos2dx目录下的README.md文件中已经有详细说明,这里只做简单介绍. 1.上官网下载cocos2dx-3.0的源码,http://www.cocos2d-x.org/ 2.安装python2.7 3.运行setup.py安装 4.执行cocos new helloworld -p helloworld -l cpp,生成新工程 二.新建工程中包含的东西 -Classes AppDelegate.cpp      -----游戏真正开始执行的地

cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建

一.场景与层的关系: cocos2dx的框架可以说主要由导演,场景,层,精灵来构成: 1.其中导演,意如其名,就是操控整个游戏的一个单例,管理着整个游戏. 2.场景就像电影的一幕剧情,所以说,懂得如何划分好游戏的场景,是开始动手做游戏的第一步. 3.一个场景会有很多层,用来处理场景不同的功能. 4.而精灵则是最小的单位,比如子弹,飞机,敌机都是一个个的精灵所组成的.   二.WelcomeScene的搭建: 1.场景和层的二种搭建方法: (1)一种就是跟HelloWorld示例一样的方法,以一个

cocos2dx游戏开发——微信打飞机学习笔记(一)——开发准备

一.环境的搭建 1.Windows开发准备: (1)软件下载及安装 •下载Cocos2d-x 最新版本:http://www.cocos2d-x.org/download 或者从Cocos2d-x GitHub主页中克隆Develop分支:https://github.com/cocos2d/cocos2d-x •配置Python 2.7 环境:http://www.python.org/download/releases/ •建议IDE:Visual Studio 2013 •运行cocos2

cocos2dx游戏开发——设计模式

一.二段设计模式 二段构建模式就是将内存空间的分配和初始化分开来完成,然后调用一个静态方法来返回这个对象. 调用Sprite::create()的时候内部先使用new来分配内存空间,然后调用init方法来初始化一些变量的设置.所以cocos2dx中的二段构建模式就是将new分配内存空间和init初始化内容分开来处理,而不是c++传统的做法在构造函数中初始化变量. Sprite* Sprite::create() { Sprite *sprite = new Sprite(); if (sprit