coco2d 设置可见区域
参考http://blog.youkuaiyun.com/tangaowen/article/details/7539536
原理
1 重写 visit 方法
2 glScissor 函数
-(void) visit { // quick return if not visible. children won't be drawn. if (!visible_) return; kmGLPushMatrix(); if ( grid_ && grid_.active) [grid_ beforeDraw]; [self beforeDraw];//绘制前 [self transform]; if(children_) { [self sortAllChildren]; ccArray *arrayData = children_->data; NSUInteger i = 0; // draw children zOrder < 0 for( ; i < arrayData->num; i++ ) { CCNode *child = arrayData->arr[i]; if ( [child zOrder] < 0 ) [child visit]; else break; } // self draw [self draw]; // draw children zOrder >= 0 for( ; i < arrayData->num; i++ ) { CCNode *child = arrayData->arr[i]; [child visit]; } } else [self draw]; [self afterDraw];//绘制完成后 // reset for next frame orderOfArrival_ = 0; if ( grid_ && grid_.active) [grid_ afterDraw:self]; kmGLPopMatrix(); } /** * clip this view so that outside of the visible bounds can be hidden. */ -(void)beforeDraw { CGSize m_viewSize; m_viewSize.width = 300; m_viewSize.height = 200; glEnable(GL_SCISSOR_TEST); const CGFloat s = [[CCDirector sharedDirector] contentScaleFactor]; glScissor(self.position.x *s - m_viewSize.width*s *0.5f, self.position.y * s - m_viewSize.height*s *0.5f, m_viewSize.width*s, m_viewSize.height*s); } /** * retract what's done in beforeDraw so that there's no side effect to * other nodes. */ -(void)afterDraw { glDisable(GL_SCISSOR_TEST); }