cocos2dx中的坐标体系

1.UI坐标系和GL坐标系

2.本地坐标与世界坐标

本地坐标是一个相对坐标,是相对于父节点或者你指明的某个节点的相对位置来说的,本地坐标的原点在参考节点的左下角

世界坐标是一个绝对的坐标,是以屏幕的左下角为坐标原点,与GL坐标是重合的.

3.Ui坐标与GL坐标和Node坐标

UI坐标是以UI坐标系来计算的,又叫屏幕坐标,y轴向下,在某些游戏中需要使用到屏幕坐标与GL坐标的转换

GL坐标即世界坐标,是一个绝对的坐标,y轴向上

Node坐标即节点坐标,又叫本地坐标,是一个相对的坐标,是以父节点,或者参考节点的左下角为原点来计算的

4.相关的转换函数:

CCDirector::sharedDirector()->convertToUI();//转换为屏幕坐标
CCDirector::sharedDirector()->convertToGL();//转换为世界坐标

convertToNodeSpace();//转换为本地坐标,又叫节点坐标
convertToWorldSpace();//转换为世界坐标,又叫GL坐标

5.代码处理:

.h文件

#ifndef __T05Coordinate_H__
#define __T05Coordinate_H__

#include "cocos2d.h"
USING_NS_CC;

class T05Coordinate :public CCLayer
{
public:
    static CCScene * scene();
    CREATE_FUNC(T05Coordinate);
    bool init();

    /*触摸事件处理函数*/
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

};

#endif

.cpp文件

#include "T05Coordinate.h"

/*创建场景*/
CCScene *T05Coordinate::scene()
{
    CCScene * scene = CCScene::create();
    T05Coordinate * layer = T05Coordinate::create();
    scene->addChild(layer);
    return scene;
}

bool T05Coordinate::init()
{
    CCLayer::init();
    setTouchEnabled(true);  //打开触摸开关
    setTouchMode(kCCTouchesOneByOne); //设置单点触摸

    /*创建一个空精灵作为背景*/
    CCSprite *big = CCSprite::create();
    /*设置颜色*/
    big->setColor(ccRED);
    big->setAnchorPoint(ccp(0, 0));
    /*设置纹理大小*/
    big->setTextureRect(CCRectMake(0, 0, 150, 150));
    big->setPosition(ccp(100, 100));
    addChild(big);

    CCSprite *little = CCSprite::create();
    little->setColor(ccYELLOW);
    little->setAnchorPoint(ccp(0, 0));
    little->setTextureRect(CCRectMake(0, 0, 50, 50));
    little->setPosition(ccp(100, 100));//即以父类对象为基准,设置到ccp(100,100)的位置
    big->addChild(little);

    /*打印UI坐标,又叫本地坐标,这是相对于它的父类对象而言的,是一个相对坐标*/
    CCLog("little x = %f ,y = %f", little->getPositionX(), little->getPositionY());

    /*父类将子类对象,转换为世界坐标*/
    CCPoint toWorld = big->convertToWorldSpace(little->getPosition());

    CCLog("toWorld x = %f ,y = %f", toWorld.x, toWorld.y);

    CCSprite *little2 = CCSprite::create();
    little2->setColor(ccGREEN);
    little2->setAnchorPoint(ccp(0, 0));
    little2->setTextureRect(CCRectMake(0, 0, 50, 50));
    little2->setPosition(ccp(0, 0));
    addChild(little2);//它的父类对象时CCLayer,因此它的位置是相对于整个屏幕来说的.

    /*父类将子类对象转换为本地坐标,又叫节点坐标*/
    CCPoint toNode = big->convertToNodeSpace(little2->getPosition());/*相对于big对象来说,little2相当于在ccp(-100,-100)*/
    CCLog("little2 x = %f ,y = %f", little2->getPositionX(), little2->getPositionY());
    CCLog("toNode x = %f ,y = %f", toNode.x, toNode.y);

    /*创建一个移动的动作,by表示是绝对位移*/
    CCMoveBy *by = CCMoveBy::create(2, ccp(200, 0));
    CCMoveBy *by2 = (CCMoveBy *)by->reverse();//掉头,反向反转
    /*根据动作,创建一个动作序列*/
    CCSequence *seq = CCSequence::create(by, by2, NULL);
    /*精灵执行动作*/
    //big->runAction(CCRepeatForever::create(seq));

    CCMoveBy *lby = CCMoveBy::create(2, ccp(0, -100));//向下运动
    CCMoveBy *lby2 = (CCMoveBy *)lby->reverse();
    /*变参函数以NULL结尾*/
    CCSequence *lseq = CCSequence::create(lby, lby2, NULL);

    //little->runAction(CCRepeatForever::create(lseq));

    return true;
}

/*触摸事件的处理函数*/
bool T05Coordinate::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    CCLog("ccTouchBegan");
    /*getlocation只有在触摸事件里,其他均是getposition*/
    CCPoint pGl = pTouch->getLocation();//获得世界坐标,又叫GL坐标
    CCLog("GL:x = %f ,y = %f", pGl.x, pGl.y);

    CCPoint pUi = pTouch->getLocationInView();//获得UI坐标,UI坐标又叫屏幕坐标系,在坦克大战中可以用到转换
    CCLog("UI:x = %f ,y = %f", pUi.x, pUi.y);

    CCPoint toUi = CCDirector::sharedDirector()->convertToUI(pGl);//将世界坐标转换为Ui坐标
    CCLog("ToUix = %f ,y = %f", toUi.x, toUi.y);

    CCPoint toGl = CCDirector::sharedDirector()->convertToGL(pUi);//将Ui坐标转换为世界坐标
    CCLog("ToGlx = %f ,y = %f", toGl.x, toGl.y);

    CCPoint node = this->convertToNodeSpace(pGl);//将Gl坐标转换为节点坐标,又叫本地坐标
    CCLog("Node:x = %f ,y = %f", node.x, node.y);

    return false;
}
时间: 2024-08-05 07:54:58

