我正在浏览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;
}
}
}
我的疑惑:
我查看了ccParallaxNode.h及其那里,
//保存子项的偏移量/比率的数组
CC_SYNTHESIZE(struct _ccArray *,m_pParallaxArray,ParallaxArray)
和_ccArray有CCObject **,这意味着CCObjects数组和CCObject没有任何变量m_tOffset / m_tRatio或m_pChild所以实际上存储了偏移/比率?
这些疑惑让我疯狂。请帮忙!!
答案 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;
}
};
不知道你在哪里放了日志,但是。 setOffset
和getOffset
隐式定义在宏CC_SYNTHESIZE
中。毫无疑问,这些将被调用,否则编译器会引发错误或应用程序将在运行时崩溃。
3)CC_SYNTHESIZE(struct _ccArray *, m_pParallaxArray, ParallaxArray)
此处m_pParallaxArray
用于存储CCPointObject
,其中每个CCPointObject
保存视差节点的一个孩子的信息,即对孩子本身m_pChild
和m_pChild
的引用m_tRatio
您可以在CCPointObject
和CCParallaxNodeExtras.cpp
CCParallaxNode.cpp
课程的定义