Cocosd-x的坐标系

OpenGL 坐标系 :   原点在屏幕左下角,x 轴向右,y 轴向上。

UI坐标体系       :   原点在屏幕左上角,x 轴向右,y 轴向下。

屏幕坐标系:    UI

世界坐标系:  也叫绝对坐标系 :   GL,是窗口的坐标系,原点在窗口的左下角。

本地坐标系: 

节点坐标系:  是Node的坐标体系,GL。每个节点都有自己的坐标系,

      所以和世界体系不同的是,它的原点是节点的左下角。

 

!!!当一个节点调用setPosition时, 使用的参数是它的父节点(渲染树)的坐标体系。

!!!CCLayer,CCScene默认大小和窗口一样,所以它的坐标体系和世界坐标体系重合。

 

GL坐标和世界坐标之间的转化:
CCDirector::getInstance()->convertToUI(参数);
CCDirector::getInstance()->convertToGL(参数);

世界坐标 和 节点坐标 的转化(常用)
CCNode::convertToNodeSpace(CCPoint ptInWorld);
CCNode::convertToWorldSpace(CCPoint ptInNode);

按照锚点为原点进行转化的方法
CCNode::convertToNodeSpaceAR(CCPoint ptInWorld);
CCNode::convertToWorldSpaceAR(CCPoint ptInNode);

.h文件

 1 #ifndef __example2_H__
 2 #define __example2_H__
 3 
 4 #include<cocos2d.h>
 5 USING_NS_CC;
 6 
 7 class example2 : public CCLayerColor
 8 {
 9 public:
10     static CCScene* scene();
11     CREATE_FUNC(example2);
12     bool init();
13     bool onTouchBegan(Touch* touch, Event* event);
14     Sprite* _sprite;
15 };
16 #endif
View Code

.cpp文件

 1 #include "example2.h"
 2 
 3 CCScene* example2::scene()
 4 {
 5     CCScene* s = CCScene::create();
 6     example2* layer = example2::create();
 7     s->addChild(layer);
 8     return s;
 9 
10 }
11 bool example2::init()
12 {
13     CCLayerColor::initWithColor(ccc4(255,255,0,255));
14 
15 
16     CCSize size = CCDirector::getInstance()->getWinSize();
17     CCLayerColor* layer = CCLayerColor::create(ccc4(255,0,255,255),size.width/2,size.height/2);
18     addChild(layer);
19 
20     CCSprite* sprite = CCSprite::create("CloseNormal.png");
21     _sprite = sprite;
22     layer->addChild(sprite);
23     sprite->setPosition(ccp(100,100));
24 
25     layer->setPosition(ccp(100,100));
26 
27     //CCPoint psSpriteInWorld = layer->convertToWorldSpace(sprite->getPosition());
28     //CCPoint psSpriteInworld1 = layer->convertToNodeSpace(sprite->getPosition()); 错误写法
29     //CCLog("x = %f,y = %f",psSpriteInWorld.x,psSpriteInWorld.y);
30     //CCLog("x = %f,y = %f", psSpriteInWorld1.x, psSpriteInWorld1.y);
31 
32     setTouchEnabled(true);
33     setTouchMode(kCCTouchesOneByOne);
34 
35     return true;
36 }
37 
38 
39 bool example2::onTouchBegan(CCTouch* touch, CCEvent*)
40 {
41     CCPoint ptInUI = touch->getLocationInView();
42     CCPoint ptInGL = touch->getLocation();
43 
44     CCPoint ptUIConvert = CCDirector::getInstance()->convertToGL(ptInUI);
45     CCLog("x = %f, y = %f",ptInGL.x,ptInGL.y);
46     CCLog("x = %f, y = %f",ptUIConvert.x,ptUIConvert.y);
47     //判断是否点中了精灵
48     //获取精灵的矩形,获取触摸点,判断触摸点是否在矩形内。
49 
50     CCRect rc = _sprite->boundingBox();//获取精灵的矩形,属于UI坐标系
51     CCPoint touchPoint = touch->getLocation();//GL
52     //转化为同一个体系才好判断
53     //if (rc.containsPoint(_sprite->getParent()->convertToNodeSpace(touchPoint))) 下面的更简单
54     if (rc.containsPoint(_sprite->getParent()->convertTouchToNodeSpace(touch)))
55     {//直接把touch传进去,而不用使用touch->getLocation()方法了
56         
57         CCLog("ok I am in log");
58     }
59     return true;
60 }
View Code

 

一个疑问: bool ccTouchBegan(Touch* touch, Event* event);提示 无法重写CCLayer的该方法,应该已经设置为fianl 。

3.0之前不是final的吗?

posted @ 2015-03-31 14:00  芷水  阅读(268)  评论(0编辑  收藏  举报