1.UI坐标和OpenGL坐标

  1. UI坐标值得是移动设备,比如Andoroid手机,它们的坐标是以屏幕的左上角为原点,向右为x轴正方向,向下为Y轴正方向
  2. OpenGL坐标是以屏幕的左下角为原点,向上为Y轴正向,向右为X轴正向.

Cocos2d-x默认坐标为OpenGL坐标.

2.世界坐标和模型坐标

在游戏里面,世界坐标就是相当于整块屏幕原点的坐标.也就是以屏幕的左下角为原点的OpenGL坐标系.
模型坐标就是相对于屏幕里面的某个精灵的坐标系,以精灵所在的位置为原点,向右为X轴正方向,向上为Y轴正方向.

3.4个API的解释

(1) Vec2 convertToNodeSpace(const Vec2& worldPoint). 将世界坐标转换为模型坐标

(2) Vec2 convertToNodeSpaceAR(const Vec2& worldPoint) 将世界坐标转换为模型坐标,AR代表锚点

(3) Vec2 converToWorldSpace(const Vec2& nodePonit) 将模型坐标转换为世界坐标

(4) Vec2 convertTpWorldSpaceAR(const Vec2& nodePoint) 将模型坐标转换为世界坐标.AR表示锚点

代码演示如下:

#include "HelloWorldScene.h"USING_NS_CC;Scene *HelloWorld::createScene() {// 'scene' is an autorelease objectauto scene = Scene::create();// 'layer' is an autorelease objectauto layer = HelloWorld::create();// add layer as a child to scenescene->addChild(layer);// return the scenereturn scene;
}// on "init" you need to initialize your instance
bool HelloWorld::init() {//// 1. super init firstif (!Layer::init()) {return false;}auto visibleSize = Director::getInstance()->getVisibleSize();Vec2 origin = Director::getInstance()->getVisibleOrigin();///创建Nodel1  宽度为300,高度为100.auto nodel1 = Sprite::create("node1.png");nodel1->setPosition(Point(400, 500));nodel1->setAnchorPoint(Point(0.5, 0.5));this->addChild(nodel1);//创建Nodel2  宽度为300,高度为100auto nodel2 = Sprite::create("node2.png");nodel2->setPosition(Point(300, 300));nodel2->setAnchorPoint(Point(1, 0));this->addChild(nodel2);//这个是以node1的原点生成的坐标系,即node1左下角为原点.auto nsPos = nodel1->convertToNodeSpace(nodel2->getPosition());//AR代表锚点的意思,这个是以node1的锚点为原点.这个已经在代码里设置成了其中点.精灵默认锚点也是其中点auto nsArPos = nodel1->convertToNodeSpaceAR(nodel2->getPosition());log("模型2相当于模型1原点坐标的距离是:%f,%f", nsPos.x, nsPos.y);log("模型2相当于模型1锚点坐标的距离,看来是:%f,%f", nsArPos.x, nsArPos.y);//创建Nodel3  宽度为58,高度为59auto nodel3 = Sprite::create("orange.png");nodel3->setPosition(Point(100, 100));nodel3->setAnchorPoint(Point(1, 0));//吧node3添加到node1上去了,添加上去默认就是以node1左下角为原点,显然此时node3将不可见,因为已经抄错了nodel1->addChild(nodel3);log("node3相对于node1的坐标是:{%f,%f}", nodel3->getPosition().x, nodel3->getPosition().y);auto ns13 = nodel1->convertToNodeSpace(nodel3->getPosition());log("node3相对于node1的坐标是错误做法:{%f,%f}", ns13.x, ns13.y);  //这个也能看出其实转化坐标系其实是取node3的坐标与node1的距离//总结: 1.[node]->convertToNodeSpace 传入的 [node]世界里面其他的node坐标,来求相对于[node]的距离//     2.[node]->convertToNodeSpaceAR是不在以[node]模型的原点为坐标,而是以其锚地为坐标.auto ws13 = nodel1->convertToWorldSpace(nodel3->getPosition());auto wsAr13 = nodel1->convertToWorldSpaceAR(nodel3->getPosition());log("node3相对于node1的坐标在世界坐标系的表示:{%f,%f}", ws13.x, ws13.y);  //这个也能看出其实转化坐标系其实是取node3的坐标与node1的距离log("node3相对于node1(锚点)的坐标在世界坐标系的表示:{%f,%f}", wsAr13.x, wsAr13.y);  //这个也能看出其实转化坐标系其实是取node3的坐标与node1的距离return true;
}

结果为:

模型2相当于模型1原点坐标的距离是:50.000000,-150.000000
模型2相当于模型1锚点坐标的距离,看来是:-100.000000,-200.000000
node3相对于node1的坐标是:{100.000000,100.000000}
node3相对于node1的坐标是错误做法:{-150.000000,-350.000000}
node3相对于node1的坐标在世界坐标系的表示:{350.000000,550.000000}
node3相对于node1(锚点)的坐标在世界坐标系的表示:{500.000000,600.000000}

