现在的位置: 首页 > 综合 > 正文

cocos2d-x基础(一)CCNode

2017年09月17日 ⁄ 综合 ⁄ 共 3634字 ⁄ 字号 评论关闭

CCNode:

contentSize :设定的节点未转化时的大小。无论该节点缩放或旋转contentSize仍然相同!所有节点都有大小。层和场景具有相同大小的屏幕。 

setRotation(float rotation):设置节点度旋转(角度)。 0 是默认的旋转角度.  节点沿顺时针旋转是正值,反时针方向为负值。

Layer和Scene的描点是(0,0),因为

virtual void ignoreAnchorPointForPosition(bool ignore);
 

是否将锚点的位置设置为 (0,0) . 

这是一个内部的方法,只在 Layer 和 Scenne 中使用。不要把它的框架之外。  

 默认值是 false, 在 Layer 和 Scene 里面是 true 。

节点遍历:

 Node* node = NULL; 

 CCARRAY_FOREACH(parent->getChildren(), node) 

 { 

 
   node->setPosition(0,0);
 

} 

getUserData和setUserDate:设置用户自定义的数据,可以很方便的扩展自定义!    * Sets 此节点目前使用的着色器

node->setShaderProgram(ShaderCache::getInstance()->programForKey(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR));
从2.0开始,每个渲染节点必须拥有它的着色器程序。它应该在初始化阶段设置。

CCCamera摄像机类,每个场景都有一个摄像机,摄像机

CCSprite* pSprite = CCSprite::create("HelloWorld.png");

CCCamera* camera = pSprite->getCamera();
camera->setEyeXYZ(0, 0, 415/2);
camera->setCenterXYZ(0, 0, 0);

Cocos2D-X中的CCCamera类使用OpenGL的gluLookAt函数来设置位置。gluLookAt函数有三组关于坐标的参数,

其中“Eye”系列的x、y、z坐标参数是视角的位置,而“Center”系列的x、y、z坐标参数是所视目标的坐标位置,

“Up”系列的x、y、z坐标参数是摄像机方向的向量坐标。关于这三个参数,你可以理解为以“Eye”为起点,沿着

“Up”方向,朝着“Center”看。


onEnter():从一个节点过渡到另一个节点,应该告诉他父节点的onEnter,比如最通常的继承CCLayer,在重写

void onEnter()

{

CCLayer::onEnter();

}

参考了些资料:世界坐标系也叫做绝对坐标系,cocos2d中的元素是有父子关系的层级结构,我们通过CCNode的position设定元素的位置使用的是相对与其父节点的本地坐标系而非世界坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。世界坐标系和GL坐标系一致,原点在屏幕左下角。

 
   本地坐标系
本地坐标系也叫做物体坐标系,是和特定物体相关联的坐标系。每个物体都有它们独立的坐标系,当物体移动或改变方向时,和该物体关联的坐标系将随之移动或改变方向。比如用cocos2d-x创建了个矩形colorLayer:CCRect(10,10,100,100),这是的本地坐标系为以(10,10)为坐标原点,x轴向右,y轴向上。如果创建了一个CCSprite,锚点为(0.5,0.5),位置为(100,100),size为(40,40),这时的本地坐标系为以(80,80)为坐标原点,x轴向右,y轴向上。总之,本地坐标系原点为node的左下角坐标

convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。

convertToNodeSpace:把世界坐标转换到当前节点的本地坐标系中。

参考:http://blog.csdn.net/crayondeng/article/details/11936309

现在关于节点的坐标自己提出了一些相关的问题:

1、getPosition(),是相对于父节点还是屏幕?

在HelloWorld.cpp中注释掉所加的精灵(为了观测方便),然后加入一个精灵

CCSprite *pSp=CCSprite::create("CloseNormal.png");

pSp->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
this->addChild(pSp);
CCLOG("pSp x:%f,y:%f",pSp->getPositionX(),pSp->getPositionY());

输出:pSp x:240.000000,y:160.000000

在上面加入

this->setposition(ccp(100,100));

观察到精灵向右上方移动,但是还是输出:pSp x:240.000000,y:160.000000

因此getPosition()是相对于父节点的。

加入:

CCPoint tempPt=this->convertToWorldSpace(pSp->getPosition());//就可以把坐标转换为相对于屏幕的坐标了。

输出:pSp x:340.000000,y:260.000000

拓展

CCPoint tempPt2=this->convertToNodeSpace(tempPt);//可以把tempPt世界坐标改为相对于层(this)的本地坐标

2、getContentSize()和BoundingBox()的区别:

在上个问题代码的基础上加上下面的代码:

CCSize Size_1=pSp->getContentSize();
CCLOG("Size_1 width:%f,height:%f",Size_1.width,Size_1.height);
CCSize Size_2=pSp->boundingBox().size;
CCLOG("Size_2 width:%f,height:%f",Size_2.width,Size_2.height);

输出:Size_1 width:40.000000,height:40.000000
Size_2 width:40.000000,height:40.000000

若加上:pSp->setScale(2.0f);

输出:Size_1 width:40.000000,height:40.000000
   Size_2 width:80.000000,height:80.000000

因此,getContenSize获得纹理的尺寸不会随着放大,缩小而改变,但是boundingBox()则是判断精灵的边框,会随着改变!

3、boundingBox()的获得位置

在上面程序的基础上加入下列代码:

CCLOG("MinX :%f,MaxX:%f,MinY:%f,MaxY:%f",pSp->boundingBox().getMinX(),pSp->boundingBox().getMaxX(),pSp->boundingBox().getMinY(),pSp->boundingBox().getMaxY());

输出:MinX :220.000000,MaxX:260.000000,MinY:140.000000,MaxY:180.000000

   若再加入代码

this->setPosition(ccp(100,100));

输出:MinX :220.000000,MaxX:260.000000,MinY:140.000000,MaxY:180.000000

因此boundingBox()的坐标是相对于父节点的

可以加入下列方法把pSp的boundingBox的局部坐标改为世界坐标

CCRect playerRect = pSp->boundingBox();
playerRect = CCRectApplyAffineTransform(playerRect, pSp->getParent()->nodeToWorldTransform());
CCLOG("MinX :%f,MaxX:%f,MinY:%f,MaxY:%f",playerRect.getMinX(),playerRect.getMaxX(),playerRect.getMinY(),playerRect.getMaxY());

输出结果:MinX :320.000000,MaxX:360.000000,MinY:240.000000,MaxY:280.000000

辛苦的写了一整天,参考了很多资料,希望看到我的这篇blog能够得到启发,也希望大家能够给我更多有用的建议以及意见,谢谢!










    




抱歉!评论已关闭.