bool XiaoboWriteLayer::init(){
    if (!CCLayer::init()) {
        return false;
    }
    
    CCDrawNode* bg=CCDrawNode::create();
    bg->setAnchorPoint(ccp(0, 0));
    bg->setPosition(ccp(0, 0));
    this->addChild(bg);
    bg->drawSegment(ccp(20,20), ccp(50,50), 10, ccc4f(0, 1, 0, 1));
    CCPoint points[] = { CCPoint(0,0), CCPoint(400,0), CCPoint(400,400), CCPoint(0,400) };
    bg->drawPolygon(points, sizeof(points)/sizeof(points[0]),ccc4FFromccc3B(ccc3(253,249,238)), 3,ccc4FFromccc3B(ccc3(84,85,104)));
    
    CCLabelTTF* hanziLabelBg=CCLabelTTF::create(m_hanzi->getzi().c_str(), "KaiTi.ttf", 400);
    hanziLabelBg->setPosition(ccp(200,400));
    hanziLabelBg->setFontFillColor(ccc3(255, 255, 255));
    hanziLabelBg->enableStroke(ccc3(0, 0, 0), 1);
    hanziLabelBg->setAnchorPoint(ccp(0.5, 1));
    hanziLabelBg->setTag(TAG_HANZI_LABEL);
    this->addChild(hanziLabelBg);
    
    m_draw=CCDrawNode::create();
    this->addChild(m_draw);
    
    m_parseredHanzi->step();
    CCPoint startPoint=m_parseredHanzi->getTempPoint();
    
    switch (m_gamePlayer) {
        case kGamePlayerXiaobo:{
            m_touxiang=CCSprite::createWithSpriteFrameName("pet_touxiang.png");
//            m_touxiang->setScale(0.5);
            m_touxiang->setPosition(startPoint);
            this->addChild(m_touxiang);
        }
            break;
        case kGamePlayerWo:{
            m_touxiang=CCSprite::createWithSpriteFrameName("pet_pencil.png");
            m_touxiang->setScale(0.5);
            m_touxiang->setPosition(startPoint);
            m_touxiang->setAnchorPoint(ccp(0, 0));
            this->addChild(m_touxiang);
        }
            break;
    }
    
    return true;
}
void XiaoboWriteLayer::loop(float t){
    CCPoint start=m_parseredHanzi->getTempPoint();
    HanziStepStatus status=m_parseredHanzi->step();
    CCPoint end=m_parseredHanzi->getTempPoint();
    m_touxiang->setPosition(end);
    switch (status) {
        case kHanziStepMiddlePoint:
        case kHanziStepStrokeEnd:
            m_draw->drawSegment(start, end, 10, ccc4FFromccc3B(ccc3(100,53,14)));
            break;
        case kHanziStepHanziEnd:{
            m_delegate->xiaoboEndCallBack();
        }
        default:
            break;
    }
}
void CCRectNode::draw()
{
	const ccColor3B& tColor(getColor());
	CCPoint tOrigin(isIgnoreAnchorPointForPosition() ? CCPointZero : getAnchorPointInPoints());
	CCPoint tDestination(ccpShift(tOrigin, getContentSize()));

	if (m_bFill)
    {
		ccColor4F tColor4F(ccc4FFromccc3B(tColor));
		tColor4F.a = getOpacity() / 255.0f;
    	ccDrawSolidRect(tOrigin, tDestination, tColor4F);
    }
    else
    {
    	ccDrawColor4B(tColor.r, tColor.g, tColor.b, getOpacity());
    	ccDrawRect(tOrigin, tDestination);
    }
}
//--------------------------------------------------------
// CColorSpriteScene
//--------------------------------------------------------
CRemoveBKSpriteScene::CRemoveBKSpriteScene()
{
	CCLayerColor *layer = CCLayerColor::create( ccc4BFromccc4F(ccc4FFromccc3B( ccGRAY )));
	layer->setColor( ccGRAY );
	addChild(layer);

	CCSize winSize = CCDirector::sharedDirector()->getWinSize();
	CRemoveBKSprite* pRemoveSprite = CRemoveBKSprite::Create( s_szRemoveBKSprite );
	if( pRemoveSprite )
	{
		pRemoveSprite->setPosition(ccp(winSize.width / 2 + pRemoveSprite->getContentSize().width / 2 , 
			winSize.height / 2));
		layer->addChild( pRemoveSprite );
	}
	CCSprite* pNormalSprite = CCSprite::create( s_szRemoveBKSprite );
	if( pNormalSprite )
	{
		pNormalSprite->setPosition(ccp(winSize.width / 2 - pNormalSprite->getContentSize().width / 2 , 
			winSize.height / 2));
		layer->addChild( pNormalSprite );
	}
}
void GameLayer::generateBackground() {
	
	//CCSize textureSize = CCSizeMake(screenW, screenH);
    int textureSize = 512;
    
	ccColor3B c = (ccColor3B){140,205,221};
	//ccColor3B c = generateDarkColor();
    ccColor4F cf = ccc4FFromccc3B(c);
    
    //CCRenderTexture *rt = [CCRenderTexture renderTextureWithWidth:textureSize.width height:textureSize.height];
    CCRenderTexture * rt = CCRenderTexture::renderTextureWithWidthAndHeight(textureSize, textureSize);
    //[rt beginWithClear:(float)c.r/256.0f g:(float)c.g/256.0f b:(float)c.b/256.0f a:1];
    rt->beginWithClear(cf.r, cf.g, cf.b, cf.a);
    
	// layer 1: gradient
    
	float gradientAlpha = 0.25f;
    
	glDisable(GL_TEXTURE_2D);
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	
    CCPoint vertices[4];
	ccColor4F colors[4];
    int nVertices = 0;
	
    vertices[nVertices] = ccp(0, 0);
    colors[nVertices++] = (ccColor4F){1, 1, 1, 0};
    vertices[nVertices] = ccp(textureSize, 0);
    colors[nVertices++] = (ccColor4F){1, 1, 1, 0};
    vertices[nVertices] = ccp(0, textureSize);
    colors[nVertices++] = (ccColor4F){1, 1, 1, gradientAlpha};
    vertices[nVertices] = ccp(textureSize, textureSize);
    colors[nVertices++] = (ccColor4F){1, 1, 1, gradientAlpha};
	
    glVertexPointer(2, GL_FLOAT, 0, vertices);
	glColorPointer(4, GL_FLOAT, 0, colors);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, (GLsizei)nVertices);
	
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glEnable(GL_TEXTURE_2D);	
    
	// layer 2: noise
	
	//CCSprite *s = [CCSprite spriteWithFile:@"noise.png"];
    CCSprite *s = CCSprite::spriteWithFile("noise.png");
    
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    
	//[s setBlendFunc:(ccBlendFunc){GL_DST_COLOR, GL_ZERO}];
    s->setBlendFunc((ccBlendFunc){GL_DST_COLOR, GL_ZERO});
	//s.position = ccp(textureSize.width/2, textureSize.height/2);
    s->setPosition(ccp(textureSize/2, textureSize/2));
    //s.scale = (float)textureSize/512.0f;
    s->setScale((float)textureSize/512.0f);
    
    //s->setScaleX(winSize.width/s->getContentSize().width);
    //s->setScaleY(winSize.height/s->getContentSize().height);
    
    glColor4f(1,1,1,1);
	//[s visit];
	s->visit();
    //[rt end];
    rt->end();
    
    //self.background = [CCSprite spriteWithTexture:rt.sprite.texture];
    setBackground(CCSprite::spriteWithTexture(rt->getSprite()->getTexture()));
    ccTexParams tp = {GL_NEAREST, GL_NEAREST, GL_REPEAT, GL_REPEAT};
    //[_background.texture setTexParameters:&tp];
    getBackground()->getTexture()->setTexParameters(&tp);
    //_background.position = ccp(screenW/2,screenH/2);
    getBackground()->setPosition(ccp(screenW/2,screenH/2));
    //    _background.scale = 0.5f;
    
    getBackground()->setScaleX(winSize.width/getBackground()->getContentSize().width);
    getBackground()->setScaleY(winSize.height/getBackground()->getContentSize().height);
	
	//return [CCSprite spriteWithTexture:rt.sprite.texture];
    //return CCSprite::spriteWithTexture(rt->getSprite()->getTexture());
    
    addChild(getBackground());
}