Cocos2d-x3.0 RenderTexture(一) 保存

时间:2023-02-08 16:37:14


.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());
    
}