[置顶] 【玩转cocos2d-x之十】cocos2d-x坐标系

cocos2d-x OpenGL坐标系 绝对坐标系 相对坐标系 屏幕坐标系

目录(?)[+]

原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12830971

cocos2d-x采用的是笛卡尔平面坐标系,也就是平面上两条垂直线构成的坐标系,平面上任意一点都可以用(x,y)来表示。

(1)就坐标系方向而言,cocos2d-x分为屏幕坐标系和OpenGL坐标系。

(2)就节点本身而言,cocos2d-x分为绝对坐标系和相对坐标系。

1.屏幕坐标系

屏幕坐标系,也叫UIKit坐标系,原点在屏幕左上,x轴向右,y轴向下。cocos2d-x的屏幕触摸事件传入的位置坐标就是采用了屏幕坐标系。以320*480的屏幕为例,如图坐标值为屏幕坐标系。

2.OpenGL标系

OpenGL坐标系原点在屏幕的左下,x轴向右,y轴向上。cocos2d-x的元素采用的就是OpenGL坐标系。同样的上例,如图坐标值为OpenGL坐标系。

3.屏幕坐标系和OpenGL坐标系的转换

它们的转换导演类(CCDirector)已经封装好了两个函数供我们使用。

[cpp] view plaincopy

//UIKit To OpenGL
CCPoint convertToGL(const CCPoint& obPoint);
//OpenGL To UIKit
CCPoint convertToUI(const CCPoint& obPoint);  

4.绝对坐标系

绝对坐标系也叫世界坐标系,从名字可以看来,绝对坐标系是一个恒坐标系,不参考也不依赖于其他坐标系。在cocos2d-x中它使用的是OpenGL坐标系。不过因为我们多在CCLayer上放置游戏元素,所以一般比较少直接用到绝对坐标系。

5.相对坐标系

cocos2d-x元素是有层次关系的,节点使用的是相对父节点的位置坐标,也就是相对坐标系(也叫本地坐标系),屏幕绘制的时候,cocos2d-x会自动将相对坐标系转换为绝对坐标系,渲染到屏幕的绝对位置上。

6.锚点

在举例之前有必要先了解一下锚点这个概念。锚点是对节点而言的,它是节点的一个属性,表明了节点位置的一个参考基准点,同样放置一个物体在(300,300)这个位置,不同的锚点会产生不同的效果。节点的默认锚点位置在(0.5,0.5)。锚点和节点的位置值没有关系,锚点只是影响了节点在屏幕上渲染的位置。如下图,虽然精灵的在屏幕上渲染的位置不一样,但是它们的position值是一样的,都是(300,300)。锚点只会影响它本身在父节点中的渲染位置,而不会影响其子节点的相对它本身的位置。

7.绝对坐标系和相对坐标系的关系

我们先看一个例子,为了方便演示,节点的锚点都设置为(0,0)。

[cpp] view plaincopy

CCSprite* big=CCSprite::create("big.png");
big->setAnchorPoint(ccp(0,0));
big->setPosition(ccp(50,50));//设置在相对父节点的(50,50)位置
this->addChild(big);//屏幕是父节点
CCSprite* little=CCSprite::create("little.png");
little->setAnchorPoint(ccp(0,0));
little->setPosition(ccp(50,50));//设置在相对父节点的(50,50)位置
big->addChild(little);//big是父节点  

效果如下:

8.绝对坐标系和相对坐标系的转换

CCNode提供给我们相对坐标系和绝对坐标系的转换函数。

[cpp] view plaincopy

CCPoint convertToNodeSpace(const CCPoint& worldPoint);  //将世界坐标转换为对象节点内坐标,忽略锚点,以当前父节点左下角坐标为标准
CCPoint convertToWorldSpace(const CCPoint& nodePoint);  //将对象节点内坐标转换为事件坐标,忽略锚点,以当前父节点左下角坐标为标准
CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint);//将世界坐标转换为基于锚点的对象节点内坐标
CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint);//将局域锚点的对象节点内坐标转换为世界坐标  

如果要获取big和little的绝对坐标

[cpp] view plaincopy

CCPoint wp1=this->convertToWorldSpace(big->getPosition());//wp1(50,50)
CCPoint wp2=big->convertToWorldSpace(little->getPosition());//wp2(100,100)  

如果要把绝对坐标转换为big和little的相对坐标

[cpp] view plaincopy

CCPoint np1=big->convertToNodeSpace(ccp(200,200));//np1(150,150)
CCPoint np2=little->convertToNodeSpace(ccp(200,200));//np2(100,100)
时间: 2024-08-06 09:08:36

[置顶] 【玩转cocos2d-x之十】cocos2d-x坐标系的相关文章