转载于:https://www.cnblogs.com/soongkun/p/6027248.html

Ubuntu cocos2d-x 3.13版本游戏开发学习系列3 Cocos2d-x的坐标系相关推荐

  1. 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第二十一课:Cocos2D-X网格特效1-3

    [麦可网]Cocos2d-X跨平台游戏开发---学习笔记 第二十一课:Cocos2D-X网格特效1-3 ================================================ ...

  2. 【iOS-Cocos2d游戏开发】系列(总结了多篇文章,可以好好学习

    最近几天仔细了解了iOS游戏开发引擎,常用的cocos2d,Unity引擎,那么Unity是非免费的,而cocos2d则是免费开源的: 最后促使我选择cocos2d的原因有两点: 1.最重要的原因是它 ...

  3. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

  4. 游戏开发学习笔记——lua脚本语言——安装、汉化与小测试(解决lua运行代码乱码问题)

    游戏开发学习笔记--lua脚本语言--安装.汉化与小测试 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: Lua 是一种轻量小巧的脚本语言,用 ...

  5. 微信小游戏开发学习记录2

    接上一篇:微信小游戏开发学习记录_寂静流年韶华舞的博客-CSDN博客_微信小游戏开发学习 目录 一.UI系统 1.基础渲染组件-精灵组件 (1)操作: (2)Sprite 属性 (3)渲染模式 2.L ...

  6. Unity 创建2D平台游戏开发学习教程

    了解如何使用C#在Unity中创建您的第一款2D平台游戏 你会学到什么 使用Unity创建2D奥运会 使用可脚本化的对象和单一模式 使用良好的编程实践 创造武器和射弹 使用可脚本化的对象和委托模式创建 ...

  7. C#和Unity编码和游戏开发学习教程

    MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:110节课(26小时25分钟)|大小解压后:18.6 ...

  8. 游戏开发学习路线图(2023最新版)建议收藏

    游戏开发是一个高度技术化的领域,需要掌握编程语言和编程技能.你可以从学习基本的编程概念和语法开始,如C++.C#.Python等常用的游戏编程语言.掌握编程的基础知识是游戏开发的基石.很多小伙伴不知道 ...

  9. 【Unity3D游戏开发学习笔记】(六)上帝之手—GameObject的操作

    在Unity中,所有实体都属于游戏对象(GameObject),比如外部导入到场景中的模型,Unity自带的立方体等等,而要将这些GameOject进行管理,交互等操作,则需要用到脚本来实现,上一节我 ...

最新文章

  1. 微信小程序转百度小程序修改
  2. springboot创建parent_Spring Boot 开篇:快速入门
  3. React开发(153):ant design自定义列
  4. 把base64转为blob
  5. 更换mysql-connector-java-6.0.5jar包后程序出现的两个异常及解决方法
  6. Windows下用FFmpeg+nginx+rtmp搭建直播环境 实现推流、拉流
  7. vb6.0动态加载odbc驱动(mysql数据源)_vb教程之在VB中动态加载ODBC数据源
  8. linux 查看java_opts_Linux Tomcat 设置 JAVA_OPTS 异常
  9. 笔记本计算机在桌面显示器,笔记本连接显示器
  10. 【Unity3D日常开发】修改游戏对象的材质颜色
  11. java 营业执照图片内容识别
  12. VLC Player – 自由、开源的跨平台多媒体播放器
  13. 鸿蒙招聘店铺主是真的吗,为什么很多店铺门口贴着招聘,然而进去问都说招满了,但是招聘的内容还是放在那不收走?...
  14. Qt 周立功can二次开发
  15. 微信第三方服务平台java授权获取token(一)
  16. JPEG系列一 JPEG图片的文件格式
  17. RNN中BPTT的推导和可能的问题
  18. 一起看 I/O | Android 更新一览
  19. Java实现吃货联盟订餐系统
  20. 人工智能算法:卷1基础算法+卷2受大自然启发的算法+卷3深度学习和神经网络电子书

热门文章

  1. 网站在线访问人数统计并计算停留时间
  2. 云计算概念诠释:18个权威人士的定义
  3. 推荐几款软件和几个网站
  4. VC实现基于Office 2007 MODI 12.0实现图形文字识别(OCR)的程序
  5. 解决mysql“Access denied for user root@localhost”
  6. Win7安vc2008编译报LINK : fatal error LNK1000: Internal error during IncrBuildImage
  7. 跨域 || Jsonp
  8. shiro.ini实现授权
  9. 用go语言制作读取excel模板批量生成word工具
  10. 通过GPG非对称加密工具验证ECharts发布版本实例演示,win10下Gnu Privacy Guard工具的安装和使用方法