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

前端之家收集整理的这篇文章主要介绍了Cocos2d-x的学习之旅(四)坐标系前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

声明

本教程仅用于初学cocos2dx同学使用,内容由本人(Code-Man)编写,此教程使用cocos2dx版本为3.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。QQ群:Cocos2d-CodeMonkey,461679592


@H_502_15@现在是凌晨一点钟~~,我发现我的时间都不知道去哪了,今天周日。早上一大早跑去学车,练了半个小时,一大帮人过来了。没心情没feel走人,回到家,继续敲代码。。。。。。。。结果就到现在了。呵呵!!!!,说说今天要讲的内容吧! 很重要哦!!

@H_502_15@坐标,说白点就是把什么东西,放到什么位置。位置就是我们的坐标。坐标无非就是X轴、Y轴嘛!!呵呵哒,看了你就知道了。

@H_502_15@四种常用坐标系:OpenGL坐标系、屏幕坐标系、世界坐标系、节点坐标系。

@H_502_15@

OpenGL坐标系

@H_502_15@百度百科解释)OPenGL是个定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。在中级篇会讲到,高级篇会有更深的讨论。

@H_502_15@(CodeMonkey解释)画图工具。简单、粗暴的解释,O(∩_∩)O~

@H_502_15@OpenGL坐标系原点在屏幕的左下角,X轴正方向向右,Y轴正方向向上。如图

@H_502_15@

屏幕坐标系:

@H_502_15@手机系统使用的坐标系,手指点到屏幕上的那一刻,它的坐标使用的就是屏幕坐标系。在2.0,是需要做转换的。3.0只需要调用getLocation就能获得转换后的坐标。屏幕坐标系以左上角为原点,X轴正方向右,Y轴正方向下,如图:

@H_502_15@

世界坐标系:

@H_502_15@世界坐标系也称为“绝对坐标系”,就跟我们平时所说的绝对是一样的,只要设定了绝对路径就一定是指那个位置,绝对坐标系也是一样的道理。世界即游戏世界,它是Cocos2dx中一个全局坐标的概念。任何一个节点的坐标,最后绘制到屏幕上时都会映射成世界坐标系。世界坐标系和OpenGL坐标系方向一致,原点都在左下角。

@H_502_15@

节点坐标系:

@H_502_15@顾名思义,也就是节点上的坐标。每个节点都有自己的坐标系,这是一个相对的坐标,当一个节点移动时,与之关联的节点(它的子节点)也随之移动。这是我们最常用的坐标系。在开发游戏的过程中,往往都是设置相对父节点的位置。节点坐标跟世界坐标系方向一致,原点都是在左下角。

@H_502_15@

锚点:

@H_502_15@首先我们要理解,我们的每一个节点就像一张图片,每一张图片都像下图中一样需要贴到墙(屏幕上)。于是乎我们选定了一个坐标,例如(100,100),那么我们到底是图片的左下角的那个点与(100,100)重合呢?还是正中间,还是右上角、左下角、右下角。。。这时候就需要,锚点了。

@H_502_15@

@H_502_15@

@H_502_15@一个节点常用的锚点坐标如下:节点的默认锚点是(0.5,0.5)

@H_502_15@

@H_502_15@

@H_502_15@

代码演示:

@H_502_15@依旧使用上一节课,我们的《罪恶王冠》的主角们,虽然我已经看完了,但热情不减啊。。。先找到我们的男主角,然后设置他的锚点看看效果

@H_502_15@锚点:(0.5,0.5)

@H_502_15@

@H_502_15@效果:很明显只能看到主角的四分之一

@H_502_15@

@H_502_15@

@H_502_15@

@H_502_15@锚点:(0,0)

@H_502_15@

@H_502_15@

@H_502_15@效果:我们并没有设置主角的坐标,而是设置它的锚点。

@H_502_15@

@H_502_15@

@H_502_15@剩下的几个Monkey们自己去尝试lor,师兄只能帮你到这了哈哈哈。。。,当发现看不到男主角的时候思考一下,为毛???

@H_502_15@

@H_502_15@坐标系代码分析:

@H_502_15@1.先添加一张图片到项目中,我这里放了一个球。。。你喜欢放什么都可以,不是重点。。。

@H_502_15@2.修改,我们上一节课的代码修改两个主角的坐标和父节点。如下:

@H_502_15@代码可知,女主的父节点是男主,男主的父节点是一个Node节点,Node的父节点是Layer。

@H_502_15@

@H_502_15@相对节点坐标:男主角的坐标为(100,100),锚点(0,0),所有图片的左下角为他相对于Node的坐标。

@H_502_15@女主角的坐标为(200,200),锚点(0.5,0.5),所有图片的正中间为她相对于男主角图片的坐标。

@H_502_15@

@H_502_15@3.添加一个精灵。

@H_502_15@世界坐标:ball并没有直接设置坐标,而是取得女主的世界坐标。也就是女主绘制到游戏世界中的坐标。

@H_502_15@下图中可以看到,ball在图片的左下角,有人好奇为什么不是正中间?如果有兴趣可以进入Q群一起讨论。

@H_502_15@可以变化设置女主的图片位置,发现ball都会在图片的左下角。如果要正好是女主的坐标又如何呢?可以找找方法

@H_502_15@

@H_502_15@

@H_502_15@Monkey们,快去折腾一下坐标吧。代码只有敲多了你才能真正的理解到位。

@H_502_15@

@H_502_15@本节课的源代码

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已存在,无需重复添加");
    }
  
}


@H_502_15@已经很晚了,Monkey们~,想找个人聊天,今天心情很down。。。。。总提不起劲。。安吧各位!!!!!

原文链接:https://www.f2er.com/cocos2dx/342737.html

猜你在找的Cocos2d-x相关文章