cocos2d-x 精灵的创建和基本使用

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

        在进一步说精灵之前,有限需要理解一下纹理的概念。简单直观地理解,其实纹理就是我们通常在游戏中看到的图片,而这张图片通过精灵这个容器显示出来。专业一点来说,纹理是openGL中绘制到物体表面上的图案。在这里只简单介绍一下,不深入了解。

        精灵的创建方法比较灵活,大致可以分为以下3种方法:

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

        这种方法很简单,只要知道文件所在的路径和名称,直接调用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);  // 竖直翻转

你可能感兴趣的:(cocos2d-x 精灵的创建和基本使用)