`

Cocos2d-JS坐标系

阅读更多

在图形图像和游戏应用开发中坐标系是非常重要的,我们在Android和iOS等平台应用开发的时候使用的二维坐标系它的原点是在左上角的。而在Cocos2d-JS坐标系中它原点是在左下角的,而且Cocos2d-JS坐标系又可以分为:世界坐标和模型坐标。
UI坐标
UI坐标就是Android和iOS等应用开发的时候使用的二维坐标系。它的原点是在左上角的。

UI坐标

UI坐标原点是在左上角,x轴向右为正,y轴向下为正。我们在Android和iOS等平台使用的视图、控件等都是遵守这个坐标系。然而在Cocos2d-JS默认不是采用UI坐标,但是有的时候也会用到UI坐标,例如在触摸事件发生的时候,我们会获得一个触摸对象(Touch),触摸对象(Touch)提供了很多获得位置信息的方法,如下面代码所示:
var touchLocation = touch.getLocationInView();
使用getLocationInView()方法获得触摸点坐标事实上就是UI坐标,它的坐标原点在左上角。


OpenGL坐标
我们在上面提到了OpenGL坐标,OpenGL坐标是种三维坐标。由于Cocos2d-JS的JSB是采用OpenGL渲染,因此默认坐标就是OpenGL坐标,只不过只采用两维(x和y轴)。如果不考虑z轴,OpenGL坐标的原点在左下角。

 OpenGL坐标



我们会通过一个触摸对象(Touch)获得OpenGL坐标位置,如下面代码所示:

[html] view plaincopy
 
 
  1. var touchLocation = touch.getLocation();  

提示  三维坐标根据z轴的指向不同分为:左手坐标和右手坐标。右手坐标是z轴指向屏幕外,如3-49左图所示。左手坐标是z轴指向屏幕里,如下图所示。OpenGL坐标是右手坐标,而微软平台的Direct3D[ Direct3D(简称:D3D)是微软公司在Microsoft Windows操作系统上所开发的一套3D绘图编程接口,是DirectX的一部份,目前广为各家显卡所支持。与OpenGL同为计算机绘图软件和计算机游戏最常使用的两套绘图编程接口之一。—— 引自于维基百科 http://zh.wikipedia.org/wiki/Direct3D]是左手坐标。

三维坐标

世界坐标和模型坐标
由于OpenGL坐标有可以分为:世界坐标和模型坐标,所以Cocos2d-JS的坐标也有世界坐标和模型坐标。
你是否有过这样的问路经历:张三会告诉你向南走一公里,再向东走500米。而李四会告诉你向右走一公里,再向左走500米。这里两种说法或许都可以找到你要寻找的地点。张三采用的坐标是世界坐标,他把地球作为参照物,表述位置使用地理的东、南、西和北。而李四采用的坐标是模型坐标,他让你自己作为参照物,表述位置使用你的左边、你的前边、你的右边和你的后边。
我们看看下图,从图中可以看到A的坐标是(5,5),B的坐标是(6,4),事实上这些坐标值就是世界坐标。如果采用A的模型坐标来描述B的位置,则B的坐标是(1,-1)。

 

世界坐标和模型坐标


有的时候我们需要将世界坐标与模型坐标互相转换。我们可以通过Node对象如下方法实现:
{cc.Point} convertToNodeSpace(worldPoint)。将世界坐标转换为模型坐标。
{cc.Point} convertToNodeSpaceAR(worldPoint)。将世界坐标转换为模型坐标。AR表示相对于锚点。
{cc.Point} convertTouchToNodeSpace(touch)。将世界坐标中触摸点转换为模型坐标。
{cc.Point} convertTouchToNodeSpaceAR(touch)。将世界坐标中触摸点转换为模型坐标。AR表示相对于锚点。
{cc.Point} convertToWorldSpace(nodePoint)。将模型坐标转换为世界坐标。
{cc.Point} convertToWorldSpaceAR(nodePoint)。将模型坐标转换为世界坐标。AR表示相对于锚点。


下面我们通过两个例子了解一下世界坐标与模型坐标互相转换。

1、世界坐标转换为模型坐标

如图所示是世界坐标转换为模型坐标实例运行结果。

世界坐标转换为模型坐标

在游戏场景中有两个Node对象,其中Node1的坐标是(400, 500),大小是300 x 100像素。Node2的坐标是(200, 300),大小也是300 x 100像素。这里的坐标事实上就是世界坐标,它的坐标原点是屏幕的左下角。
编写代码如下:

[html] view plaincopy
 
 
  1. var HelloWorldLayer = cc.Layer.extend({  
  2.     sprite: null,  
  3.     ctor: function () {  
  4.         this._super();  
  5.   
  6.   
  7.         var size = cc.winSize;  
  8.         var closeItem = new cc.MenuItemImage(  
  9.             res.CloseNormal_png,  
  10.             res.CloseSelected_png,  
  11.             function () {  
  12.                 cc.log("Menu is clicked!");  
  13.             }, this);  
  14.         closeItem.attr({  
  15.             x: size.width - 20,  
  16.             y: 20,  
  17.             anchorX: 0.5,  
  18.             anchorY: 0.5  
  19.         });  
  20.         var menu = new cc.Menu(closeItem);  
  21.         menu.x = 0;  
  22.         menu.y = 0;  
  23.         this.addChild(menu, 1);  
  24.   
  25.   
  26.             //创建背景  
  27.         var bg = new cc.Sprite(res.bg_png);                                     ①  
  28.         bg.setPosition(size.width / 2, size.height / 2);  
  29.         this.addChild(bg, 2);                                               ②  
  30.   
  31.   
  32.             //创建Node1  
  33.         var node1 = new cc.Sprite(res.node1_png);                               ③  
  34.         node1.setPosition(400, 500);  
  35.         node1.setAnchorPoint(1.0, 1.0);  
  36.         this.addChild(node1, 2);                                            ④  
  37.   
  38.   
  39.             //创建Node2  
  40.         var node2 = new cc.Sprite(res.node2_png);                               ⑤  
  41.         node2.setPosition(200, 300);  
  42.         node2.setAnchorPoint(0.5, 0.5);  
  43.         this.addChild(node2, 2);                                            ⑥  
  44.   
  45.   
  46.         var point1 = node1.convertToNodeSpace(node2.getPosition());             ⑦  
  47.         var point3 = node1.convertToNodeSpaceAR(node2.getPosition());               ⑧  
  48.   
  49.   
  50.         cc.log("Node2 NodeSpace = (" + point1.x + "," + point1.y + ")");  
  51.         cc.log("Node2 NodeSpaceAR =  (" + point3.x + "," + point3.y + ")");  
  52.   
  53.   
  54.         return true;  
  55.     }  
  56. });  

代码①~②行是创建背景精灵对象,这个背景是一个白色900 x 640像素的图片。代码第③~④行是创建Node1对象,并设置了位置和锚点属性。代码第⑤~⑥行是创建Node2对象,并设置了位置和锚点属性。第⑦行代码将Node2的世界坐标转换为相对于Node1的模型坐标。而第⑧行代码是类似的,它是相对于锚点的位置。
运行结果如下:
JS: Node2 NodeSpace = (100,-100)
JS: Node2 NodeSpaceAR =  (-200,-200)
结合上图我们解释一下,Node2的世界坐标转换为相对于Node1的模型坐标,就是将Node1的左下角作为坐标原点(如下图中的A点),我们不难计算出A点的世界坐标是(100, 400),那么convertToNodeSpace方法就是A点坐标减去C点坐标,结果是(-100,100)。
而convertToNodeSpaceAR方法要考虑锚点,因此坐标原点是B点,B点坐标减去C点坐标,结果是(-200, -200)。
2、模型坐标转换为世界坐标
下图所示是模型坐标转换为世界坐标实例运行结果。

模型坐标转换为世界坐标

在游戏场景中有两个Node对象,其中Node1的坐标是(400, 500),大小是300 x 100像素。Node2是放置在Node1中的,它对于Node1的模型坐标是(0, 0),大小是150 x 50像素。
编写代码如下:

[html] view plaincopy
 
 
  1. var HelloWorldLayer = cc.Layer.extend({  
  2.     sprite: null,  
  3.     ctor: function () {  
  4.         this._super();  
  5.         var size = cc.winSize;  
  6.         var closeItem = new cc.MenuItemImage(  
  7.             res.CloseNormal_png,  
  8.             res.CloseSelected_png,  
  9.             function () {  
  10.                 cc.log("Menu is clicked!");  
  11.             }, this);  
  12.         closeItem.attr({  
  13.             x: size.width - 20,  
  14.             y: 20,  
  15.             anchorX: 0.5,  
  16.             anchorY: 0.5  
  17.         });  
  18.         var menu = new cc.Menu(closeItem);  
  19.         menu.x = 0;  
  20.         menu.y = 0;  
  21.         this.addChild(menu, 1);  
  22.   
  23.   
  24.             //创建背景  
  25.         var bg = new cc.Sprite(res.bg_png);  
  26.         bg.setPosition(size.width / 2, size.height / 2);  
  27.         this.addChild(bg, 2);  
  28.   
  29.   
  30.                 //创建Node1  
  31.         var node1 = new cc.Sprite(res.node1_png);  
  32.         node1.setPosition(400, 500);  
  33.         node1.setAnchorPoint(0.5, 0.5);  
  34.         this.addChild(node1, 2);          
  35.   
  36.   
  37.             //创建Node2  
  38.         var node2 = new cc.Sprite(res.node2_png);     
  39.         node2.setPosition(0, 0);                                            ①  
  40.         node2.setAnchorPoint(0, 0); ;                                       ②  
  41.   
  42.   
  43.         node1.addChild(node2, 2);                                           ③  
  44.   
  45.   
  46.         var point2 = node1.convertToWorldSpace(node2.getPosition());                ④  
  47.         var point4 = node1.convertToWorldSpaceAR(node2.getPosition());              ⑤  
  48.   
  49.   
  50.         cc.log("Node2 WorldSpace = (" + point2.x + "," + point2.y + ")");  
  51.         cc.log("Node2 WorldSpaceAR =  (" + point4.x + "," + point4.y + ")");  
  52.   
  53.   
  54.         return true;  
  55.     }  
  56. });  



上述代码我们主要关注第③行,它是将Node2放到Node1中,这是与之前的代码的区别。这样第①行设置的坐标就变成了相对于Node1的模型坐标了。
第④行代码将Node2的模型坐标转换为世界坐标。而第⑤行代码是类似的,它是相对于锚点的位置。
运行结果如下:
JS: Node2 WorldSpace = (250,450)
JS: Node2 WorldSpaceAR =  (400,500)
图所示的位置,可以用世界坐标描述。代码①~③行修改如下:
node2->setPosition(Vec2(250, 450));
node2->setAnchorPoint(Vec2(0.0, 0.0));

this->addChild(node2, 0);

 

 

 

 

更多内容请关注最新Cocos图书《Cocos2d-x实战:JS卷——Cocos2d-JS开发

本书交流讨论网站:http://www.cocoagame.net

欢迎加入Cocos2d-x技术讨论群:257760386

更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com

 

 

 

《Cocos2d-x实战 JS卷》现已上线,各大商店均已开售:

京东:http://item.jd.com/11659698.html

欢迎关注智捷iOS课堂微信公共平台,了解最新技术文章、图书、教程信息

分享到:
评论

相关推荐

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    Cocos2d-JS游戏开发

    Cocos2d-JS是一款强大的2D游戏开发框架,它结合了JavaScript的灵活性与Cocos2d-x的高效性能,让开发者能够轻松地创建跨平台的游戏。本篇将深入探讨Cocos2d-JS的游戏开发知识,从基础到进阶,帮助你掌握这一利器。 ...

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    《Cocos2d-x实战 JS卷 Cocos2d-JS开发》是一本深入探讨Cocos2d-x游戏引擎JavaScript版本使用的专业书籍。Cocos2d-x是全球范围内广泛采用的游戏开发框架,尤其适用于2D游戏的制作,而Cocos2d-JS则是其JavaScript接口...

    Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整

    由于Cocos2d-x支持多种编程语言(包括C++、JavaScript和Lua),Cocos2d-JS意味着开发者可以采用JavaScript来构建游戏项目。 4. PDF电子书下载:这是提供给读者的下载格式,即PDF(便携式文档格式),它是一种通用的...

    Cocos2d-JS开发之旅 从HTML 5到原生手机游戏 PDF 带书签目录 完整版

    Cocos2d-JS是Cocos2d-x引擎的一个分支,它结合了JavaScript的易用性和C++的高性能,为游戏开发提供了一个高效、便捷的解决方案。 首先,Cocos2d-JS的核心概念包括场景(Scene)、层(Layer)、精灵(Sprite)、动作...

    《Cocos2d-Js开发之旅-从HTML5到原生手机游戏》完整源码

    Cocos2d-Js是Cocos2d-x家族的一员,是一个跨平台的、基于JavaScript的开源游戏引擎,支持创建2D游戏、交互式图书和其他富媒体应用。通过Cocos2d-Js,开发者可以用一种语言编写代码,然后在多个平台上运行,包括Web、...

    Cocos2d-JS---demo

    Cocos2d-JS 是一个基于 JavaScript 的游戏开发框架,它是 Cocos2d-x 的 JavaScript 版本。这个“Cocos2d-JS---demo”压缩包包含的是使用 Cocos2d-JS 开发的游戏或应用的示例,用于展示其功能和效果。通过将这些 demo...

    Cocos2d-JS开发之旅完整版pdf

    Cocos2d-JS是Cocos2d-x项目的一部分,是一个跨平台的游戏开发框架,它将JavaScript和C++的优势结合在一起,使得开发者可以用JavaScript编写代码,同时享受到高性能的原生应用体验。该框架支持创建2D游戏、教育应用、...

    Cocos2d-js项目教程和Cocos2d-JS开发之旅 从HTML 5到原生手机游戏 PDF 带书签目录 完整版

    Cocos2d-js是Cocos2d-x家族的一员,是一个跨平台的游戏开发框架,它将JavaScript与C++相结合,使得开发者能够用JavaScript编写游戏,并在HTML5、Android和iOS等多平台上运行。本教程旨在深入解析Cocos2d-js的使用...

    Cocos2d-x实战 JS卷

    《Cocos2d-x实战 JS卷》是一本深入探讨Cocos2d-x游戏开发的专著,主要聚焦于使用JavaScript语言进行游戏编程。Cocos2d-x是一个开源的游戏开发框架,广泛应用于移动设备和桌面平台,支持iOS、Android、Windows等多...

    《Cocos2d-x实战 JS卷 Cocos2d-js开发》随书源码下

    《Cocos2d-x实战 JS卷 Cocos2d-js开发》是一本专注于使用JavaScript进行Cocos2d-x游戏开发的专业书籍。随书源码包含了从第13章到第24章的示例代码,由于文件大小超出上传限制,源码被分为两个压缩包。在这些章节中,...

    cocos2d-x_v3.16安装及环境变量配置文档

    cocos2d-x 是一个开源的游戏开发框架,使用 C++ 语言编写,支持多平台发布,包括 iOS、Android、Windows、macOS、Linux 和 Web。cocos2d-x v3.16 是该框架的一个版本号,本文档主要介绍了该版本的安装流程以及环境...

    cocos2d-js/lua游戏【解密】套件

    《cocos2d-js/lua游戏解密套件详解》 在移动游戏开发领域,cocos2d-js和cocos2d-lua是常见的游戏引擎,它们为开发者提供了便捷的跨平台开发工具,使得游戏可以在iOS、Android等多个平台上运行。然而,随着游戏市场...

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    cocos2d-x 是一个跨平台的游戏开发框架,它基于C++,同时提供了Lua和JavaScript的绑定,让开发者可以方便地在多种操作系统上创建2D游戏、演示程序和其他图形交互应用。这个“cocos2d-x-3.8.zip”压缩包包含的是cocos...

    cocos2d-x windows vs2010配置

    首先,找开解压之后文件夹里的 template 文件夹,如下图红色圈所示:双击打开,路径是这样的:template, F:\cocos2d-1.0.1-x-0.9.1\template\msvc,我们要使用的就是 InstallWizardForVS2010.js 文件,双击安装即可...

    cocos2d-x API中文文档

    cocos2d-x是一个基于MIT许可证的开源游戏引擎,它以快速、简单且功能强大的特性闻名,允许开发者使用C++、Lua和JavaScript进行跨平台开发,支持包括iOS、Android、Windows Phone、Blackberry以及Tizen在内的多个平台...

    cocos2d-js 开发之旅-源代码

    cocos2d-js是Cocos2D跨平台游戏引擎的JavaScript版本,它为Web开发人员提供了一个强大的工具集,用于创建2D游戏、互动应用程序和可视化内容。 在cocos2d-js中,主要涉及以下几个核心知识点: 1. **场景(Scene)**...

    cocos2d-x-3.13.1 spine3.6.zip

    Cocos2d-x是一个广泛使用的开源游戏开发框架,它基于C++,同时支持Lua和JavaScript等多种脚本语言,为开发者提供了高效、跨平台的游戏开发解决方案。在3.13.1版本中,Cocos2d-x对Spine动画引擎的集成进行了更新,这...

    cocos2d-x-cocos2d-x-2.2.2.zip

    在cocos2d-x 2.2.2中,开发者可以利用C++语言进行编程,同时也支持Lua和JavaScript作为脚本语言,这大大增加了开发的灵活性。C++的性能优势结合脚本语言的易用性,使得游戏的开发过程既高效又便捷。同时,cocos2d-x...

    Cocos2d-x 3.x游戏开发实战pdf含目录

    《Cocos2d-x 3.x游戏开发实战》是一本深度探讨Cocos2d-x 3.x框架的游戏开发书籍,适合对游戏编程有兴趣的开发者学习。Cocos2d-x 是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多平台的...

Global site tag (gtag.js) - Google Analytics