CCLayer 指定显示区域

 留下做个笔记.

cocos2d-x:CCLayerColor设置contentSize并隐蔽超出局限的内容


Admin
2011年12月16日名人名言:科学始终是不公道的。如果它不提出十个问题,也就永远不能解决一个问题。——萧伯纳

比来在做一个cocos2d-x下的CCTable,欲望能仿照UITableView的结果,然则碰到一个题目被卡住了。


我应用CCLayerColor来实现这个CCTable,因为CCLayerColor可以设置layer的大小,而CCLayer是不克不及设置的。


但题目是CCLayerColor是持续自CCLayer的,而CCLayer没有明白的鸿沟概念,所以超出设定的鸿沟的内容(如添加在layer中的CCSprite)仍然会显示在画面上,不会被隐蔽掉。而这一点和UITableView的结果是不一样的。


为懂得决这个题目,我在网上搜刮了一些材料。成果找到有一个别人已经做好的cocos2d版的CCTableView。(链接:http://www.cocos2d-iphone.org/archives/943)


然后我debug了一下他的代码,发明里面只有一段代码是用来实现隐蔽功能的。代码如下:



 1         GLfloat planeTop[]    = {0.0f, -1.0f0.0f, viewSize_.height};
 2         GLfloat planeBottom[] = {0.0f1.0f0.0f0.0f};
 3         GLfloat planeLeft[]   = {1.0f0.0f0.0f0.0f};
 4         GLfloat planeRight[]  = {-1.0f0.0f0.0f, viewSize_.width};
 5         
 6         glClipPlanef(GL_CLIP_PLANE0, planeTop);
 7         glClipPlanef(GL_CLIP_PLANE1, planeBottom);
 8         glClipPlanef(GL_CLIP_PLANE2, planeLeft);
 9         glClipPlanef(GL_CLIP_PLANE3, planeRight);
10         glEnable(GL_CLIP_PLANE0);
11         glEnable(GL_CLIP_PLANE1);
12         glEnable(GL_CLIP_PLANE2);
13         glEnable(GL_CLIP_PLANE3);


今朝我还不懂得这段代码的履行机制,但它确切有结果。是以我决意把这段代码移植到我的CCTable中。


因为原作者对CCNode做过一些批改。他在CCNode中添加了beforeDraw()和afterDraw()两个办法,并且在CCNode的visit()办法中添加了两句调用这两个办法的代码。批改后代码如下:



 1     if (!visible_)
 2         return;
 3     
 4     glPushMatrix();
 5     
 6     if ( grid_ && grid_.active) {
 7         [grid_ beforeDraw];
 8         [self transformAncestors];
 9     }
10     
11     [self transform];
12     [self beforeDraw];
13     for (CCNode * child in children_) {
14         if ( child.zOrder < 015             [child visit];
16         else
17             break;
18     }
19     
20     [self draw];
21 
22     for (CCNode * child in children_) {        
23         if ( child.zOrder >= 024             [child visit];
25     }
26     [self afterDraw];
27     if ( grid_ && grid_.active)
28         [grid_ afterDraw:self];
29     
30     glPopMatrix();


是以我在移植时辰也须要做同样的批改。


最后在CCTable中持续CCNode的beforeDraw()和afterDraw()办法,将把握隐蔽超出内容的代码参加到beforeDraw()中。再将恢复opengl设置的代码放在afterDraw()中:



1         glDisable(GL_CLIP_PLANE0);
2         glDisable(GL_CLIP_PLANE1);
3         glDisable(GL_CLIP_PLANE2);
4         glDisable(GL_CLIP_PLANE3);


完成后,编译调试一切正常,CCTable也有了将超出项目组隐蔽的功能。

 

你可能感兴趣的:(layer)