Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系

 更新时间:2014年09月11日 09:40:29   投稿:junjie  
这篇文章主要介绍了Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系,本文用代码和注释讲解了Cocos2d-x中的坐标体系,需要的朋友可以参考下

 cocos2d-x的坐标系很重要,想要学好该引擎,深入理解它的坐标体系很重要。注释写的很清楚了,对照上运行结果一块来看代码吧!

bool HelloWorld::init()
{
  bool bRet = false;
  do
  {

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

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

		//sprite1、sprite2的图片大小是100,100
		CCSprite * sprite1 = CCSprite::create("image1.png");
		sprite1->setPosition(ccp(100,100));

		//将sprite2添加到sprite1节点中,这时候是以sprite1的左下角为原点,虽然sprite1的锚点是在它图片的中间
		CCSprite * sprite2 = CCSprite::create("image2.png");
		//setPosition中设置的坐标是sprite2的本地坐标
		sprite2->setPosition(ccp(100,100));
		sprite1->addChild(sprite2);

		//getPosition中获得的坐标也是sprite2的本地坐标
		CCPoint point = sprite2->getPosition();
		CCLog("point.x=%f,point.y=%f",point.x,point.y);

		//获得sprite2的opengl坐标系,屏幕坐标系,世界坐标系,本地坐标系

		//convertToWorldSpace的传入参数是sprite2的节点坐标系(本地坐标),也就是setPosition中传入的参数,而convertToNodeSpace的传入参数是sprite2的世界坐标系,看清谁是调用者,传入的参数又是什么
		CCPoint worldSpace = sprite1->convertToWorldSpace(point);
		CCPoint nodeSpace = sprite1->convertToNodeSpace(worldSpace);

		//以下俩个函数完成同样的功能,只不过这次的sprite2的坐标是基于sprite1的锚点的,而不是左下角了,所以我们传入了ccp(50,50)
		CCPoint worldSpaceAR = sprite1->convertToWorldSpaceAR(ccp(50,50));
		CCPoint nodeSpaceAR = sprite1->convertToNodeSpaceAR(worldSpaceAR);

		//convertToUI中传入的是opengl坐标系,因为opengl坐标和世界坐标系是相同的,所以我们传入世界坐标
		CCPoint ui = CCDirector::sharedDirector()->convertToUI(worldSpace);
		CCPoint opengl = CCDirector::sharedDirector()->convertToGL(ui);

		CCLog("opengl.x=%f,opengl.y=%f",opengl.x,opengl.y);
		CCLog("ui.x=%f,ui.y=%f",ui.x,ui.y);
		CCLog("worldspace.x=%f,worldspace.y=%f",worldSpace.x,worldSpace.y);
		CCLog("nodeSpace.x=%f,nodeSpace.y=%f",nodeSpace.x,nodeSpace.y);
		CCLog("worldspaceAR.x=%f,worldspaceAR.y=%f",worldSpaceAR.x,worldSpaceAR.y);
		CCLog("nodeSpaceAR.x=%f,nodeSpaceAR.y=%f",nodeSpaceAR.x,nodeSpaceAR.y);

		this->addChild(sprite1);

    bRet = true;
  } while (0);

  return bRet;
}

相关文章

  • C++之WSAAsyncSelect模型实例

    C++之WSAAsyncSelect模型实例

    这篇文章主要介绍了C++的WSAAsyncSelect模型,实例讲述了socket与Windows消息机制的用法,需要的朋友可以参考下
    2014-10-10
  • C++中的struct和class的区别详解

    C++中的struct和class的区别详解

    这篇文章主要介绍了C++中的struct和class的区别详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • C++ 将一个文件读入数组再读出数组的方法

    C++ 将一个文件读入数组再读出数组的方法

    今天小编就为大家分享一篇C++ 将一个文件读入数组再读出数组的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C字符串函数对应的C++ string操作详解

    C字符串函数对应的C++ string操作详解

    在本篇文章里小编给大家整理的是一篇关于C字符串函数对应的C++ string操作知识点内容,有兴趣的朋友们学习下。
    2020-01-01
  • C语言MultiByteToWideChar和WideCharToMultiByte案例详解

    C语言MultiByteToWideChar和WideCharToMultiByte案例详解

    这篇文章主要介绍了C语言MultiByteToWideChar和WideCharToMultiByte案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 字符串拷贝函数memcpy和strncpy以及snprintf 的性能比较

    字符串拷贝函数memcpy和strncpy以及snprintf 的性能比较

    以下是对字符串拷贝函数memcpy和strncpy以及snprintf它们之间的性能进行了比较,需要的朋友可以过来参考下
    2013-07-07
  • C语言一看就懂的指针与结构体介绍

    C语言一看就懂的指针与结构体介绍

    指针提供了对地址操作的一种方法,因此,使用指针可使得C语言能够更高效地实现对计算机底层硬件的操作。另外,通过指针可以更便捷地操作数组。C数组允许定义可存储相同类型数据项的变量,结构是C编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项
    2022-04-04
  • C++深入浅出讲解缺省参数

    C++深入浅出讲解缺省参数

    所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。缺省参数使用主要规则:调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数
    2022-07-07
  • 详解VS2019使用scanf()函数报错的解决方法

    详解VS2019使用scanf()函数报错的解决方法

    本文主要介绍了详解VS2019使用scanf()函数报错的解决方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C语言数据结构递归之斐波那契数列

    C语言数据结构递归之斐波那契数列

    这篇文章主要介绍了C语言数据结构递归之斐波那契数列的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10

最新评论