声明
本教程仅用于初学cocos2dx同学使用,内容由本人(Code-Man)编写,此教程使用cocos2dx版本为3.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。QQ群:Cocos2d-CodeMonkey,461679592。
现在是凌晨一点钟~~,我发现我的时间都不知道去哪了,今天周日。早上一大早跑去学车,练了半个小时,一大帮人过来了。没心情没feel走人,回到家,继续敲代码。。。。。。。。结果就到现在了。呵呵!!!!,说说今天要讲的内容吧! 很重要哦!!
坐标,说白点就是把什么东西,放到什么位置。位置就是我们的坐标。坐标无非就是X轴、Y轴嘛!!呵呵哒,看了你就知道了。
四种常用坐标系:OpenGL坐标系、屏幕坐标系、世界坐标系、节点坐标系。
OpenGL坐标系:
(百度百科解释)OPenGL是个定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。在中级篇会讲到,高级篇会有更深的讨论。
(CodeMonkey解释)画图工具。简单、粗暴的解释,O(∩_∩)O~
OpenGL坐标系原点在屏幕的左下角,X轴正方向向右,Y轴正方向向上。如图
屏幕坐标系:
手机系统使用的坐标系,手指点到屏幕上的那一刻,它的坐标使用的就是屏幕坐标系。在2.0,是需要做转换的。3.0只需要调用getLocation就能获得转换后的坐标。屏幕坐标系以左上角为原点,X轴正方向右,Y轴正方向下,如图:
世界坐标系:
世界坐标系也称为“绝对坐标系”,就跟我们平时所说的绝对是一样的,只要设定了绝对路径就一定是指那个位置,绝对坐标系也是一样的道理。世界即游戏世界,它是Cocos2dx中一个全局坐标的概念。任何一个节点的坐标,最后绘制到屏幕上时都会映射成世界坐标系。世界坐标系和OpenGL坐标系方向一致,原点都在左下角。
节点坐标系:
顾名思义,也就是节点上的坐标。每个节点都有自己的坐标系,这是一个相对的坐标,当一个节点移动时,与之关联的节点(它的子节点)也随之移动。这是我们最常用的坐标系。在开发游戏的过程中,往往都是设置相对父节点的位置。节点坐标跟世界坐标系方向一致,原点都是在左下角。
锚点:
首先我们要理解,我们的每一个节点就像一张图片,每一张图片都像下图中一样需要贴到墙(屏幕上)。于是乎我们选定了一个坐标,例如(100,100),那么我们到底是图片的左下角的那个点与(100,100)重合呢?还是正中间,还是右上角、左下角、右下角。。。这时候就需要,锚点了。
一个节点常用的锚点坐标如下:节点的默认锚点是(0.5,0.5)
代码演示:
依旧使用上一节课,我们的《罪恶王冠》的主角们,虽然我已经看完了,但热情不减啊。。。先找到我们的男主角,然后设置他的锚点看看效果。
锚点:(0.5,0.5)
效果:很明显只能看到主角的四分之一
锚点:(0,0)
效果:我们并没有设置主角的坐标,而是设置它的锚点。
剩下的几个Monkey们自己去尝试lor,师兄只能帮你到这了哈哈哈。。。,当发现看不到男主角的时候思考一下,为毛???
坐标系代码分析:
1.先添加一张图片到项目中,我这里放了一个球。。。你喜欢放什么都可以,不是重点。。。
2.修改,我们上一节课的代码。修改两个主角的坐标和父节点。如下:
从代码可知,女主的父节点是男主,男主的父节点是一个Node节点,Node的父节点是Layer。
相对节点坐标:男主角的坐标为(100,100),锚点(0,0),所有图片的左下角为他相对于Node的坐标。
女主角的坐标为(200,200),锚点(0.5,0.5),所有图片的正中间为她相对于男主角图片的坐标。
3.添加一个精灵。
世界坐标:ball并没有直接设置坐标,而是取得女主的世界坐标。也就是女主绘制到游戏世界中的坐标。
下图中可以看到,ball在图片的左下角,有人好奇为什么不是正中间?如果有兴趣可以进入Q群一起讨论。
可以变化设置女主的图片位置,发现ball都会在图片的左下角。如果要正好是女主的坐标又如何呢?可以找找方法。
Monkey们,快去折腾一下坐标吧。代码只有敲多了你才能真正的理解到位。
本节课的源代码:
void LessonOneScene::menuAddCallback(cocos2d::Ref *pSender){ // 在主角节点为空的适合我们就去招呼出我们的萌萌哒的主角 if (HeroNode==nullptr) { // 创建我们的空节点,理解为容器吧,可以装很多东西 HeroNode=Node::create(); this->addChild(HeroNode); // 出来吧男主角 auto LessonOne_Boy=Sprite::create("LessonOne_Boy.png"); LessonOne_Boy->setPosition(100,100); LessonOne_Boy->setAnchorPoint(Vec2(0,0)); // 装到容器里面 HeroNode->addChild(LessonOne_Boy); // 出来吧女主角 auto LessonOne_Gril=Sprite::create("LessonOne_Gril.png"); auto GrilSize=LessonOne_Gril->getContentSize(); LessonOne_Gril->setPosition(200,200); LessonOne_Boy->addChild(LessonOne_Gril); // 新添加进来的球 auto ball=Sprite::create("bomb_11001.png"); ball->setPosition(LessonOne_Gril->convertToWorldSpace(Vec2::ZERO)); this->addChild(ball); // this是谁?自己,自己是什么?,层,层有一个儿子它的别名叫“bg”,“bg”有一个儿子它的身份证是10000。结合上面就能找到最后哪个人就是:上面的MyLabel auto MyLabel=(Label*)this->getChildByName("bg")->getChildByTag(10000); // 重新设置显示的文字 MyLabel->setString("请删除我们的\n英雄"); }else{ // 打一个log出来可以在控制台看见 log("这个Node已存在,无需重复添加"); } }
已经很晚了,Monkey们~,想找个人聊天,今天心情很down。。。。。总提不起劲。。安吧各位!!!!!