cocos2d-x 几何绘制: DrawingPrimitives 和 CCDrawNode

  在看书的时候只提到了DrawingPrimitives,然后我去搜索这个类,结果没搜到。心想难道是类名改了,那我搜方法名吧,搜了下DrawLine,果然被我搜到了。结果发现原来这些各方法都是全局函数,而没有被封装到类里做静态函数,囧,果然不能全相信书上的。

  同时看到源代码中有注释指名建议使用CCDrawNode来代替,于是顺便看了下CCDrawNode的源代码,发现函数比较少,要传递的参数比较多。当时心想那我为什么不直接使用函数名称简单易懂的DrawingPrimitives系列函数呢,然后去做了下实验,发现在helloworldscene函数里调用ccDrawLine竟然没有画出来。好吧,再仔细看了下说明,原来DrawingPrimitives系列的函数是必须在draw函数中调用才生效的,并且它们不是批处理的,效率比不上CCDrawNode,怪不得推荐使用CCDrawNode呢。

  

  吸取教训后,就去尝试使用CCDrawNode画了点几何图形。最终想到将来可能会需要显示某个结点对象的框架位置,来查看是否出错等。于是补上两个函数来做辅助,代码如下:

 1 static int giFrameTag = 1012;
 2 static const float gfFrameWidth = 1.0f;
 3 static const ccColor4F gdFrameColor = ccc4f(0.0f, 0.0f, 1.0f, 1.0f);
 4 void DrawNodeFrame(CCNode* npNode)
 5 {
 6     CCAssert(NULL != npNode, "DrawNodeFrame function can`t accept null attribute");
 7 
 8     // 画框架
 9     CCDrawNode* lpoDrawNode = CCDrawNode::create();
10     CCPoint ldLeftBottomPt = ccp(npNode->getPositionX() + gfFrameWidth,
11         npNode->getPositionY() + gfFrameWidth);
12     CCPoint ldRightBottomPt = ccp(npNode->getPositionX() + npNode->getContentSize().width - gfFrameWidth,
13         npNode->getPositionY() + gfFrameWidth);
14     CCPoint ldLeftTopPt = ccp(npNode->getPositionX() + gfFrameWidth,
15         npNode->getPositionY() + npNode->getContentSize().height - gfFrameWidth);
16     CCPoint ldRightTop = ccp(npNode->getPositionX() + npNode->getContentSize().width - gfFrameWidth, 
17         npNode->getPositionY() + npNode->getContentSize().height - gfFrameWidth);
18 
19     CCPoint ldPoints[] = {ldLeftBottomPt, ldRightBottomPt, ldRightTop, ldLeftTopPt};
20     lpoDrawNode->drawPolygon(ldPoints, sizeof(ldPoints)/sizeof(ldPoints[0]), 
21         ccc4f(0.0f, 0.0f, 0.0f, 0.0f), gfFrameWidth, gdFrameColor);
22 
23     // 获取当前子节点中最大的zorder
24     int liMaxZorder = 0;
25     if(npNode->getChildrenCount() > 0)
26     {
27         CCArray* lpoChildrenArray = npNode->getChildren();
28         int liCurrentZorder = 0;
29         for(int i = 0; i < lpoChildrenArray->count(); ++i)
30         {
31             liCurrentZorder = ((CCNode*)lpoChildrenArray->objectAtIndex(i))->getZOrder();
32             if(liMaxZorder < liCurrentZorder)
33                 liMaxZorder = liCurrentZorder;
34         }
35     }
36     liMaxZorder += 1;
37 
38     // 获取一个不存在的Tag
39     while(NULL != npNode->getActionByTag(giFrameTag))
40     {
41         ++giFrameTag;
42     }
43 
44     npNode->addChild(lpoDrawNode, liMaxZorder, giFrameTag);
45 }
46 void UndrawNodeFrame(CCNode* npNode)
47 {
48     if(NULL != npNode && NULL != npNode->getActionByTag(giFrameTag))
49     {
50         npNode->removeChildByTag(giFrameTag, true);
51     }
52 }

功能并不复杂,在需要显示的结点对象中调用DrawNodeFrame并传入对应的指针即可(最好是在增加完所有的子对象之后才调用),不需要显示了则调用UndrawNodeFrame即可。

posted on 2013-11-04 00:35  好好单调  阅读(1109)  评论(0编辑  收藏  举报