精灵
1.Sprite精灵类
精灵在COCOS里是一个非常重要的概念,我的理解是精灵就是一个多用途的对象。可以作为按钮,作为背景,作为动画效果。主要是以图像的形式呈现出来的。
1.1 创建Sprite精灵
创建精灵对象的方法由很多中,主要就是create函数及其衍生。在我的代码里由很多关于精灵的创建,这里就不一一举例了。
这里放一个通过纹理对象创建Sprite对象的例子
auto tree1 = Sprite::create("tree1.png", Rect(604, 38, 302, 295));
tree1->setPosition(Vec2(origin.x + 300,
origin.y + visibleSize.height - 300));
this->addChild(tree1, 0);
Texture2D* cache = Director::getInstance()->getTextureCache()->addImage("tree1.png");
auto tree2 = Sprite::create();
tree2->setTexture(cache);
tree2->setTextureRect(Rect(73, 72, 182, 270));
tree2->setPosition(Vec2(origin.x + 300,
origin.y + visibleSize.height - 600));
this->addChild(tree2, 0);
2.精灵的性能优化
游戏是一种很耗费资源的引用,特别是在移动设备中,性能优化是非常重要的。而精灵的优化主要可以使用精灵表和缓存
2.1使用纹理图集
纹理图集也成为精灵表,它把许多小的精灵图片组合到一张大图片中。
这样,你可以将所有需要的精灵图片汇总到一张图片中,这样,你就只用读取一次文件,再从文件中截取就可以了。而且如果都用小图片,会非常浪费内存空间。
当然除了一张大图片,还要一张关于图片的属性列表文件,它是一种XML文件。
例子代码如下
auto mountain1 = Sprite::create("SpirteSheet.png", Rect(2, 391, 934, 388));
mountain1->setAnchorPoint(Vec2::ZERO);
mountain1->setPosition(Vec2(origin.x + 400,
origin.y + visibleSize.height - 300));
mountain1->setScale(0.5);
this->addChild(mountain1, 0);
Texture2D* cache_2 = Director::getInstance()->getTextureCache()->addImage("SpirteSheet.png");
auto hero1 = Sprite::create();
hero1->setTexture(cache_2);
hero1->setTextureRect(Rect(2, 1706, 391, 327));
hero1->setPosition(Vec2(origin.x + 600,
origin.y + visibleSize.height - 600));
this->addChild(hero1, 0);
2.2 使用精灵帧缓存
和上面的区别就是SpriteSheet.png后缀变成了plist。你可以把你需要用到的图片信息都存在plist中,这样就用直接从精灵帧中读取了。
例子代码
SpriteFrameCache *frameCache = SpriteFrameCache::getInstance();
frameCache->addSpriteFramesWithFile("SpirteSheet.plist");
auto mountain2 = Sprite::createWithSpriteFrameName("mountain1.png");
mountain2->setAnchorPoint(Vec2::ZERO);
mountain2->setPosition(Vec2(origin.x + 700,
origin.y + visibleSize.height - 300));
mountain2->setScale(0.5);
this->addChild(mountain2, 0);
SpriteFrame *heroSpriteFrame = frameCache->getSpriteFrameByName("hero1.png");
Sprite *hero2 = Sprite::createWithSpriteFrame(heroSpriteFrame);
hero2->setPosition(Vec2(origin.x + 700,
origin.y + visibleSize.height - 600));
this->addChild(hero2, 0);