COCOS学习--精灵(5)

精灵

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);

效果图

COCOS学习--精灵(5)

上一篇:as3 绘制Sprite背景色


下一篇:Unity爬坑记录-Sprite 相关功能Editor、打包器等无法使用