热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cocos2d-x菜鸟学习笔记九(引用plist快速生成动画精灵)

前面说过,在绘制精灵时最好使用CCSpriteBatchNode和CCSpriteFrameCache,前面只说过可以通过图片合并后使用.plist文件在程序内部进行引用,这回就具体说说这些文件

前面说过,在绘制精灵时最好使用CCSpriteBatchNode和CCSpriteFrameCache,前面只说过可以通过图片合并后使用.plist文件在程序内部进行引用,这回就具体说说这些文件是如何生成并使用的。这样的纹理图片打包工具应该是不只一个的,我常用的就是Texture packerGUI,好东西总会有盗版,用之……大笑

要说为什么要打包使用纹理图片的话,那是因为可以节省载入次数,这样加载效率就高了,然后还有一点就是OPenGL ES1.0需要纹理图片以2的n次方的尺寸载入,非常麻烦,所以使用这样的工具是非常有必要的。

这个工具可以根据不同的游戏引擎使用最适合的打包方式比如:苹果专用的图片格式PVR。简单的操作就一句话:点击add Sprites按钮添加一堆精灵图片,设置dataFile导出到的目录、图片格式及imageFormat质量,最后publish即可……具体操作就直接看别人的教程吧:

原帖:http://blog.csdn.net/vagrxie/article/details/6715416

图片没挂的帖:http://www.ituring.com.cn/article/details/52

导出后会看到一张整合的图片及对应的pList,至于pList里都蒇了些什么,自己用词本打开就可以发现里面的秘密了。现在就可以在项目中引用资源了,这里使用修改后的官方原例中的代码生成一组带动画的精灵吧:

class HelloWorld : public cocos2d::CCLayer
{
public:
    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();  

    // there's no 'id' in cpp, so we recommand to return the exactly class pointer
    static cocos2d::CCScene* scene();
    
    // a selector callback
    void menuCloseCallback(CCObject* pSender);

	void addNewSprite(int id);
        //用来引用精灵帧的文件名文本
        char szName[100];
	cocos2d::CCSize size;
	cocos2d::CCSpriteBatchNode* BatchNode1;

    // implement the "static node()" method manually
    CREATE_FUNC(HelloWorld);
};

bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        //////////////////////////////////////////////////////////////////////////
        // super init first
        //////////////////////////////////////////////////////////////////////////

        CC_BREAK_IF(! CCLayer::init());

        //////////////////////////////////////////////////////////////////////////
        // add your codes below...
        //////////////////////////////////////////////////////////////////////////

        // 1. Add a menu item with "X" image, which is clicked to quit the program.

        // Create a "close" menu item with close icon, it's an auto release object.
        CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
            "CloseNormal.png",
            "CloseSelected.png",
            this,
            menu_selector(HelloWorld::menuCloseCallback));
        CC_BREAK_IF(! pCloseItem);

        // Place the menu item bottom-right conner.
        pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));

        // Create a menu with the "close" menu item, it's an auto release object.
        CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
        pMenu->setPosition(CCPointZero);
        CC_BREAK_IF(! pMenu);

        // Add the menu to HelloWorld layer as a child layer.
        this->addChild(pMenu, 1);

        size = CCDirector::sharedDirector()->getWinSize();

    //预加载纹理
    CCTextureCache::sharedTextureCache()->addImage("grossini.png");	
	//创建绘制批处理节点
	BatchNode1 = CCSpriteBatchNode::create("grossini.png", 50);
    addChild(BatchNode1, 0, 1);
    //这里的精灵帧缓存添加第二个参数实际上是使用了预加载的纹理缓存中的图片
	//也就是说第二个参数可以说是 CCTexture2D而不是单纯的textureFileName
	CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("grossini.plist","grossini.png");

	    setTouchEnabled( true );
        //初始化随机数
	    srand((int)time(0));
    //这里循环生成了30个精灵
    for(int i=0;i<30;i++){	
        addNewSprite(i+1);
	}
        bRet = true;
    } while (0);

    return bRet;
}

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    // "close" menu item clicked
    CCDirector::sharedDirector()->end();
}

void HelloWorld::addNewSprite(int id)
{
    CCPoint p = ccp( CCRANDOM_0_1() * size.width, CCRANDOM_0_1() * size.height);

    int idx = CCRANDOM_0_1() * 1400 / 100;
    int x = (idx%5) * 85;
    int y = (idx/5) * 121;
	//随机取一张纹理图
    sprintf(szName, "grossini_dance_%02d.png", (rand()%14)+1);
    //从精灵帧缓存中取纹理创建精灵,然后加入绘制节点
	//由于精灵帧纹理图与batchNode的纹理图是一致的,所以不会报错,而且会加快取纹理和绘制的速度
    CCSprite* sprite = CCSprite::createWithSpriteFrameName(szName);
    BatchNode1->addChild(sprite,1,id);
    
    sprite->setPosition( p );
    //让精灵随机运行一组动画
    CCActionInterval* action;
    float random = CCRANDOM_0_1();
    
    if( random <0.20 )
        action = CCScaleBy::create(3, 2);
    else if(random <0.40)
        action = CCRotateBy::create(3, 360);
    else if( random <0.60)
        action = CCBlink::create(1, 3);
    else if( random <0.8 )
        action = CCTintBy::create(2, 0, -255, -255);
    else 
        action = CCFadeOut::create(2);
	//设置动画么向播放
    CCActionInterval* action_back = action->reverse();
    CCActionInterval* seq = CCSequence::create(action, action_back, NULL);
    //设置永久循环
    sprite->runAction( CCRepeatForever::create(seq) );
}

以上就是利用TexturePakagerGUI打包生成的plist加速生成精灵的示例。

源代码下载:http://download.csdn.net/detail/cyistudio/5462641


推荐阅读
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 在Java基础中,私有静态内部类是一种常见的设计模式,主要用于防止外部类的直接调用或实例化。这种内部类仅服务于其所属的外部类,确保了代码的封装性和安全性。通过分析JDK源码,我们可以发现许多常用类中都包含了私有静态内部类,这些内部类虽然功能强大,但其复杂性往往让人感到困惑。本文将深入探讨私有静态内部类的作用、实现方式及其在实际开发中的应用,帮助读者更好地理解和使用这一重要的编程技巧。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
author-avatar
zhanwang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有