1

我正在阅读Ray Wenderlich 的Android 空间游戏教程。很棒的教程。我是一名中级 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 初始化为该对象的偏移量和比率的实际值?
  • 我已经在 CCPointObject 的 setOffset/getOffset 函数中给出了 CCLogs,但它们从未被调用过,所以调用了哪个 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 所以,偏移量/比率实际存储在哪里?

这些疑虑让我发疯。请帮忙 !!

4

1 回答 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

您可以在和中查看CCPointObject类的定义CCParallaxNodeExtras.cppCCParallaxNode.cpp

于 2013-07-02T13:03:01.703 回答