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


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

  • 相关阅读:
    基于云计算的电子政务网站群整合模式为政府创造新的价值
    新技术下的智慧政府门户网站群建设升级发展之路
    集团企业网站群建设发展趋势
    省级网站群建设
    区县网站群建设改版过程
    区县网站群建设重点
    高校网站群建设方案简介
    我县政府网站集群建设经验总结
    政府网站集群建设
    CMS发展趋势之开源、插件
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4799170.html
Copyright © 2011-2022 走看看