精灵是cocos2dx里面最最最最常用的类。我们今天就来说说它。
精灵首先是一个2维图片,但我们可以改变其属性(包括旋转、位置、比例、颜色等),还可以给它制作动画。
你可以把精灵理解成游戏里的怪物,主人公,或者所有能动的东西。
创建精灵的几种方法
方法一:直接用create加图片创建。
这个之前我们已经接触过很多次了。
auto sprite = Sprite::create("HelloWorld.png");
不过,create还有更多的功能,比如,我只想显示这个精灵的眼睛(截取一部分图像),那就在create函数里加Rect()参数就可以了:
auto sprite = Sprite::create("HelloWorld.png", Rect(30, 120, 130, 50));
Rect(x, y, width, height)的4个参数:
x, y:是相对于图片的左上角的坐标,指定(0, 0)就是图片的左上角。
width, height:是宽度高度。那么这个单位是多少?我上面的例子用的窗口大小是480, 320,如果你换成1024, 768,再用上面的4个参数试试,是这个结果:画乱了。
为什么?原因是在不同分辨率的情况下,图片的大小也不一样。
我们做个试验:我们不指定Rect,分别在480,320和1024,768分辨率下,打印出图片的大小。
auto sprite = Sprite::create("HelloWorld.png");
auto size = sprite->getContentSize();
log("sprite size: width = %f, height = %f", size.width, size.height);
结果是:
480,320:sprite size: width = 195.000000, height = 270.000000
1024,768:sprite size: width = 91.406242, height = 126.562492
可以得出,分辨率变大,图片在程序中的大小会变小。Rect()四个参数的值都会受到这个的影响。
那么,解决方法的话,要么计算分标率的比例,要么干脆不用Rect(),直接截取图片。
看似创建精灵很简单,里面的逻辑其实挺复杂。
方法二:用纹理(Texture2D)创建
效果和用create时一样的。
函数定义:
Sprite* Sprite::createWithTexture(Texture2D *texture);
Sprite* Sprite::createWithTexture(Texture2D *texture, const Rect& rect, bool rotated);
调用的时候,可以直接定义Texture2D的实例:
Image* img = new Image();
img->initWithImageFile("HelloWorld.png");
Texture2D* texture = new Texture2D();
texture->initWithImage(img);
auto sprite = Sprite::createWithTexture(texture);
// or
// auto sprite = Sprite::createWithTexture(texture, Rect(30, 120, 130, 50));
也可以,通过getTextureCache()的addImage方法:
auto sprite = Sprite::createWithTexture(Director::getInstance()->getTextureCache()->addImage("HelloWorld.png"));
那么,create和createWithTexture有什么区别?其实,你看一下源码就会发现,create里面就是用Texture2D实现的。为了用户便于使用和理解,所以create把Texture2D又包了一层。
那它俩什么时候使用?图片过大,不常用的,create直接创建;游戏场景内频繁使用的,纹理创建。
方法三:帧缓存(SpriteFrameCache)
这个适用于,帧动画、图集管理等。游戏中的精灵一般数量会很多,我们一个一个加未免有点二乎,这时候就会用到帧缓存。
由于内容比较多,下一篇博客再讲解。