创建精灵的几种方式
//创建精灵的五种方法//方法一:直接创建精灵//适合于要显示的是这张图片的全部区域CCSprite * sprite = CCSprite::create(“Icon.png”);//上面那句话也可以根据需要这样来写:CCString* fileName = CCString::createWithFormat(“Icon_%d.jpg”, flag);CCSprite* sprite = CCSprite::create(fileName->getCString());sprite->setPosition(ccp(100, 100));this->addChild(sprite);// 方法二:参数 图片名称 矩形区域//适合于需要显示此图片的部分区域CCSprite * sprite = CCSprite::create(“Icon.png”,CCRectMake(0, 0, 30, 30));sprite->setPosition(ccp(100, 100));this->addChild(sprite);//方法三: 利用帧缓存中的一帧的名称声称一个对象// 适合于plist打包好的文件CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(“test_icon.plist”);CCSprite * sprite = CCSprite::createWithSpriteFrameName(“Icon.png”);sprite->setPosition(ccp(100, 100));this->addChild(sprite);//方法四: 利用另外一帧生成一个精灵对象//适合于做帧动画使用CCSpriteFrame * frame = CCSpriteFrame::create(“Icon.png”, CCRectMake(0, 0, 40, 30));CCSprite * sprite = CCSprite::createWithSpriteFrame(frame);sprite->setPosition(ccp(310, 150));addChild(sprite);//方法五:利用纹理//适合于需要频繁使用的图片CCSpriteBatchNode* spriteTexture = CCSpriteBatchNode::create(“iocn.png”);spriteTexture->setPosition(CCPointZero);addChild(spriteTexture);CCSprite* sprite = CCSprite::createWithTexture(spriteTexture->getTexture());sprite->setPosition(ccp(visiblesize.width/2, 100));spriteTexture->addChild(sprite, 2);
//创建精灵的六种方法 //方法一 auto sprite1 = Sprite::create("Flag_1.png"); sprite1->setPosition(Vec2(visibleSize.width*0.2, visibleSize.height*0.7)); this->addChild(sprite1); //方法二 auto sprite2 = Sprite::create("Flag_1.png", Rect(0, 0, 48, 36)); sprite2->setPosition(Vec2(visibleSize.width*0.4, visibleSize.height*0.7)); this->addChild(sprite2); //创建2D纹理 auto texture1 = Director::getInstance()->getTextureCache()->addImage("Flag_1.png"); //auto texture1 = TextureCache::sharedTextureCache()->addImage("Flag_1.png"); //cocos2d-x 3.0已移除该方法 //方法三 auto sprite3 = Sprite::createWithTexture(texture1); sprite3->setPosition(Vec2(visibleSize.width*0.6, visibleSize.height*0.7)); this->addChild(sprite3); //方法四 auto sprite4 = Sprite::createWithTexture(texture1, Rect(0, 0, 48, 36)); sprite4->setPosition(Vec2(visibleSize.width*0.8, visibleSize.height*0.7)); this->addChild(sprite4); //创建精灵帧 auto frame = SpriteFrame::create("Flag_1.png", Rect(0, 0, 48, 36)); //方法五 auto sprite5 = Sprite::createWithSpriteFrame(frame); sprite5->setPosition(Vec2(visibleSize.width*0.3, visibleSize.height*0.3)); this->addChild(sprite5); // //方法六// SpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("img.plist");// // auto sprite6 = Sprite::createWithSpriteFrameName("HelloWorld.png");// sprite6->setPosition(Vec2(visibleSize.width*0.7, visibleSize.height*0.3));// this->addChild(sprite6); //**************************// //精灵常用处理操作 //设置缩放 sprite1->setScale(1.5f, 1.5f);// sprite1->setScaleX(1.5f);// sprite1->setScaleY(1.5f); //设置旋转,大于零顺时针旋转 sprite2->setRotation(60.0f);// sprite2->setRotationX(60.0f);// sprite2->setRotationY(60.0f); //设置倾斜 sprite3->setSkewX(30.0f);// sprite3->setSkewY(30.0f); //设置是否可见 sprite4->setVisible(true); //设置颜色 sprite1->setColor(Color3B(0, 0, 255)); //设置透明度 sprite2->setOpacity(100);
精灵池
当我们使用下面代码创建9000个精灵对象时,帧率会大幅度降低
for(int i=1;i<=9000;i++){CCSprite* sprite = CCSprite::create(“sprite.png”);this->addChild(sprite,3);sprite->setPosition(ccp(CCRANDOM_0_1()*480,CCRANDOM_0_1()*320));}
当有很多怪物或者国战场面或者很多子弹时,我们需要把纹理在同一张图片的精灵纳入精灵池
CCSpriteBatchNode* spriteBath = CCSpriteBatchNode::create(“sprite.png”);for(int i=1;i<=9000;i++){CCSprite* sprite = CCSprite::createWithTexture(spriteBath->getTexture()); //根据纹理创建精灵sprite->setPosition(ccp(CCRANDOM_0_1()*480,CCRANDOM_0_1()*320));spriteBath->addChild(sprite);}this->addChild(spriteBath,3);
我们可以看到渲染次数降低了8999次,并且帧率大幅度提高