Cocos2d-x3.0 RenderTexture(1) 保存

tags:    時間:2014-05-04 18:58:33
Cocos2d-x3.0 RenderTexture(一) 保存


.h

#include "cocos2d.h" #include "cocos-ext.h" #include "ui/CocosGUI.h" #include "cocostudio/CocoStudio.h" USING_NS_CC;  USING_NS_CC_EXT; using namespace ui;

    RenderTexture* _target;     Vector<Sprite*> _brushs;          void onTouchesMoved(const std::vector<Touch*>& touches, Event* event);          void saveImage(cocos2d::Ref *sender);     void clearImage(cocos2d::Ref *sender); 

.cpp

        Size widgetSize = Director::getInstance()->getWinSize();                                             layout = Layout::create();         layout->setSize(Size(widgetSize.width, widgetSize.height));                 //橫向排列,這裡類似Android里的線性布局         //layout->setLayoutType(LAYOUT_RELATIVE);         /*以圖片為背景*/         layout->setBackGroundImageScale9Enabled(true);         layout->setBackGroundImage("green_edit.png");                  layout->setPosition(Point(0,0));         addChild(layout);                            alert = Text::create("Layout", "fonts/Marker Felt.ttf", 30 );         alert->setColor(Color3B(159, 168, 176));         alert->setPosition(Point(widgetSize.width / 2.0f,                                  widgetSize.height / 2.0f - alert->getSize().height * 3.075f));                  layout->addChild(alert);                            _target = RenderTexture::create(widgetSize.width, widgetSize.height, Texture2D::PixelFormat::RGBA8888);         _target->retain();         _target->setPosition(Point(widgetSize.width / 2, widgetSize.height / 2));         layout->addChild(_target);                            auto listener = EventListenerTouchAllAtOnce::create();         listener->onTouchesMoved = CC_CALLBACK_2(LayoutTest::onTouchesMoved, this);         _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);                  //save Image menu         MenuItemFont::setFontSize(40);         auto item1 = MenuItemFont::create("save Image", CC_CALLBACK_1(LayoutTest::saveImage, this));         auto item2 = MenuItemFont::create("Clear", CC_CALLBACK_1(LayoutTest::clearImage, this));         auto menu = Menu::create(item1,item2, NULL);         layout->addChild(menu);         menu->alignItemsVertically();         menu->setPosition(Point(VisibleRect::rightTop().x - 80, VisibleRect::rightTop().y - 80));          

void LayoutTest::onTouchesMoved(const std::vector<Touch *> &touches, cocos2d::Event *event) {           auto touch = touches[0];     auto start = touch->getLocation();     auto end = touch->getPreviousLocation();          //begin drawing to the render texture     _target->begin();          //for extra points ,we'll draw this smoothly from the last position and vary the sprite's     //scale/rotation/offset     float distance = start.getDistance(end);     if (distance > 1) {         int d = (int)distance;         _brushs.clear();         for (int i = 0; i < d; ++i) {             Sprite* sprite = Sprite::create("image.png");             sprite->setColor(Color3B::RED);                          sprite->setOpacity(20);             _brushs.pushBack(sprite);         }         for (int i  = 0 ; i  < d; ++i) {             float difx = end.x - start.x;             float dify = end.y - start.y;             float delta = (float) i / distance;             _brushs.at(i)->setPosition(Point(start.x + (difx * delta), start.y + (dify * delta)));             _brushs.at(i)->setRotation(rand() % 360);             float r = (float) (rand() % 50 / 50.0f) + 0.25f;             _brushs.at(i)->setScale(r);             _brushs.at(i)->setColor(Color3B(rand() % 127 + 128, 255, 255));             _brushs.at(i)->visit();         }     }     _target->end(); }   void LayoutTest::saveImage(cocos2d::Ref *sender) {     static int counter = 0;     char png[20];     sprintf(png, "image-%d.png",counter);     char jpg[20];     sprintf(jpg, "image-%d.jpg",counter);               _target->saveToFile(png, Image::Format::PNG);     _target->saveToFile(jpg, Image::Format::JPG);          //向本地寫入     std::string fileName = FileUtils::getInstance()->getWritablePath() + jpg;     auto action1 = DelayTime::create(1);     auto func = [&,fileName]()     {         auto sprite = Sprite::create(fileName);         layout->addChild(sprite);         sprite->setScale(0.3f);         sprite->setPosition(Point(40, 40));         sprite->setRotation(counter * 3);              };          runAction(Sequence::create(action1,CallFunc::create(func), NULL));     counter++; }  void LayoutTest::clearImage(cocos2d::Ref *sender) {     _target->clear(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1());      } 


推薦閱讀文章

Bookmark the permalink ,來源:互聯網