解释RayWenderlich的CCParallaxNodeExtras.h

时间:2013-06-30 09:51:25

标签: android cocos2d-x game-engine raytracing

我正在浏览android的Ray Wenderlich's Space Game教程。 伟大的教程。 我是一名中级C ++程序员,我正在努力了解这里发生的事情。 只是为了理解我已经重写了它。删除宏。

class CCPointObject: CCObject 
{
 protected:
      CCPoint m_tRatio;
      CCPoint m_tOffset;
      CCNode *m_pChild; 
 public:

virtual CCPoint getRatio() const
{
    CCLog("getRatio_CALLED");
    return m_tRatio;
}

virtual void setRatio(CCPoint newRatio)
{
    CCLog("setRatio_CALLED");
    m_tRatio = newRatio;
}
    .
    ..
    ...
    // similarly getChild/setChild/getOffset/setOffset is defined. The code works perfectly fine.
};

void CCParallaxNodeExtras::incrementOffset(CCPoint offset,CCNode* node)
{
    for( unsigned int i = 0; i < m_pParallaxArray->num; i++) 
    {
        CCPointObject *point = (CCPointObject *)m_pParallaxArray->arr[i];
        CCNode * curNode = point->getChild();
        if( curNode->isEqual(node) ) 
        {
            point->setOffset( ccpAdd(point->getOffset(), offset) );
            break;
        }
    }
}

我的疑惑:

  • 初始化点时(通过将CCObject *转换为CCPointObject *),如何将m_tOffset,m_tRatio和m_pChild初始化为该Object的偏移量和比率的实际值?
  • 我在CCPointObject的setOffset / getOffset函数中给出了CCLog,但它们从未被调用过,因此调用了setOffset / getOffset? 由于CCPointObject继承自CCObject,所以我想,可能是CCObject的setOffset / getOffset被调用了,但是,正如我检查的那样,CCObject中没有声明setOffset / getOffset。
  • 我查看了ccParallaxNode.h及其那里,

    //保存子项的偏移量/比率的数组

    CC_SYNTHESIZE(struct _ccArray *,m_pParallaxArray,ParallaxArray)

    和_ccArray有CCObject **,这意味着CCObjects数组和CCObject没有任何变量m_tOffset / m_tRatio或m_pChild所以实际上存储了偏移/比率?

这些疑惑让我疯狂。请帮忙!!

1 个答案:

答案 0 :(得分:0)

1)类型转换是告诉编译器=右侧的对象是=左侧的一种对象。所以这里没有初始化。我们不是创建一个新对象,只需类型转换,编译器假定该对象属于该类。

2)以下是CCPointObject

的定义
class CCPointObject : CCObject
{
    CC_SYNTHESIZE(CCPoint, m_tRatio, Ratio)
    CC_SYNTHESIZE(CCPoint, m_tOffset, Offset)
    CC_SYNTHESIZE(CCNode *,m_pChild, Child)    // weak ref

    static CCPointObject * pointWithCCPoint(CCPoint ratio, CCPoint offset)
    {
        CCPointObject *pRet = new CCPointObject();
        pRet->initWithCCPoint(ratio, offset);
        pRet->autorelease();
        return pRet;
    }
    bool initWithCCPoint(CCPoint ratio, CCPoint offset)
    {
        m_tRatio = ratio;
        m_tOffset = offset;
        m_pChild = NULL;
        return true;
    }
};

不知道你在哪里放了日志,但是。 setOffsetgetOffset隐式定义在宏CC_SYNTHESIZE中。毫无疑问,这些将被调用,否则编译器会引发错误或应用程序将在运行时崩溃。

3)CC_SYNTHESIZE(struct _ccArray *, m_pParallaxArray, ParallaxArray) 此处m_pParallaxArray用于存储CCPointObject,其中每个CCPointObject保存视差节点的一个孩子的信息,即对孩子本身m_pChildm_pChild的引用m_tRatio

您可以在CCPointObjectCCParallaxNodeExtras.cpp

中查看CCParallaxNode.cpp课程的定义