zoukankan      html  css  js  c++  java
  • 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());
        
    }
    


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    LeetCode 295. Find Median from Data Stream (堆)
    LeetCode 292. Nim Game(博弈论)
    《JavaScript 模式》读书笔记(4)— 函数2
    《JavaScript 模式》读书笔记(4)— 函数1
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数3
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数2
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数1
    《JavaScript 模式》读书笔记(2)— 基本技巧3
    《JavaScript 模式》读书笔记(2)— 基本技巧2
    《JavaScript 模式》读书笔记(2)— 基本技巧1
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4799170.html
Copyright © 2011-2022 走看看