10.cocos2d坐标系

Posted 喵小喵~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10.cocos2d坐标系相关的知识,希望对你有一定的参考价值。

一、笛卡儿坐标系

  OpenGl坐标系为笛卡儿右手系。x向右,y向上,z向外。在cocos2d-lua中坐标系原点在屏幕的左下角,x向右,y向上,z则是指的zorder(层级)。

二、世界坐标系,本地坐标系

  世界坐标系的原点固定在屏幕的左下角。
  本地坐标是和节点相关的坐标系,每个节点都有独立的坐标系,是以节点左下角为原点。当节点移动或改变方向时,和该节点关联的坐标系将随之移动或者改变方向。

三、锚点

  锚点Anchor Point的两个参数范围在0-1 之间,他们是乘数因子。比如(0.5,0.5)表示锚点位于节点长乘于0.5,宽*0.5的位置。可以设置锚点,如果没设置,默认在(0.5,0.5);

  下面给个代码看看效果:

 1        //创建大的精灵
 2     CCSprite *big = CCSprite::create();
 3     //设置背景颜色
 4     big->setColor(Color3B(0,0,255));
 5     //设置锚点为左下角
 6     big->setAnchorPoint(ccp(0, 0));
 7     //设置大小
 8     big->setTextureRect(CCRectMake(0, 0, 150, 150));
 9     //设置位置
10     big->setPosition(ccp(100, 100));
11     //加载
12     addChild(big);

  如果不忽略锚点

 1         //创建大的精灵
 2     CCSprite *big = CCSprite::create();
 3     //设置背景颜色
 4     big->setColor(Color3B(0,0,255));
 5     //设置锚点为左下角
 6     //big->setAnchorPoint(ccp(0, 0));
 7     big->ignoreAnchorPointForPosition(false);
 8     //设置大小
 9     big->setTextureRect(CCRectMake(0, 0, 150, 150));
10     //设置位置
11     big->setPosition(ccp(100, 100));
12     //加载
13     addChild(big);

  忽略锚点

 1 //创建大的精灵
 2     CCSprite *big = CCSprite::create();
 3     //设置背景颜色
 4     big->setColor(Color3B(0,0,255));
 5     //设置锚点为左下角
 6     //big->setAnchorPoint(ccp(0, 0));
 7     big->ignoreAnchorPointForPosition(true);
 8     //设置大小
 9     big->setTextureRect(CCRectMake(0, 0, 150, 150));
10     //设置位置
11     big->setPosition(ccp(100, 100));
12     //加载
13     addChild(big);

4、世界坐标和本地坐标的转化

convertToNodeSpace//将世界坐标转换为本地坐标系
convertToWorldSpaceAR//将本地坐标系转换为世界坐标系

总的来说世界坐标就是相对于窗口的坐标,本地坐标就是相对于某个节点的坐标

整体代码:

