在看书的时候只提到了DrawingPrimitives,然后我去搜索这个类,结果没搜到。心想难道是类名改了,那我搜方法名吧,搜了下DrawLine,果然被我搜到了。结果发现原来这些各方法都是全局函数,而没有被封装到类里做静态函数,囧,果然不能全相信书上的。
同时看到源代码中有注释指名建议使用CCDrawNode来代替,于是顺便看了下CCDrawNode的源代码,发现函数比较少,要传递的参数比较多。当时心想那我为什么不直接使用函数名称简单易懂的DrawingPrimitives系列函数呢,然后去做了下实验,发现在helloworldscene函数里调用ccDrawLine竟然没有画出来。好吧,再仔细看了下说明,原来DrawingPrimitives系列的函数是必须在draw函数中调用才生效的,并且它们不是批处理的,效率比不上CCDrawNode,怪不得推荐使用CCDrawNode呢。
吸取教训后,就去尝试使用CCDrawNode画了点几何图形。最终想到将来可能会需要显示某个结点对象的框架位置,来查看是否出错等。于是补上两个函数来做辅助,代码如下:
static int giFrameTag = ;
static const float gfFrameWidth = 1.0f;
static const ccColor4F gdFrameColor = ccc4f(0.0f, 0.0f, 1.0f, 1.0f);
void DrawNodeFrame(CCNode* npNode)
{
CCAssert(NULL != npNode, "DrawNodeFrame function can`t accept null attribute"); // 画框架
CCDrawNode* lpoDrawNode = CCDrawNode::create();
CCPoint ldLeftBottomPt = ccp(npNode->getPositionX() + gfFrameWidth,
npNode->getPositionY() + gfFrameWidth);
CCPoint ldRightBottomPt = ccp(npNode->getPositionX() + npNode->getContentSize().width - gfFrameWidth,
npNode->getPositionY() + gfFrameWidth);
CCPoint ldLeftTopPt = ccp(npNode->getPositionX() + gfFrameWidth,
npNode->getPositionY() + npNode->getContentSize().height - gfFrameWidth);
CCPoint ldRightTop = ccp(npNode->getPositionX() + npNode->getContentSize().width - gfFrameWidth,
npNode->getPositionY() + npNode->getContentSize().height - gfFrameWidth); CCPoint ldPoints[] = {ldLeftBottomPt, ldRightBottomPt, ldRightTop, ldLeftTopPt};
lpoDrawNode->drawPolygon(ldPoints, sizeof(ldPoints)/sizeof(ldPoints[]),
ccc4f(0.0f, 0.0f, 0.0f, 0.0f), gfFrameWidth, gdFrameColor); // 获取当前子节点中最大的zorder
int liMaxZorder = ;
if(npNode->getChildrenCount() > )
{
CCArray* lpoChildrenArray = npNode->getChildren();
int liCurrentZorder = ;
for(int i = ; i < lpoChildrenArray->count(); ++i)
{
liCurrentZorder = ((CCNode*)lpoChildrenArray->objectAtIndex(i))->getZOrder();
if(liMaxZorder < liCurrentZorder)
liMaxZorder = liCurrentZorder;
}
}
liMaxZorder += ; // 获取一个不存在的Tag
while(NULL != npNode->getActionByTag(giFrameTag))
{
++giFrameTag;
} npNode->addChild(lpoDrawNode, liMaxZorder, giFrameTag);
}
void UndrawNodeFrame(CCNode* npNode)
{
if(NULL != npNode && NULL != npNode->getActionByTag(giFrameTag))
{
npNode->removeChildByTag(giFrameTag, true);
}
}
功能并不复杂,在需要显示的结点对象中调用DrawNodeFrame并传入对应的指针即可(最好是在增加完所有的子对象之后才调用),不需要显示了则调用UndrawNodeFrame即可。