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

2013-12-10  来源:本站原创  分类:C 语言  人气:1 

这篇文章主要介绍了Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系,本文用代码和注释讲解了Cocos2d-x中的坐标体系,需要的朋友可以参考下

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

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

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

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;
}
相关文章
  • Cocos2d-x学习笔记之世界坐标系.本地坐标系.opengl坐标系.屏幕坐标系 2013-12-10

    这篇文章主要介绍了Cocos2d-x学习笔记之世界坐标系.本地坐标系.opengl坐标系.屏幕坐标系,本文用代码和注释讲解了Cocos2d-x中的坐标体系,需要的朋友可以参考下 cocos2d-x的坐标系很重要,想要学好该引擎,深入理解它的坐标体系很重要.注释写的很清楚了,对照上运行结果一块来看代码吧! bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); //opengl的坐标系和世界

  • 世界坐标系,本地坐标系,opengl坐标系,屏幕坐标系 2014-12-02

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

  • DB2 UDB V8.1管理学习笔记(二) 2013-10-29

    正在看的db2教程是:DB2 UDB V8.1管理学习笔记(二).表空间类型分为SMS和DMS,分别是system management space, database management space. SMS使用方便,简单,无需手工创建和维护数据存储文件.DMS需要手动指定container和存储数据的文件名,并保证有足够磁盘空间可用. 对于一个数据库,至少存在一个page size为4K的系统临时表空间,可以额外建立具有更大page size的用户临时表空间,系统会自动进行使用. 无法用a

  • CI框架学习笔记(一) - 环境安装.基本术语和框架流程 2013-11-19

    本文是CI框架学习笔记的第一篇,主要介绍了CI框架的环境安装,基本术语以及框架流程,非常的详细,有需要的朋友可以参考下 最开始使用CI框架的时候,就打算写一个CI源码阅读的笔记系列,可惜虎头蛇尾,一直没有行动.最近项目少,总算是有了一些时间去写一些东西.于是准备将之前的一些笔记和经验记录下来,一方面权作备忘,另一方面时刻提醒自己:借鉴和学习才有出路,忘记过去意味着背叛!基本术语说明 在本文开始之前,有必要对文中反复出现的术语做一个简单的说明,如果你对这一部分已经熟谙,完全可以略过.本文中反复出现

  • Cocos2d-x学习笔记之Hello World源码分析 2013-12-01

    这篇文章主要介绍了Cocos2d-x学习笔记之Hello World源码分析,接上一篇内容,本文着重分析源码文件,需要的朋友可以参考下 首先我们来说一下游戏的原理,游戏类似于一场电影,早期的电影不就是靠一张张的图片放出来的吗?把场景人物什么的画在一幅幅图片上,然后从第一张图片开始播放就可以了.游戏更是如此,其实我们玩的游戏看到的画面都是美工做出来的,我们程序员要做的事情是组织这些图片,比如先弄个背景图片,然后在某一个坐标上放置一个人物的图片,我们写好程序,控制这个图片的移动路径,等机器运行的时候

  • javascript学习笔记(一)基础知识 2013-12-16

    本文是学习笔记系列的第一篇,跟以前一样,介绍些基础知识,包括js基本概念. JScript 的变量.js的数据类型.3.JScript 的运算符.js流程控制.js函数.有需要的朋友可以参考下 基本概念 javascript是一门解释型的语言,浏览器充当解释器. js执行引擎并不是一行一行的执行,而是一段一段的分析执行. 延迟脚本 HTML4.0.1中定义了defer属性,它的用途是表明脚本在执行时不会影响页面的构造.也就是说,脚本会延迟到整个页面都解析完毕后再执行.因此,在<script>元

  • Lua中的string库和强大的模式匹配学习笔记 2014-03-08

    这篇文章主要介绍了Lua中的string库和强大的模式匹配学习笔记,本文着重总结了string库的一些操作方法和函数,需要的朋友可以参考下 lua原生解释器对字符串的处理能力是十分有限的,强大的字符串操作能力来自于string库.lua的string函数导出在string module中.在lua5.1,同时也作为string类型的成员方法,因此,我们既可以写成string.upper(s), 也可以s:upper(),选择你喜欢的写法. string.len(s)返回s的长度. string.

  • PHP学习笔记 (1) 环境配置与代码调试 2014-03-12

    学习php第一步就是需要配置php运行环境,这个是基础,需要的朋友可以参考下. 一配置PHP环境 1.了解什么是PHP PHP("PHP: Hypertext Preprocessor",超文本预处理器的字母缩写) PHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写.PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛的运用 2.PHP的背景和优势 PHP的发展背景 1).1994年由

  • javascript 学习笔记(四) 倒计时程序代码 2014-06-14

    javascript 学习笔记(四) 倒计时程序代码,需要的朋友可以参考下. 首先看全部完整代码: countDown test 截止日期 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] html部分代码: 可在文本框中输入倒计时的时间,如果当前时间小于截止时间,则正常返回,反之,则返回距离截止日期到现在的时间 <p> <label for="deadline">截止日期</label> <input type="text

  • 两千行代码的PHP学习笔记汇总 2014-06-22

    这篇文章主要介绍了两千行代码的PHP学习笔记汇总,由黑眼诗人整理汇总,包括了PHP学习中各类常见的技巧,非常具有实用价值,需要的朋友可以参考下 本文汇总了PHP学习中常见的各类问题,约有两千多行代码,都是非常实用的技巧.分享给大家供大家参考.具体如下: //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线分隔 // MIN_WIDTH 变量名建议用下划线方式分隔 // $var_name

  • Extjs学习笔记之三 extjs form更多的表单项 2014-07-30

    本文接着上讲Extjs学习笔记之二 Extjs之Form介绍Extjs的表单.Extjs除了类似普通的html form的表单项之外,还有一些功能更为丰富实用的表单项. 1.日期选择框,DateField 日期选择框在日常项目中被广泛应用,一个方便的日期输入机制能够极大的提高用户体验.Extjs的DateField非常友好灵活强大.可以通过如下代码新建一个日期选择框: new Ext.form.DateField({ id: 'diliveryDate', format: 'Y年m月d日', m

  • php学习笔记之基础知识 2014-10-27

    这篇文章主要介绍了php学习笔记的基础知识部分,需要的朋友可以参考下 php学习至今一年有余,笔记积累挺多的,也挺杂的,写篇文章整理一下吧. php基础部分 PHP 输出文本的基础指令:echo 和 print. echo和print的区别 echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用) echo 输出一个或者多个字符串. print 只能打印出简单类型变量的值(如int,string) print_r 可以打印出复杂类型变量的值(如数组

  • JavaScript高级程序设计 客户端存储学习笔记 2014-12-16

    JavaScript高级程序设计 客户端存储学习笔记,在客户端用于存储会话信息 第十九章 客户端存储 1.cookie ①最初是在客户端用于存储会话信息的. 1.1 限制 ①cookie在性质上是绑定在特定的域名下的.当设定了一个cookie后,再给创建它的域名发送请求时,都会包含这个cookie. ②cookie的限制: □IE6以及更低版本限制每个域名最多20个cookie. □IE7和之后版本每个域名最多50个cookie. □Firefox50个 □Opera50个 □Safari和Ch

  • Lua基础教程之赋值语句.表达式.流程控制.函数学习笔记 2015-02-13

    这篇文章主要介绍了Lua基础教程之赋值语句.表达式.流程控制.函数学习笔记,本文来自个人总结,需要的朋友可以参考下 赋值语句 注释,单行用(--)来表示:多行用(--[[ ... ]])来标示: 定义,lua中没有定义(申明数据类型),它是通过赋值来确定其数据类型的. 赋值,是改变一个变量的值和改变表域的最基本的方法. a = "hello" .. "world" Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变

  • Node.js中的模块机制学习笔记 2015-03-20

    这篇文章主要介绍了Node.js中的模块机制学习笔记,本文讲解了CommonJS模块规范.Node模块实现过程.模块调用栈.包与NPM等内容,需要的朋友可以参考下 Javascript自诞生以来,曾经没有人拿它当做一门编程语言.在Web 1.0时代,这种脚本语言主要被用来做表单验证和网页特效.直到Web 2.0时代,前端工程师利用它大大提升了网页上的用户体验,JS才被广泛重视起来.在JS逐渐流行的过程中,它大致经历了工具类库.组件库.前端框架.前端应用的变迁.Javascript先天就缺乏一项功

  • Redmine 学习笔记--安装篇 2011-07-25

    Redmine 学习笔记--安装篇 分类: 项目管理 2011-06-20 11:44 13人阅读 评论(0) 收藏 举报 Redmine的介绍我就不写了,不知道的可以Google或者百度一下. Redmine是做什么用的?简单点说,就是进行项目管理的一个系统,是B/S架构的. 由于这个系统的支撑系统比较多,安装相对复杂,经搜索,发现有一个叫BitNami的网站,提供了对于此类web service产品的捆绑打包安装,大大降低了安装难度.下面的说明也是基于BitNami的. 1.进入网址: ht

  • shell 学习笔记(16) 2012-06-03

    转载请注明出处: http://my.codeweblog.com/leejun2005/blog/60726 注:以前的1-15连载部分放在百度空间, 目前百度空间已不支持博客搜索, 但你可以使用google搜索关键词: leejun_2005 shell学习笔记 1501.巧用bash的{}扩展备份目录: cp file.txt{,.bak} 1502.利用at执行一次性命令: echo "ls -l" | at midnight #Execute a command at a g

  • zendframework2学习笔记之安装篇 2013-01-24

    最近研究了下 zendframework2 感觉很惊艳 打算把自己的学习笔记整理下 首先下载zf2 http://framework.zend.com/downloads/latest 我本地是winxp +xampp 设置好php的环境变量后 在apache的conf文件内 建立一个虚拟主机目录 供zf网站使用 在hosts内建立一个域名指向zf网站 贴下我的conf配置文件 和hosts文件 注:本地使用了路由器 ip:192.168.1.35是本地内网ip <VirtualHost 192

  • Awk学习笔记 2013-03-16

    Awk学习笔记 整理:Jims of 肥肥世家 <[email protected] > Copyright © 2004 本文遵从GPL协议,欢迎转载.修改.散布. 第一次发布时间:2004年8月6日 博主笔:本人尊重作者的版权 1. awk简介 awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出.它支持用户自定义函数和 动态正则表达式等先进功能,是linux/unix下的一个强大编程工具.它在命令行中使用,但

  • Netty学习笔记 (实验篇)一 2013-06-11

    Netty 是一个网络应用框架,可以用来写高性能的服务器和客户端.个人感觉是对传输层协议(TCP/UDP)的一种封装,或者说是对JAVA中的OIO.NIO.AIO的封装.当然远不只这些只是我了解的还比较少.我搞Netty的目的就是学习JAVA网络编程,搞完底层搞框架,搞完框架再搞底层,最后的目标是设计一个简单的应用层协议.本人学生一枚,对Netty纯属个人爱好,文中要是有不对的地方还请各位大神多多指教. 一.如何学习Netty 关于Netty的资料网上并不多,不过努力找会发现很多不错的,下面这个