T5Coordinate.h
 1 #pragma once
 2 #include "cocos2d.h"
 3 USING_NS_CC;
 4 
 5 class T5Coordinate :public CCLayer
 6 {
 7 public:
 8     static CCScene *scene();
 9     CREATE_FUNC(T5Coordinate);
10     bool init();
11 
12 
13     bool onTouchBegan(CCTouch *pTouch, CCEvent *pEvent);//创建点击事件
14 };
T5Coordinate.cpp
  1 #include "T5Coordinate.h"
  2 
  3 
  4 CCScene *T5Coordinate::scene()
  5 {
  6     CCScene *scene = CCScene::create();
  7     T5Coordinate *layer = T5Coordinate::create();
  8     scene->addChild(layer);
  9     return scene;
 10 }
 11 
 12 bool T5Coordinate::init()
 13 {
 14     CCLayer::init();
 15     setTouchEnabled(true);//打开触摸开关
 16     setTouchMode(kCCTouchesOneByOne);//单点
 17 
 18     //创建大的精灵
 19     CCSprite *big = CCSprite::create();
 20     //设置背景颜色
 21     big->setColor(Color3B(0,0,255));
 22     //设置锚点为左下角
 23     //big->setAnchorPoint(ccp(0, 0));
 24     big->ignoreAnchorPointForPosition(true);
 25     //设置大小
 26     big->setTextureRect(CCRectMake(0, 0, 150, 150));
 27     //设置位置
 28     big->setPosition(ccp(100, 100));
 29     //加载
 30     addChild(big);
 31 
 32     //创建小的精灵
 33     CCSprite *little = CCSprite::create();
 34     //设置背景颜色
 35     little->setColor(Color3B(255, 0, 255));
 36     //设置锚点为左下角
 37     little->setAnchorPoint(ccp(0, 0));
 38     //设置大小
 39     little->setTextureRect(CCRectMake(0, 0, 50, 50));
 40     //设置位置
 41     little->setPosition(ccp(100, 100));
 42     //加载到大的精灵里面,以大的精灵的锚点为坐标原点
 43     big->addChild(little);
 44 
 45     //世界坐标转化为本地坐标
 46     CCPoint toWorld = big->convertToWorldSpace(little->getPosition());
 47 
 48     CCSprite *little2 = CCSprite::create();
 49     little2->setColor(Color3B(255, 158, 255));
 50     little2->setAnchorPoint(ccp(0, 0));
 51     little2->setTextureRect(CCRectMake(0, 0, 50, 50));
 52     little2->setPosition(ccp(0, 0));
 53     big->addChild(little2);
 54 
 55     //将本地坐标转化为世界坐标 56     //CCPoint toNode = big->convertToNodeSpace(little2->getPosition());
 57 
 58     //创建动作
 59     //移动到的位置
 60     CCMoveBy *by = CCMoveBy::create(1, ccp(400, 0));
 61     //从移动到的位置回来
 62     CCMoveBy *by2 = (CCMoveBy *)by->reverse();
 63     //创建动作
 64     CCSequence *seq = CCSequence::create(by, by2, NULL);
 65     //把动作给大的精灵
 66     big->runAction(CCRepeatForever::create(seq));
 67 
 68     CCMoveBy *l1by = CCMoveBy::create(1, ccp(0, -100));
 69     CCMoveBy *l1by2 = (CCMoveBy *)l1by->reverse();
 70     CCSequence *l1seq = CCSequence::create(l1by, l1by2, NULL);
 71     little->runAction(CCRepeatForever::create(l1seq));
 72 
 73     CCMoveBy *lby = CCMoveBy::create(1, ccp(0, 100));
 74     CCMoveBy *lby2 = (CCMoveBy *)lby->reverse();
 75     CCSequence *lseq = CCSequence::create(lby, lby2, NULL);
 76     little2->runAction(CCRepeatForever::create(lseq));
 77 
 78     return true;
 79 }
 80 
 81 bool T5Coordinate::onTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
 82 {
 83     //获取GL坐标
 84     CCPoint pGl = pTouch->getLocation();
 85     //获取UI坐标
 86     CCPoint pUi = pTouch->getLocationInView();
 87     //世界坐标转化为相对坐标
 88     CCPoint pnode = this->convertToNodeSpace(pGl);
 89     //UI->GL坐标转换
 90     CCPoint ptoGl = CCDirector::sharedDirector()->convertToGL(pUi);
 91     //GL->UI坐标的转换
 92     CCPoint ptoUi = CCDirector::sharedDirector()->convertToUI(pGl);
 93 
 94     //存储结果并且显示
 95     char Gl[100];
 96     char Ui[100];
 97     char toGl[100];
 98     char toUi[100];
 99     char node[100];
100     char res[400];
101     sprintf(Gl, "GL坐标:x = %f   y = %f", pGl.x, pGl.y);
102     sprintf(Ui, "UI坐标: x = %f  y = %f", pUi.x, pUi.y);
103     sprintf(toGl, "toGL坐标:x = %f   y = %f", ptoGl.x, ptoGl.y);
104     sprintf(toUi, "toUi坐标:x = %f   y = %f", ptoUi.x, ptoUi.y);
105     sprintf(node , "相对坐标:x = %f   y = %f", pnode.x, pnode.y);
106     sprintf(res, "%s\\n%s\\n%s\\n%s\\n%s", Gl, Ui,toGl,toUi,node);
107     MessageBoxA(0, res, "当前点击坐标", 0);
108     return true;
109 }

 



以上是关于10.cocos2d坐标系的主要内容,如果未能解决你的问题,请参考以下文章

根据顶点世界位置Y坐标修改Metal片段着色

片段内的视图坐标始终为空

iOS开发CGRectGetMidX. CGRectGetMidY.CGRectGetMinY. CGRectGetMaxY. CGRectGetMinX. CGRectGetMaxX的使用(代码片段

传递给片段着色器的纹理坐标全部为 0

为啥此代码片段返回意外结果?

片段着色器究竟如何用于纹理?