新建工程testClip
添加类ClipLayer
ClipLayer.h
//
// ClipLayer.h
// testClip
//
// Created by cloud on 13-4-11.
//
//
#ifndef __testClip__ClipLayer__
#define __testClip__ClipLayer__
#include "cocos2d.h"
using namespace cocos2d;
class ClipLayer:public CCLayer
{
public:
static ClipLayer *create(CCSize size);
void clipLayerInit(CCSize size);
void visit();
CCSize mSize;
};
#endif /* defined(__testClip__ClipLayer__) */
//
// ClipLayer.cpp
// testClip
//
// Created by cloud on 13-4-11.
//
//
#include "ClipLayer.h"
ClipLayer *ClipLayer::create(CCSize size)
{
ClipLayer *nCLayer=new ClipLayer();
if (nCLayer&&nCLayer->init()) {
nCLayer->autorelease();
nCLayer->clipLayerInit(size);
return nCLayer;
}
CC_SAFE_DELETE(nCLayer);
return NULL;
}
void ClipLayer::clipLayerInit(CCSize size)
{
mSize=size;
}
void ClipLayer::visit()
{
kmGLPushMatrix();
if (m_pGrid&&m_pGrid->isActive()) {
m_pGrid->beforeDraw();
this->transformAncestors();
}
this->transform();
//默认情况,剪裁是禁用的
glEnable(GL_SCISSOR_TEST);//启用剪裁测试
float s= this->getScale();//当前layer缩放的倍数
//获取缩放倍率
s *=CCDirector::sharedDirector()->getContentScaleFactor();
CCPoint screenPos=this->convertToWorldSpace(this->getParent()->getPosition());
//默认不设置Scissor的大小是整个视图的大小
glScissor((GLint)screenPos.x, (GLint)screenPos.y, (GLsizei)(mSize.width*s), (GLsizei)(mSize.height*s));
if (m_pChildren) {
ccArray *arrayData=m_pChildren->data;
unsigned int i=0;
for (; i<arrayData->num; i++)
{
CCNode *child=(CCNode *)arrayData->arr[i];
if(child->getZOrder()<0)
{
child->visit();
}
else
{
break;
}
}
this->draw();
for (;i<arrayData->num; i++) {
CCNode *child=(CCNode*)arrayData->arr[i];
child->visit();
}
}
else
{
this->draw();
}
glDisable(GL_SCISSOR_TEST);//禁用剪裁
if (m_pGrid&&m_pGrid->isActive()) {
m_pGrid->afterDraw(this);
}
kmGLPopMatrix();
}
修改HelloWorldScene.cpp#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"
#include "ClipLayer.h"
using namespace cocos2d;
using namespace CocosDenshion;
CCScene* HelloWorld::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::create();
// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
return false;
}
#define clipMacro 3
switch (clipMacro) {
case 1:
{
CCLabelTTF *label=CCLabelTTF::create("正常精灵", "Helvetica", 24);
label->setPosition(ccp(100,260));
addChild(label);
CCLabelTTF *clipLabel=CCLabelTTF::create("剪裁后的精灵", "Helvetica",24);
clipLabel->setPosition(ccp(300,260));
addChild(clipLabel);
CCSprite *sprite=CCSprite::create("Icon.png");
sprite->setPosition(ccpAdd(label->getPosition(), ccp(0,-100)));
addChild(sprite);
CCSprite *clipSprite=CCSprite::create("Icon.png");
clipSprite->setPosition(ccpAdd(clipLabel->getPosition(), ccp(0,-100)));
clipSprite->setTextureRect(CCRectMake(0, 0, 30, 30));
addChild(clipSprite);
}
break;
case 2:
{
CCLayer *layer=CCLayer::create();
layer->setPosition(ccp(190,110));//Icon不应该显示全,但它显示全了,说明没剪裁
layer->addChild(CCSprite::create("Icon.png"));
addChild(layer);
}
break;
case 3:
{
CCSize size = CCDirector::sharedDirector()->getWinSize();
CCLayerColor* colorBg = CCLayerColor::create(ccc4(255, 127, 0, 255), size.width,size.height);
addChild(colorBg);
ClipLayer *clipLayer=ClipLayer::create(CCSizeMake(100, 100));
clipLayer->setPosition(ccp(190,110));
clipLayer->addChild(CCSprite::create("Icon.png"));
addChild(clipLayer);
}
break;
default:
break;
}
return true;
}