等高列布局、水平垂直居中与置顶页脚(转载)

等高列布局 在<八种创建等高列布局>一文中详细介绍了八种创建等高列布局的不同方法.可以说这些方法足以满足你的业务需求,当然其中有一些方法略为繁琐,也有时转得人头晕.在今天这种技术环境之下,如果的业务对IE低版本依赖性不是非常强的情况之下,可以考虑一些新的方法来实现.接下来我与大家一起探讨几种新方法实现等高列布局. Flexbox方式 Flexbox是一个强大而又神奇的CSS3模块,而且到现在,也得到众开浏览器的支持.有了这个模块,可以帮助我们做很多事情,而且较之以前的方案要更简单,唯一蛋疼的是

Mysql数据库实现的简单置顶

Mysql数据库实现的简单置顶 1. 问题背景:小编要做一个文章管理的简单网页,用的是Mysql数据库.其中需要文章置顶功能,如图: 2. 最初的思路:机智的小编立刻大脑飞速运转,很快想到为存储文章的"article"表设定一个(int)型的"isTop"属性,0表示不置顶,大于0表示置顶且数字越大,优先级越高.显示的时候只需按照"isTop"降序显示.当用户需要将"id"为"001"的文章置顶时,后台只需

自定义置顶TOP按钮

简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #GoTop{                width:40px;                height:40px;                background-color:#F59E1D;                position:fixed;                bottom:

iOS使用UIPageViewController结合多个UITableView后点击状态栏无法让UITableView置顶问题

页面结构:1个UIPageViewController含多个其他ViewController,每个ViewController中又包含了一个UITableView 问题:无法通过点击状态栏,让当前UITableView内容置顶 原因:UIPageViewController帮助我们管理了多个ViewController,本质上在UIPageViewController的view中包含多多个ViewController中的UITableView.由于每个UITableView的scrollsToT

[Android新手区] android里面EditTex多行输入及输入置顶问题

在麦子学院android交流群里面有人问edittex多行输入及输入置顶的问题,其实这个效果很好的实现的,现在跟说说: 在EditText里面添加android:minLines="3"即可,但是现实效果如下: 如果想要使输入从顶部开始,可以在xml文件里面添加一句 android:gravity="Top"即可.效果如下:

页面开启自启动置顶显示,页面持续获得焦点

首先讲一下本文的使用背景,现有以下需求: 将一个展示页面开机后自动全屏显示,要求运行期间不允许有任何弹窗弹出遮挡住页面,且页面应保持焦点以保证键盘可以操作页面. 开机自动启动我们可以将需要打开的页面的快捷方式或其他自启动的软件放在系统启动文件夹中,路径如下所示: C:\Users\WindowsUserNmae\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 其中"WindowsUserNmae"为使用电脑的用

WordPress 一键置顶文章(推荐用SM Sticky Clicky Star)

在 WordPress入门 之 发布新文章和管理文章 中,倡萌已经简单提到可以在文章编辑界面或者快速编辑界面设置置顶文章,但是如果你想在后台文章列表中添加一键置顶文章的功能,不妨试试 Quick Sticky 或 SM Sticky Clicky Star 插件. Quick Sticky 和 SM Sticky Clicky Star 都是用来给后台文章列表添加一键置顶文章功能的,一个较大的不同是,SM Sticky Clicky Star 支持 Ajax 无刷新设置,而 Quick Stic

变量声明置顶规则、函数声明及函数表达式和函数的arguments属性初始化

一.变量声明和变量赋值: if (!("a" in window)) { var a = 1; } alert(a);//a为? 你可能认为alert出来的结果是1,然后实际结果是"undefined".要了解为什么,我们需要知道JavaScript里的3个概念: 1.所有的全局变量都是window的属性,语句 var a = 1;等价于window.a = 1; 可以用如下方式来检测全局变量是否声明: "变量名称" in window 2.声明

019 [工具软件]窗体置顶 DeskPins

DeskPins:Windows下将任何窗体置顶的工具 官方主页:https://efotinis.neocities.org/deskpins/index.html 官方下载的是一个exe安装包,用7zip直接提取即可用,不需要安装. 该软件使用简单,双击运行以后,单击托盘图标,鼠标变成一个图钉的样式,然后点击你想置顶的窗体任何部位即可. 窗体置顶以后,在右上角显示一个红色的图钉. 单击窗体右上角的红色图钉,即可取消置顶.此操作也可以通过快捷键ctrl+f11设置. 该软件作者已经开源,网址:

Tableciew的基本属性和侧滑(删除 置顶 更多)

#import <UIKit/UIKit.h> //使用tableview必须遵循的 @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> @property(strong,nonatomic) UITableView *tableview; //数据源 @property(strong,nonatomic) NSArray *students; @end #i