cocos2dx中的坐标体系的相关文章

Cocos2d-X中的坐标

在Cocos2d-x中坐标可以分成四种: 1.GL坐标体系:GL坐标体系左下角为坐标原点,X轴向右,Y轴向上 2.UI坐标体系:UI坐标体系左上角为坐标原点,X轴向右,Y轴向上. 3.世界坐标体系:是窗口的坐标体系,它是GL坐标体系,它是左下角为坐标原点,X轴向右,Y轴向上. 4. 结点坐标体系:是Node的坐标体系,它是GL坐标体系,和世界坐标体系不同的是,它的原点是结点的左下角, 当一个结点调用SetPosition时,使用的参数是它的父结点(渲染树)的坐标体系 CCLayer默认大小和窗口

Cocos2d-x坐标体系

Cocos2d-x坐标体系 cocos2d引擎是一款非常优秀的扩平台的游戏开发引擎,在apple游戏榜上,有很多排名靠前的游戏都是由他创造出来的,他也有一套十分方便的坐标体系. 一.UI坐标体系 UI坐标体系相对于移动开发人员来说再熟悉不过了,在iOS系统中,它就是frame体系,即坐标(0,0)点位于屏幕的左上角,向右x增大,向下y增大. 二.OpenGL坐标体系 OpenGL坐标系是cocos2d中使用的坐标系,它更接近于数学上的坐标系,即(0,0)点位于屏幕的左下角,往左x增大,往上y增大

2.cocos2d-x坐标体系(UI坐标系,GL坐标系,本地坐标,世界坐标,节点坐标)

 openGL & UI坐标体系 OpenGL坐标系:该坐标原点在屏幕左下角,x轴向右,y轴向上.这也就是cocos2dx中用到的坐标系. 屏幕坐标系:该坐标系的原点在屏幕左上角,x轴向右,y轴向下,其实和OpenGL坐标系的差别也就是y轴的方向.假设游戏场景的分辨率为(500,500),其中一个点坐标为(200,200),那么它在OpenGL坐标系中的坐标还是(200,200),在屏幕坐标系中则倒过来,则为(200,500-200).其实也就是6和9的差别. 图: UI坐标系 图: GL坐

【cocos2d-x学习笔记】ZOder、tag、场景切换、精灵的各种创建方式、三个特殊层、坐标体系

ZOder: 1.是描述渲染顺序的值,每个CCNode都有ZOder,默认是0. 2.ZOder越大则越后面绘制.如果ZOder值相同,那么看arrival(全局变量每次加一)顺序,先加入的节点先绘制,ZOder只在相同父节点的节点直接进行比较 tag:是一个节点的身份证,方便通过getChildByTag来获取节点对象,它的意义在于减少成员变量 TAG只在相同父节点的节点之间有效 TAG在相同父节点的儿子之间不能相同,相同情况cocos不报错,getChildByTag可能会获取到不是你想要的

Quartz 2D在ios中的使用简述一:坐标体系

Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境,官方文档:Quartz 2D Programming Guide. 一.坐标体系 这样的坐标体系就导致我们使用Quartz 2D画的图是倒转的,我们要做以下处理才能得到我们想要的图片效果: 1.画布延Y轴下移height 2.对Y轴做垂直翻转 这2个步骤的代码为: 1 CGContextTranslateCTM(context, 0, height); 2 CGContextScaleCTM(context, 1.0

cocos2d-x中的简单的数据存储

Cocos2d-x中的数据存储方式很多,下面我来简单的介绍几种,有说的不准确的地方,大家指出来吧,共同学习进步.谢谢! 首先介绍的是  UserDefault 这个类: //用userdefault进行数据存储 UserDefault::getInstance()->setStringForKey("testKey","testValue");//将String类型的数据存储起来 //读取上面写入的数据 std::string val = UserDefaul

关于COCOS2D-X 中的CCRectMake参数小注

在使用CocoStudio和Cocos2d-x混合编程过程中,坐标转换是不可避免的.因此,要随时注意,当然坐标.Rect是全局性的还是局部性的.时间长了,许多基础内容易于忘记,这不---小小的宏函数CCRectMake的参数各自函数就忘记了!故备注于此. 在编码时,当忘记相应参数含义时,我常常按下快捷键F12,转换相应的头文件去分析一下.可怜的是,宏函数CCRectMake各个参数就没有很好的注解. 格式:CCRectMake(x,y,width,height) 对于Widget控件,一般情况下

Cocos2d-X中的动作展示《二》

由于Cocos2d-X中的动作较多,我将所有的动作制作成了一个滚动视图,每个滚动视图上都有动作名,单击滚动视图就可以展示相应的动作 程序效果图: 使用滚动视图实现动作切换 动作展示 首先创建一个ActionMore类 ActionMore.h中的代码 #ifndef _ActionMore_H_ #define _ActionMore_H_ #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC; USING_

Cocos2d-x中触摸事件

理解一个触摸事件可以从时间和空间两方面考虑. 1.触摸事件的时间方面 触摸事件的在时间方面,如下图所示,可以有不同的"按下"."移动"和"抬起"等阶段,表示触摸是否刚刚开始.是否正在移动或处于静止状态,以及何时结束,也就是手指何时从屏幕抬起.此外,触摸事件的不同阶段都可以有单点触摸或多点触摸,是否支持多点触摸还要看设备和平台. 触摸事件有两个事件监听器:EventListenerTouchOneByOne和EventListenerTouchAl