• Cocos2d-x 3.x使用第三方库播放gif图


    Cocos2d-x 3.x使用第三方库播放gif图

    效果图:

    testGif (1).gif

    由于kd的项目中需要用到gif,而Cocos2d-x本身是不支持gif播放的。百度 + google 了很久,最终都指向:https://github.com/opentalking/gif-for-cocos2dx

    这里,可惜一开始看到的时候是基于2.2的,由于对底层代码不熟悉,根本没办法下手。于是联系原作者,他一个周末就搞出个3.x的版本,大家可以去膜拜下:
    地址:https://github.com/opentalking/gif-for-cocos2dx-3.x.git

    在这里真心要为大神的无私分享精神点个赞~

    使用方法:

    pull下来后,把gif文件夹导入到项目中来,然后就可以像使用Sprite那样使用gif~~~

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::string name = "g2.gif";
    name = FileUtils::getInstance() -> fullPathForFilename(name.c_str());
    GifBase *gif = InstantGif::create(name.c_str());
    gif->setPosition(Point(visibleSize.width * 0.5, visibleSize.height * 0.5));
    gif -> setScale(2);
    this->addChild(gif);
    gif2 = CacheGif::create(name.c_str());
    gif2->setPosition(Point(500,0));
    gif2->setScale(2);
    this->addChild(gif2);

    用到的类主要是InstantGif 和 CacheGif,两者的使用方法一样,前者是一边播放一边从数据中解析帧,后者是一次性解析完,并放到缓存中,这种方式耗时长,占用内存大(图片帧数太多的话可能会挂),但是相对第一种方式会流畅很多~

    Cocos引擎中文官网现面向广大Cocos引擎相关开发者征集优秀教程,欢迎给位童鞋踊跃投稿!来稿请发送至:support@cocos.org。

    来源网址:http://helkyle.tk/2014/12/11/cocos2dxgif/

      1 .cpp完整代码
      2 
      3 #include "HelloWorldScene.h"
      4 #include "Gif/GIFMovie.h"
      5 #include "Gif/CacheGif.h"
      6 #include "Gif/InstantGif.h"
      7 
      8 USING_NS_CC;
      9 
     10 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
     11 #define FILE_FORMAT ("/mnt/sdcard/g%d.gif") //On the Android platform, the resources are compressed in the asset directory. Therefore, the resources must be files on the sd card
     12 #else
     13 #define FILE_FORMAT ("g%d.gif")
     14 #endif
     15 
     16 CCScene* HelloWorld::scene()
     17 {
     18     // 'scene' is an autorelease object
     19     CCScene *scene = CCScene::create();
     20     
     21     // 'layer' is an autorelease object
     22     HelloWorld *layer = HelloWorld::create();
     23 
     24     // add layer as a child to scene
     25     scene->addChild(layer);
     26 
     27     // return the scene
     28     return scene;
     29 }
     30 
     31 // on "init" you need to initialize your instance
     32 bool HelloWorld::init()
     33 {
     34     //////////////////////////////
     35     // 1. super init first
     36     if ( !CCLayer::init() )
     37     {
     38         return false;
     39     }
     40       
     41     CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
     42     CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
     43 
     44     /////////////////////////////
     45     // 2. add a menu item with "X" image, which is clicked to quit the program
     46     //    you may modify it.
     47 
     48     // add a "close" icon to exit the progress. it's an autorelease object
     49     CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
     50         "CloseNormal.png",
     51         "CloseSelected.png",
     52         this,
     53         menu_selector(HelloWorld::menuCloseCallback));
     54 
     55     pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
     56         origin.y + pCloseItem->getContentSize().height/2));
     57 
     58     // create menu, it's an autorelease object
     59     CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
     60     pMenu->setPosition(CCPointZero);
     61     this->addChild(pMenu, 1);
     62 
     63     return true;
     64 }
     65 
     66 int count = 1;
     67 void HelloWorld::update(float delta)
     68 {
     69     count++ ;
     70     if(count > 240)
     71     {
     72         this->removeAllChildren();
     73     }
     74 }
     75 
     76 void HelloWorld::menuCloseCallback(CCObject* pSender)
     77 {
     78     count++;
     79     while(this->getChildByTag(1000))
     80     {
     81         this->removeChildByTag(1000);
     82     }
     83     CCLOG("%s","------after remove gif-----------");
     84     CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo();
     85     if(count % 2 != 0)
     86     {
     87         return ;
     88     }
     89     std::string name = CCString::createWithFormat(FILE_FORMAT,count/2)->getCString();
     90     name = CCFileUtils::sharedFileUtils()->fullPathForFilename(name.c_str());
     91     
     92     GifBase *gif = InstantGif::create(name.c_str());
     93     if(gif == NULL)
     94     {
     95         CCLOG("%s","create gif failed");
     96         return ;
     97     }
     98     gif->setAnchorPoint(ccp(0,0));
     99     this->addChild(gif);
    100     gif->setPosition(ccp(0,0));
    101     gif->setTag(1000);
    102 
    103 
    104     gif = CacheGif::create(name.c_str());
    105     gif->setAnchorPoint(ccp(0,0));
    106     this->addChild(gif);
    107     gif->setPosition(ccp(500,0));
    108     gif->setScale(2);
    109     gif->setTag(1000);
    110     CCLOG("%s","------after add gif-----------");
    111     CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo();
    112 
    113     return ;
    114 }

    在class类中还有Gif文件夹,里面有需要的类

  • 相关阅读:
    (转)CentOS 6.5下Redis安装详细步骤
    (转)FastDFS_v5.05安装配置
    Mybatis 动态获取字段值(不需要创建javabean)
    Apache+tomcat集群配置
    Get Started and Make Progress in Machine Learning
    NLTK 模块不完全介绍
    python __future__
    python __init__.py和__all__
    自然语言处理
    Python搜索路径
  • 原文地址:https://www.cnblogs.com/dudu580231/p/4830850.html
Copyright © 2020-2023  润新知