Cocos2d-x的学习之旅(四)坐标系

来源:互联网 发布:淘宝阳光电玩怎么样 编辑:程序博客网 时间:2024/05/04 05:18

声明

本教程仅用于初学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。。。。。总提不起劲。。安吧各位!!!!!



0 0
原创粉丝点击