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的吗?

你可能感兴趣的:(OS)