Sprite
Sprite是cocos2d-x中用来显示图片的主要对象,它的创建有四种方式,下面分别介绍:
直接用图片文件创建
//直接用单张图片创建精灵
//第一种方式:创建完精灵再设置贴图
//auto sprite = Sprite::create();
//sprite->setTexture("girl.png");
//第二种方式:直接用贴图文件名创建精灵
//auto sprite = Sprite::create("girl.png");
//第三种方式:指定贴图的一部分创建精灵
//auto sprite = Sprite::create("girl.png", Rect(0, 0, 100, 100));
//第四种方式:使用PolygonInfo来创建精灵
auto sprite = Sprite::create(AutoPolygon::generatePolygon("girl.png",Rect(0,0,100,100)));
log("%f %f",sprite->getContentSize().width,sprite->getContentSize().height);
直接用Sprite::create()方法来创建精灵,它也有4个重载函数,第一个是无参函数,创建完精灵后再给它赋贴图,第二个是创建的时候直接给一个贴图文件,第三个是创建是赋贴图文件和裁剪矩形,第四个是使用PolygonInfo对象来创建。
这里有两个要注意的地方,第一个是创建时直接传文件和创建完再赋贴图文件这两种方式哪种更优?从程序上来讲,我们写文件名的时候很容易写错,如果是创建时直接传文件的话,文件名写错我们会得到一个空对象的精灵,之后对这个精灵的任何操作都会导致程序崩溃。而创建完之后再设置贴图文件这种方式我们能得到一个合法的精灵,只不过设置贴图的时候给了一个空的贴图而已,这种方式对精灵的操作不会使程序崩溃,但我们在屏幕上什么也看不到。以我肤浅的眼光来看,初学者应使用第一种方式,尽量让程序崩溃,这样我们可以根据崩溃的地方迅速找到错误,而不是莫名其妙的看到一个黑乎乎的屏幕,而对于实际项目开发者来说,当然要保证程序尽量不崩溃了。
第二个注意的地方是给Sprite指定Rect裁剪区域的时候,我们给的区域有可能比图片大,这时候Sprite的贴图就变得比源图片大了,多出的地方填上了空白的像素,所以我们看不出区别。我在测试的时候就因为不小心给了一个比图片大的裁剪区域,结果看到了一张完整的图片,还以为这个裁剪不起作用,后面仔细看才发现,精灵的位置已经不居中了,输出精灵的尺寸,原来精灵真的变大了。另外,Rect的区域是从图片左上角开始计算的。
使用精灵帧创建精灵
//使用精灵帧SpriteFrame创建精灵
//第一种方式:直接创建精灵帧
//auto frame = SpriteFrame::create("girl.png",Rect(0,0,150,200));
//auto sprite = Sprite::createWithSpriteFrame(frame);
//第二种方式:从精灵帧缓冲区中取精灵帧
//以这种方式创建精灵要先将图片加到精灵缓冲区中
//SpriteFrameCache::getInstance()->addSpriteFrame(frame,"girl");
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("start.plist");
auto sprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("start1.png"));
这种方式的优点是我们可以将图片事先缓冲到精灵缓冲区中,再我们操作帧动画的时候随时可以拿到精灵图片。
使用精灵帧名称创建精灵
//使用精灵帧名称创建精灵
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("start.plist");
auto sprite = Sprite::createWithSpriteFrameName("start1.png");
这种方式其实和第二种方式很相似,只不过我们不是通过具体得到的精灵帧对象来创建精灵,而是通过精灵帧在精灵帧缓冲中的索引(名称)来获得精灵帧。不是于第二种方式,这种方式只能使用在精灵帧缓冲中存在的精灵帧,而第二种方式可以使用自己创建的精灵帧来创建精灵。
使用贴图Texture创建精灵
//使用贴图创建精灵
TextureCache::getInstance()->addImage("girl.png");
auto texture=TextureCache::getInstance()->getTextureForKey("girl.png");
auto sprite = Sprite::createWithTexture(texture,Rect(0,0,150,200),true);
这种方式也比较简单,直接传一个Texture2D对象进去即可。Texture2D贴图对象的创建也有好几种方式,这个我们在下节再讲。