zoukankan      html  css  js  c++  java
  • cocos2d-x 精灵的创建和基本使用

            在cocos2d-x中。精灵能够说是一个最重要的组成元素,它代表游戏中一个最小的可见单位。同一时候也是CCNode一个最为灵活的子类,由于它能够通过装载一个平面纹理,从而具有丰富的表现力。

            在进一步说精灵之前。有限须要理解一下纹理的概念。简单直观地理解,事实上纹理就是我们通常在游戏中看到的图片,而这张图片通过精灵这个容器显示出来。

    专业一点来说,纹理是openGL中绘制到物体表面上的图案。在这里仅仅简介一下,不深入了解。

            精灵的创建方法比較灵活,大致能够分为下面3种方法:

            1、从文件里直接创建精灵。

            这样的方法非常easy,仅仅要知道文件所在的路径和名称,直接调用CCSprite的工厂方法就可以。如: CCSprite::spriteWithFile("文件完整名称"); 当中文件名称必须是完整路径,用cocos2d-x生成的项目中Resources文件夹为根文件夹。

        CCSprite * sprite= CCSprite::create(pszFilename);

        这样载入方式精灵会把图片的整个区域显示出来。另外也能够添加图片的显示区域这一參数。例如以下所看到的:

        CCSprite * sprite= CCSprite::create(pszFilename,CCRectMake(0, 0, 30, 30));

    注意这里的rect使用的是纹理坐标系,以左上角为原点。原点向右为x的正方向,原点向下为y的正方向。

    上面的代码表示显示出以图片左上角为原点的30*30像素范围的图片区域。

        对于常常被用到或者须要频繁载入移除的一些资源。假设每次都要从文件里载入,程序的的效率会变低,因此我们能够先把图片资源读到缓存中,再从缓存中载入。

        2、通过纹理去载入。

        CCTexture2D*pTexture = CCTextureCache::sharedTextureCache()->addImage(pszFilename);

    这个函数将一个图片增加缓存并返回一个CCTexture2D的指针。然后就能够

        CCSprite * sprite=CCSprite::spriteWithTexture(pTexture);

        同方法1一样也能够通过加入显示区域的參数。

        CCTextureCache是相当于CCTexture2D的容器,是内存池。当调用它的addImage函数加入图片时。会先依据图片名称去内存中查找是否已存在,是则直接取出返回。假设须要一次载入多张图片的时候,能够先把图片载入到CCTextureCache中。这样使用图片的时候速度就会非常快了。 

        这样的方法通经常使用于批处理。CCSpriteBatchNode用于批处理绘制精灵。主要是用来提高精灵的绘制效率的。须要绘制的精灵数量越多,效果越明显。由于cocos2d-x採用opengl es绘制图片的。opengl es绘制每一个精灵都会运行:open-draw-close流程。

    而CCSpriteBatchNode是把多个精灵放到一个纹理上,绘制的时候直接统一绘制该texture,不须要单独绘制子节点。这样opengl es绘制的时候变成了:open-draw()-draw()…-draw()-close()。节省了多次open-close的时间。CCSpriteBatchNode内部封装了一个CCTextureAtlas(纹理图集,它内部封装了一个CCTexture2D)和一个CCArray(用来存储CCSpriteBatchNode的子节点:单个精灵)。(摘自Alex zhou的博客)

        3、通过帧缓存中的一帧名称去载入。

        SpriteFrame是把一个大的图片划分掉。每个矩形区域就是一个SpriteFrame。事实上假设这个SpriteFrame在大图中的矩形区域已知的话,能够直接使用CCTexture2D的方式,使用CCRect參数。SpriteFrame给我们提供了一种快捷,简便的方式,就是将这个矩形区域信息保存到plist文件里,并通过一个名称作为索引。

    生成这样的大图也有非常多工具,Zwoptex是一个在线的免费工具。TexturePacker一个收费软件,只是免费版也能满足主要的须要。也能够给作者发邮件获取一个license。这两种工具能够生成一个.plist文件和一个图片文件。存放的时候讲这两个关联的文件放在同一个文件夹下。

    在须要使用的时候,我们能够将它载入到缓存中:

       CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("XX.plist");

       CCSpriteFrameCache它是管理CCSpriteFrame的内存池,跟CCTextureCache功能一样,只是跟CCTextureCache不同的是,假设内存池中不存在要查找的帧,它会提示找不到。而不会去本地载入图片。

           然后能够用两种方式载入

        CCSprite * sprite =CCSprite::spriteWithSpriteFrame(pCache->spriteFrameByName(szFrameName));

        CCSprite * sprite = CCSprite::spriteWithSpriteFrameName(szFrameName);

    看起来第一个函数比較麻烦,实际上,第二个函数调用的是第一个函数。值得说明的是,这里的szFrameName不须要完整路径,而是文件名称索引。

     

    精灵载入完了就改各种使用了。

    (接下来的内容摘自Wander的博客,在此表示感谢)

    1。锚点

    锚点就是全部旋转,移动,缩放的參考点。

    cocos2-x中默认的锚点是中心点。锚点用比例来表示范围为0-1,(0,0)点代表左下点,(1,1)代表右上点。设置的函数为setAnchorPoint(ccp(0.5, 0.5));

    2,旋转

    setRotation(angle) 当中angle为角度不是弧度。正数为顺时针旋转,负数为逆时针旋转。

    3。位置

    setPosition(ccp(xPos, yPos)) xPos和yPos为相对于父节点锚点的位置。

    4,缩放

    setScale(s);   // 总体缩放

    setScaleX(s); // 原图片坐标X轴缩放

    setScaleY(s); // 原图片坐标Y轴缩放

    s为比例。s = 1表示原尺寸。

    5,倾斜

    setSkewX(s); // 原图片坐标X轴倾斜

    setSkewY(s); // 原图片坐标Y轴倾斜

    X轴向右为正。Y轴向上为正。

    6,透明度

    setOpacity(s);

    s范围0-255,0全然透明,255全然不透明。

    7。可见

    setIsVisible(bVisible)

    bVisible为bool值true代表可见false代表不可见

    8,翻转

    setFlipX(bFlip);  // 水平翻转

    setFlipY(bFlip);  // 竖直翻转

  • 相关阅读:
    NSPredicate的用法、数组去重、比较...
    CocoaPods安装和使用教程
    UITableView学习笔记
    Linux dpkg 命令
    Linux rpm 软件包管理命令
    Linux chmod 文件权限命令
    Linux vi 命令
    分库分表背后那些事儿
    Spring Cloud Feign原理及性能
    linux "No space left on device" 磁盘空间解决办法
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5112710.html
Copyright © 2011-2022 走看看