CCLayer中如何 控制只显示特定的区域

                                                       CCLayer中如何 控制只显示特定的区域

           在CCLayer中,我们有时候要实现自己的CCLayer,当有内容超过我们的范围后,我们想不显示这个超出范围的内容,这个用opengGL的  

glScissor  函数可以实现。scissor的意思是剪切。



         在CCLayer中,负责绘制的函数是在visit函数中,所以我们需要将这个函数重写。

         相关的代码如下:

         

  1. -(void) visit  
  2. {  
  3.     // quick return if not visible. children won't be drawn.  
  4.     if (!visible_)  
  5.         return;  
  6.       
  7.     kmGLPushMatrix();  
  8.       
  9.     if ( grid_ && grid_.active)  
  10.         [grid_ beforeDraw];  
  11.       
  12.     //add  by  tangaowen  
  13.     [self beforeDraw];  
  14.       
  15.     [self transform];  
  16.       
  17.     if(children_) {  
  18.           
  19.         [self sortAllChildren];  
  20.           
  21.         ccArray *arrayData = children_->data;  
  22.         NSUInteger i = 0;  
  23.           
  24.         // draw children zOrder < 0  
  25.         for( ; i < arrayData->num; i++ ) {  
  26.             CCNode *child = arrayData->arr[i];  
  27.             if ( [child zOrder] < 0 )  
  28.                 [child visit];  
  29.             else  
  30.                 break;  
  31.         }  
  32.           
  33.         // self draw  
  34.         [self draw];  
  35.           
  36.         // draw children zOrder >= 0  
  37.         for( ; i < arrayData->num; i++ ) {  
  38.             CCNode *child =  arrayData->arr[i];  
  39.             [child visit];  
  40.         }  
  41.           
  42.     } else  
  43.         [self draw];  
  44.       
  45.     // reset for next frame  
  46.     orderOfArrival_ = 0;  
  47.       
  48.     if ( grid_ && grid_.active)  
  49.         [grid_ afterDraw:self];  
  50.       
  51.     //add  by tangaowen  
  52.     [self  afterDraw];  
  53.       
  54.     kmGLPopMatrix();  
  55.       
  56.       
  57.       
  58.     //已经包含了 super的功能,没有必要去调用super  visit了  
  59.     //[super visit];  
  60. }  

这个函数里面调用了两个辅助函数:

beforeDraw  和 

afterDraw.

 

      实际上上面的visit函数就是在 CCLayer的visit的默认实现基础上增加了对 beforeDraw和 afterDraw这两个函数的调用来实现我们的裁剪功能。如果以后我们有其他的特殊需求,我们就可以在beforeDraw和 afterDraw中实现。


      好了,我们来看beforeDraw和afterDraw 两个函数的实现:

      

  1. /** 
  2.  * clip this view so that outside of the visible bounds can be hidden. 
  3.  */  
  4. -(void)beforeDraw   
  5. {  
  6.     glEnable(GL_SCISSOR_TEST);  
  7.     const CGFloat s = [[CCDirector sharedDirector] contentScaleFactor];  
  8.     glScissor(self.position.x *s - m_viewSize.width*s *0.5f,  
  9.               self.position.y * s - m_viewSize.height*s *0.5f,  
  10.               m_viewSize.width*s,   
  11.               m_viewSize.height*s);  
  12.       
  13. }  

  1. /** 
  2.  * retract what's done in beforeDraw so that there's no side effect to 
  3.  * other nodes. 
  4.  */  
  5. -(void)afterDraw   
  6. {  
  7.     glDisable(GL_SCISSOR_TEST);  
  8. }  

   beforeDraw 就是启用GL_SCISSOR_TEST,然后用glScissor函数设置要显示的范围,left,top,width,height,如果要显示从(0,0)开始的内容,那么left和top就设置为 self.position.x 和 self.position.y即可。


   上面我们的显示是以self.position为中点的,所以需要减去size的一半,这个是基于你在当前layer里面的内容的坐标布局的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值