首先,如果程序报 Stencil buffer is not enabled的错误,修改如下:
IOS:
找到AppController.mm类,按下面修改
- window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
- EAGLView *__glView = [EAGLView viewWithFrame: [window bounds]
- pixelFormat: kEAGLColorFormatRGBA8
- depthFormat: GL_DEPTH24_STENCIL8_OES
- preserveBackbuffer: NO
- sharegroup: nil
- multiSampling: NO
- numberOfSamples:0 ];
Android:如下图
找到Cocos2dxGLSurfaceView.java
- //在Cocos2dxGLSurfaceView.java类中
- public Cocos2dxGLSurfaceView(final Context context) {
- super(context);
- this.setEGLConfigChooser(5, 6, 5, 0, 16, 8); // 添加此句
- this.initView();
- }
下面是创建裁剪区域的代码实现:
.h
- #ifndef __HELLOWORLD_SCENE_H__
- #define __HELLOWORLD_SCENE_H__
- #include "cocos2d.h"
- USING_NS_CC;
- enum{
- clippingNodeTag,
- spriteTag,
- };
- class HelloWorld : public CCLayer
- {
- public:
- virtual bool init();
- static CCScene* scene();
- CREATE_FUNC(HelloWorld);
- CCPoint beganPoint;
- virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
- virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
- virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
- virtual void onEnter();
- virtual void onExit();
- };
- #endif // __HELLOWORLD_SCENE_H__
.cpp
- #include "HelloWorldScene.h"
- #include "SimpleAudioEngine.h"
- using namespace cocos2d;
- using namespace CocosDenshion;
- CCScene* HelloWorld::scene()
- {
- CCScene *scene = CCScene::create();
- HelloWorld *layer = HelloWorld::create();
- scene->addChild(layer);
- return scene;
- }
- bool HelloWorld::init()
- {
- if ( !CCLayer::init() )
- {
- return false;
- }
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- //添加一背景
- CCSprite* background = CCSprite::create("background3.png");
- background->setScale(2);
- background->setPosition(ccp(size.width/2, size.height/2));
- this->addChild(background,0);
- //创建一个200x200大小的裁剪区域
- CCClippingNode* clippingNode = CCClippingNode::create();
- //设置裁剪区域大小
- clippingNode->setContentSize(CCSizeMake(200, 200));
- clippingNode->setAnchorPoint(ccp(0.5, 0.5));
- clippingNode->setPosition(ccp(size.width/2, size.height/2));
- this->addChild(clippingNode,1,clippingNodeTag);
- //向裁剪区域中加入内容
- CCSprite* sprite = CCSprite::create("HelloWorld.png");
- sprite->setPosition(ccp(clippingNode->getContentSize().width/2, clippingNode->getContentSize().height/2));
- clippingNode->addChild(sprite,1,spriteTag);
- //创建裁剪模板,裁剪节点将按照这个模板来裁剪区域
- CCDrawNode *stencil = CCDrawNode::create();
- CCPoint rectangle[4];
- rectangle[0] = ccp(0, 0);
- rectangle[1] = ccp(clippingNode->getContentSize().width, 0);
- rectangle[2] = ccp(clippingNode->getContentSize().width, clippingNode->getContentSize().height);
- rectangle[3] = ccp(0, clippingNode->getContentSize().height);
- ccColor4F white = {1, 1, 1, 1};
- //画一个多边形 这画一个200x200的矩形作为模板
- stencil->drawPolygon(rectangle, 4, white, 1, white);
- clippingNode->setStencil(stencil);
- //用来设置显示裁剪区域还是非裁剪区域的
- clippingNode->setInverted(false);//在裁剪区域内显示加入的内容
- return true;
- }
- bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
- {
- beganPoint = pTouch->getLocation();
- return true;
- }
- void HelloWorld::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
- {
- CCPoint distance = ccpSub(pTouch->getLocation(),beganPoint);
- CCClippingNode* clippingNode = (CCClippingNode*)this->getChildByTag(clippingNodeTag);
- CCSprite* sprite = (CCSprite*)clippingNode->getChildByTag(spriteTag);
- sprite->setPosition(ccpAdd(sprite->getPosition(), distance));
- beganPoint = pTouch->getLocation();
- }
- void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
- {
- }
- void HelloWorld::onEnter()
- {
- CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, false);
- CCLayer::onEnter();
- }
- void HelloWorld::onExit()
- {
- CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
- CCLayer::onExit();
- }
转载http://blog.csdn.net/song_hui_xiang/article/details/22809647