[cocos2d-x]学习demo一些未理解的知识点
在cocos2d-x中有一种指针的用法没有理解,比如CCMenuItem类中:if (m_pListener && m_pfnSelector){//这一句该怎么理解?(m_pListener->*m_pfnSelector)(this);}
1.CCOrbitCamera
2.CCFollow精灵跟随动画
CCFollow动作,可以让一个节点跟随另一个节点做位移。
他有两个静态工厂方法,后者可以设置一个跟随范围,离开范围就不再跟随。
bool initWithTarget (CCNode *pFollowedNode)
bool initWithTarget (CCNode *pFollowedNode, const CCRect &rect)
CCFollow经常用来设置layer跟随sprite,可以实现类似摄像机跟拍的效果。
3.Anchor Point 和 Position
http://www.cnblogs.com/justinwong/archive/2011/06/09/2076793.html
1). anchor是一个CGPOINT,取值在(0.0f, 0,0f) 到 (1.0f, 1.0f)之间。
2). (0.0f, 0.0f)是这个CCSprite矩形区域的左下角,(1.0f, 1.0f)是右上角。
3). anchor决定了这个sprite的position指的是图片中哪个部分的位置,比如anchor在(0.0f, 0.0f),position在(100, 100),则这个sprite的左下角将被放在(100, 100)。
4). anchor决定对这个sprite进行旋转的原点。
5). anchor决定了对这个sprite进行缩放的原点。
4.cocos2d-x 坐标系:CCPoint convertToWorldSpace(const CCPoint& nodePoint);
http://blog.csdn.net/victoryckl/article/details/9409219
5.void RenderTextureZbuffer::renderScreenShot()中的获取当前层图像的方法:this->visit()后,怎么就到了texture中?
samples\Cpp\TestCpp\Classes\RenderTextureTest\RenderTextureTest.cpp
//渲染屏幕快照
void RenderTextureZbuffer::renderScreenShot()
{
//创建一个512,512大小的渲染目标纹理。
CCRenderTexture *texture = CCRenderTexture::create(512, 512);
//如果无效直接返回。
if (NULL == texture)
{
return;
}
//设置锚点为左下角。
texture->setAnchorPoint(ccp(0, 0));
//开始渲染到目标纹理。
texture->begin();
//将当前层渲染一遍。
this->visit();
//结束渲染到目标纹理。
texture->end();
//创建一个精灵。
CCSprite *sprite = CCSprite::createWithTexture(texture->getSprite()->getTexture());
//设置精灵的位置,透明度,Y方向翻转。
sprite->setPosition(ccp(256, 256));
sprite->setOpacity(182);
sprite->setFlipY(1);
//将精灵放入到当前层的最前面。
this->addChild(sprite, 999999);
//设置为绿色。
sprite->setColor(ccGREEN);
//让精灵运行一个动画序列,表现为渐渐消失。
sprite->runAction(CCSequence::create(CCFadeTo::create(2, 0),
CCHide::create(),
NULL));
}
6.cocos2d 中 zorder 和 setVertexZ 的区别
http://blog.csdn.net/u011383775/article/details/9315285
1,zorder只在同辈中以及和父母起作用。大于0在父母上面,小于在下面,和坐标转换没有关系。
2,zvertex是局域的z值。虽然表面上也是大于0在父母上面,小于在下面。但zorder不管子的order多少,只要父母的zorder比其他东西大,父母的子也一定在其他东西的上面。但zvertex是遵循坐标转换原则,在换算到世界坐标后再比较。
3,zvertex可以是小数,但是不能太大,大过摄像机的近切面或者远切面就不会被显示了。zorder可以很大,但是只能是整数。
4,本质上zorder控制渲染顺序,zvertex只有在深度测试打开后才会影响画面。默认情况下深度测试时关闭的。
5,zvertex只有在使用正交摄像机的时候才能不影响xy值。默认不是正交摄像机。这是因为cocos建议使用zorder来控制上下关系,所以一般情况所有的zvertex都为0。也就不需要深度检测和正交摄像机了。
6,使用zorder的还有个好处是:因为alphablend和ztest有冲突的地方。在只使用zorder时候,可以不开ztest,这样就不冲突了
7.在cocos2d-x中有一种指针的用法没有理解,比如CCMenuItem类中:
在CCMenuItem.h中定义如下:
class CC_DLL CCMenuItem : public CCNodeRGBA
{
...
protected:
CCObject* m_pListener;
SEL_MenuHandler m_pfnSelector;
...
};
在CCMenuItem.cpp中,初始化如下:
bool CCMenuItem::initWithTarget(CCObject *rec, SEL_MenuHandler selector)
{
setAnchorPoint(ccp(0.5f, 0.5f));
m_pListener = rec;
m_pfnSelector = selector;
m_bEnabled = true;
m_bSelected = false;
return true;
}
调用如下:
void CCMenuItem::activate()
{
if (m_bEnabled)
{
if (m_pListener && m_pfnSelector)
{
//这一句该怎么理解?
(m_pListener->*m_pfnSelector)(this);
}
if (kScriptTypeNone != m_eScriptType)
{
CCScriptEngineManager::sharedManager()->getScriptEngine()->executeMenuItemEvent(this);
}
}
}
又如在CCNotificationObserver.cpp中:
void CCNotificationObserver::performSelector(CCObject *obj)
{
if (m_target)
{
if (obj) {
(m_target->*m_selector)(obj);
} else {
(m_target->*m_selector)(m_object);
}
}
}
更多推荐



所有评论(0)