void TextureBlur::create(Texture2D* target, const int radius, const std::string& fileName, std::function<void()> callback, const int step) { CCASSERT(target != nullptr, "Null pointer passed as a texture to blur"); CCASSERT(radius <= maxRadius, "Blur radius is too big"); CCASSERT(radius > 0, "Blur radius is too small"); CCASSERT(!fileName.empty(), "File name can not be empty"); CCASSERT(step <= radius/2 + 1 , "Step is too big"); CCASSERT(step > 0 , "Step is too small"); Size textureSize = target->getContentSize(); Vec2 pixelSize = Vec2(float(step)/textureSize.width, float(step)/textureSize.height); int radiusWithStep = radius/step; float* weights = new float[maxRadius]; calculateGaussianWeights(radiusWithStep, weights); Sprite* stepX = CCSprite::createWithTexture(target); stepX->retain(); stepX->setPosition(Point(0.5f*textureSize.width, 0.5f*textureSize.height)); stepX->setFlippedY(true); GLProgram* blurX = getBlurShader(pixelSize, Vec2(1.0f, 0.0f), radiusWithStep, weights); stepX->setGLProgram(blurX); RenderTexture* rtX = RenderTexture::create(textureSize.width, textureSize.height); rtX->retain(); rtX->begin(); stepX->visit(); rtX->end(); Sprite* stepY = CCSprite::createWithTexture(rtX->getSprite()->getTexture()); stepY->retain(); stepY->setPosition(Point(0.5f*textureSize.width, 0.5f*textureSize.height)); stepY->setFlippedY(true); GLProgram* blurY = getBlurShader(pixelSize, Vec2(0.0f, 1.0f), radiusWithStep, weights); stepY->setGLProgram(blurY); RenderTexture* rtY = RenderTexture::create(textureSize.width, textureSize.height); rtY->retain(); rtY->begin(); stepY->visit(); rtY->end(); auto completionCallback = [rtX, rtY, stepX, stepY, callback](RenderTexture* rt, const std::string& filename) { stepX->release(); stepY->release(); rtX->release(); rtY->release(); callback(); }; rtY->saveToFile(fileName, true, completionCallback); }
void GameLayer::update(float a) { positon = hero->getPosition(); if (positon.x > mapSize.width - winSize.width / 2 - 60) { hero->setState(eNormalRight); isRightKeyDown = false; } mapRun(positon); freshScore(positon); if (isDead) { CocosDenshion::SimpleAudioEngine::sharedEngine()->stopBackgroundMusic(); CocosDenshion::SimpleAudioEngine::sharedEngine()->stopAllEffects(); RenderTexture* renderTexture = RenderTexture::create(WINSIZE.width, WINSIZE.height); renderTexture->retain(); Scene *s = Director::getInstance()->getRunningScene(); renderTexture->begin(); s->visit(); renderTexture->end(); Scene* scene = OverDialog::createScene(renderTexture, true); Director::getInstance()->pushScene(scene); } if (isRightKeyDown) { positon.x += hero->runSpeed; } if (isLeftKeyDown) { positon.x -= hero->runSpeed; } hero->upSpeed -= hero->gravity - hero->groundSurport; positon.y += hero->upSpeed; if (positon.y < 5) { isDead = true; } if (positon.y > 450) positon.y = 450; if (positon.y > mapSize.height - 48) { positon.y = mapSize.height - 48; } hero->setPosition(positon); collisionV(); collisionH(); }
virtual bool init() override { Size size = Director::getInstance()->getVisibleSize(); m_renderTexture = RenderTexture::create(size.width, size.height); if (!m_renderTexture) return false; m_renderTexture->retain(); m_renderTexture->setKeepMatrix(true); m_renderTexture->setAnchorPoint(Vec2::ZERO); m_renderTexture->getSprite()->setAnchorPoint(Vec2::ZERO); return Node::init(); }
std::string ProfileScreen::saveScreenshot() const { Size screen = Director::getInstance()->getWinSize(); RenderTexture *tex = RenderTexture::create(int(screen.width), int(screen.height)); tex->retain(); tex->setPosition(Vec2(screen.width/2.0f, screen.height/2.0f)); tex->begin(); Director::getInstance()->getRunningScene()->visit(); tex->end(); __String *path = __String::createWithFormat("%s%d.png", "screenshot_", int(time(0))); tex->saveToFile(path->getCString(), Image::Format::PNG); return FileUtils::getInstance()->getWritablePath() + path->getCString(); }
void GameLayer::pauseCallback(Ref* node) { isRightKeyDown = false; isLeftKeyDown = false; isSpaceKeyDown = false; hero->setState(eNormalRight); CocosDenshion::SimpleAudioEngine::sharedEngine()->stopAllEffects(); CocosDenshion::SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); RenderTexture* renderTexture = RenderTexture::create(WINSIZE.width, WINSIZE.height); renderTexture->retain(); Scene *s = Director::sharedDirector()->getRunningScene(); renderTexture->begin(); s->visit(); renderTexture->end(); Scene* pause = PauseDialog::createScene(renderTexture, true); Director::getInstance()->pushScene(pause); }
bool MapRender::initRenderTexture() { // create a render texture, this is what we are going to draw into int perWidth = WIDTH / MAX_TEX_X; int perHeight = HEIGHT / MAX_TEX_Y; for (size_t i = 0; i < MAX_TEX_X; i++) { for (size_t j = 0; j < MAX_TEX_Y; j++) { RenderTexture* renderTexture = RenderTexture::create(perWidth, perHeight, Texture2D::PixelFormat::RGBA8888); renderTexture->retain(); renderTexture->setPosition(cocos2d::Vec2(perWidth / 2 + i * perWidth, perHeight / 2 + j * perHeight)); this->addChild(renderTexture); _renderTexture[i][j] = renderTexture; } } return true; }
bool ShopLayer::init(Ref* pSender, SHOP_TYPE TYPE){ if (!Layer::init()) { return false; } auto winSize = Director::getInstance()->getWinSize(); auto visibleSize = Director::getInstance()->getVisibleSize(); auto Origin = Director::getInstance()->getVisibleOrigin(); controllNode = Node::create(); this->addChild(controllNode,1); SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ui_shop.plist"); auto ShopBg = Sprite::createWithSpriteFrameName("shop_bg.png"); ShopBg->setAnchorPoint(Point::ANCHOR_MIDDLE_RIGHT); ShopBg->setPosition(Point(winSize.width,Origin.y+visibleSize.height/2)); controllNode->addChild(ShopBg,0); m_shopGiftLayer = shopGiftLayer::create(); m_shopGiftLayer->setPosition(Point::ZERO); m_shopGiftLayer->setVisible(false); m_shopPowerLayer = shopPowerLayer::create(); m_shopPowerLayer->setPosition(Point::ZERO); m_shopPowerLayer->setVisible(false); m_shopTipLayer = shopTipLayer::create(); m_shopTipLayer->setPosition(Point::ZERO); m_shopTipLayer->setVisible(false); controllNode->addChild(m_shopTipLayer,2); controllNode->addChild(m_shopPowerLayer,2); controllNode->addChild(m_shopGiftLayer,2); auto giftBtn2 = MenuItemSprite::create(Sprite::createWithSpriteFrameName("shop_tab_gift1.png"), Sprite::createWithSpriteFrameName("shop_tab_gift1.png"), CC_CALLBACK_0(ShopLayer::changeToGiftCallFunc, this)); giftBtn2->setAnchorPoint(Point::ANCHOR_MIDDLE_RIGHT); giftBtn2->setPosition(Point(winSize.width-508,winSize.height/2+100)); auto powerBtn2 = MenuItemSprite::create(Sprite::createWithSpriteFrameName("shop_tab_energy1.png"), Sprite::createWithSpriteFrameName("shop_tab_energy1.png"), CC_CALLBACK_0(ShopLayer::changeToPowerCallFunc, this)); powerBtn2->setAnchorPoint(Point::ANCHOR_MIDDLE_RIGHT); powerBtn2->setPosition(Point(winSize.width-508,winSize.height/2)); auto tipBtn2 = MenuItemSprite::create(Sprite::createWithSpriteFrameName("shop_tab_tip1.png"), Sprite::createWithSpriteFrameName("shop_tab_tip1.png"), CC_CALLBACK_0(ShopLayer::changeTpTipCallFunc, this)); tipBtn2->setAnchorPoint(Point::ANCHOR_MIDDLE_RIGHT); tipBtn2->setPosition(Point(winSize.width-508,winSize.height/2-100)); auto menu = Menu::create(giftBtn2,powerBtn2,tipBtn2,NULL); menu->setPosition(Point::ZERO); controllNode->addChild(menu,1); SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ui_common.plist"); auto closeBtn = MenuItemSprite::create(Sprite::createWithSpriteFrameName("common_btn_close.png"), Sprite::createWithSpriteFrameName("common_btn_close.png"), CC_CALLBACK_0(ShopLayer::pushLayer, this)); CCLOG("asfasfasdfasdfadsf"); //closeBtn->setAnchorPoint(Point::ANCHOR_MIDDLE_RIGHT); closeBtn->setPosition(Point(winSize.width-150, winSize.height/2+200)); auto frontMenu = Menu::create(closeBtn, NULL); frontMenu->setPosition(Point::ZERO); controllNode->addChild(frontMenu, 9); switch (TYPE) { case SHOP_TYPE_GOLD: break; m_shopGiftLayer->setVisible(true); case SHOP_TYPE_POWER: m_shopPowerLayer->setVisible(true); break; case SHOP_TYPE_TIP: m_shopTipLayer->setVisible(true); break; case SHOP_TYPE_WITHOUTTIP: m_shopGiftLayer->setVisible(true); tipBtn2->setVisible(false); } controllNode->setPosition(Origin+Point(visibleSize.width/2,visibleSize.height+100)); //截图 RenderTexture* renderTexture = RenderTexture::create(winSize.width, winSize.height); renderTexture->retain(); Scene *runningScene = CCDirector::getInstance()->getRunningScene(); renderTexture->begin(); runningScene->visit(); renderTexture->end(); //下面这句用来测试截图是否成功,经测试成功 //renderTexture->saveToFile("123.png", Image::Format::PNG); //将截到的图做背景 Sprite *_spr = Sprite::createWithTexture(renderTexture->getSprite()->getTexture()); _spr->setPosition(Point(winSize.width / 2, winSize.height / 2)); _spr->setFlippedY(true); //翻转 _spr->setColor(Color3B::GRAY); //颜色(变灰暗) this->addChild(_spr, 0, BGTAG); auto moveTo = MoveTo::create(0.5f, Point::ZERO); auto easeBackInOut = EaseBackInOut::create(moveTo); //auto pasueAction = Sequence::create(easeBackInOut,CallFunc::create(CC_CALLBACK_0(ShopLayer::pauseCallFunc, this)), NULL); controllNode->runAction(easeBackInOut); return true; }