解释RayWenderlich的CCParallaxNodeExtras.h

问题描述 投票:1回答:1

我正在浏览用于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所以,实际上存储了偏移/比率?

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

android cocos2d-x game-engine raytracing
1个回答
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类的定义

© www.soinside.com 2019 - 2024. All rights reserved.