第五节:精灵的使用介绍

CCSprite是cocos2d中使用最多的类了。一般使用一张图片来创建一个精灵,图片会被加载到内存,会转换为纹理图CCTexture,从而在屏幕上显示出来。

图片介绍:

用于创建精灵,使用的一些图片。有的是一个单独的图,有是一张大图,上面有很多帧,如下图:
这是一张图,但上面可以有很多帧图片,这样使用是为了可以把图一下子加载进内存,从而比一帧一帧地加载,要快很多。
这张图片,可以转换为一个plist的配置文件,上面标明了每一帧的名字,和位置坐标 。
关于这方面,可以自行百度一下。


精灵的创建:

利用图片创建一个精灵:

    //利用文件名创建一个精灵
    auto mole = Sprite::create("btn_icon.png");
    //设置精灵的位置
    mole->setPosition(size.width/2,size.height/2);
    //把精灵添加的当前场景
    this->addChild(mole);

利用图片和矩形创建一个精灵:

    //创建一个矩形
    auto rect = Rect(2, 2, 51, 109);
    //利用矩形和一个图片创建一个精灵,就是在一张大图中,抠出矩形的那一块,创建一个精灵
    auto mole = Sprite::create("grossini-aliases.png", rect);
    //设置精灵的位置
    mole->setPosition(size.width/2,size.height/2);
    //把精灵添加到当前场景
    this->addChild(mole);

利用texture创建一个精灵:

    //先创建一个texture,利用一图片
    auto texture = Director::getInstance()->getTextureCache()->addImage("btn_icon.png");
    //然后,再利用texture创建一个精灵
    auto mole = Sprite::createWithTexture(texture);
    //设置精灵的位置
    mole->setPosition(size.width/2,size.height/2);
    //把精灵添加到当前场景
    this->addChild(mole);

利用texture和矩形创建一个精灵:

    //先创建一个texture,利用一图片
    auto texture = Director::getInstance()->getTextureCache()->addImage("grossini-aliases.png");
    //创建一个矩形
    auto rect = Rect(2, 2, 51, 109);
    //然后,再利用texture创建一个精灵
    auto mole = Sprite::createWithTexture(texture,rect);
    //设置精灵的位置
    mole->setPosition(size.width/2,size.height/2);
    //把精灵添加到当前场景
    this->addChild(mole);

SpriteBatchNode的使用:

在游戏开发中,当屏幕上的精灵太多的时候,程序性能会急剧下降,这是因为每当我们添加一个精灵的时候,GPU就要重新渲染一次,这样性能很低。
因此当有多个精灵出现的时候,如雷电游戏中的子弹,可以使用SpriteBatchNode批量加载,从而提高程序性能。
下面,我们实现一个,一次加载50个精灵,但是,在屏幕上,我们点击一次就在点击的位置出现一个精灵:
void SpriteScene::initBatch()
{
    //创建一个batchNode节点,因为要在其它方法中使用,所以在头文件中声明为了全局变量
    //第一个参数是文件名,第二个参数表示一次性加载多少个
    batch = SpriteBatchNode::create("btn_icon.png",50);
    //把batch添加到当前场景
    this->addChild(batch);
}

void SpriteScene::addMole(Point p)
{
    //根据纹理来创建一个精灵,而这个纹理,是从batch中得到的
    mole = Sprite::createWithTexture(batch->getTexture());
    //设置位置
    mole->setPosition(p);
    //把精灵添加到当前场景
    this->addChild(mole);
}
bool SpriteScene::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event)
{
    //根据触摸得到当前触摸的点
    Point p = touch->getLocationInView();
    //调用了添加精灵的方法,但这里,需要转换一下坐标
    addMole(Director::getInstance()->convertToGL(p));
    return false;
}
//这个方法要在初使化场景的时候调用。还有中间使用的size,是已经在全局声明并提前初使化了的。
void SpriteScene::registerListener()
{
    //先初使化一下batch
    initBatch();
    //创建一个listener
    auto l = EventListenerTouchOneByOne::create();
    //设置listener的回调方法
    l->onTouchBegan = CC_CALLBACK_2(SpriteScene::onTouchBegan, this);
    //注册我们创建的listener到当前节点,用于监听事件
    _eventDispatcher->addEventListenerWithSceneGraphPriority(l, this);
}

通过精灵帧SpriteFrame创建精灵:

游戏中通常使用工具,将多张图片放在一起来加载,这样可以提高性能。
可以根据单个小图片在大图片中的矩形框来显示这张小图片。
精灵帧SpriteFrame就是用来封装这张小图片的。

    //创建一个矩形
    auto rect = Rect(2, 2, 51, 109);
    //创建一个精灵帧,第一个参数是文件名,第二个参数是个矩形
    auto frame = SpriteFrame::create("grossini-aliases.png", rect);
    //根据帧创建一个精灵
    auto mole = Sprite::createWithSpriteFrame(frame);
    //设置精灵的位置
    mole->setPosition(size.width/2,size.height/2);
    //把精灵添加到当前场景
    this->addChild(mole);

使用Testure来的创建精灵帧,进而创建精灵:

    //创建一个矩形
    auto rect = Rect(2, 2, 51, 109);
    //先创建一个texture,利用一图片
    auto texture = Director::getInstance()->getTextureCache()->addImage("grossini-aliases.png");
    //创建一个精灵帧,通过texture,和一个矩形
    auto frame = SpriteFrame::createWithTexture(texture, rect);
    //根据帧创建一个精灵
    auto mole = Sprite::createWithSpriteFrame(frame);
    //设置精灵的位置
    mole->setPosition(size.width/2,100);
    //把精灵添加到当前场景
    this->addChild(mole);

SpriteFrameCache介绍:

SpriteFrameCache是精灵帧的缓存类,提供了一些管理精灵帧Sprite的方法。
SpriteFrameCache是单例类,实例化方法为:
static SpriteFrameCache* getInstance(void);
其它的一些重要方法:
static void purgeSharedSpriteFrameCache(void);    清除缓存
void addSpriteFramesWithFile(const char *pszPlist); 从Plist文件中添加多个CCSpriteFrame
void addSpriteFramesWithFile(const char* plist,const char* textureFileName); 使用plist和纹理文件创建多个精灵帧(新增纹理使用时,该纹理和plist文件关联在一起)
void addSpriteFramesWithFile(const char *pszPlist,CCTexture2D *pobTexture); 使用pllist和纹理创建多个精灵(新增纹理使用时,该纹理和plist文件关联在一起)
void addSpriteFrame(CCSprite *pobFrame,const char *pszframeName); 添加单帧精灵,并为精灵帧指定名称
void removeSpriteFrames(void);删除精灵
void removeUnusedSpriteFrames(void); 删除未使用的精灵帧
void removeSpriteFramesFromFile(const char* plist);根据plist删除精灵帧

    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("grossini-aliases.plist");
    auto frame =SpriteFrameCache::getInstance()->getSpriteFrameByName("grossini_dance_02.png");
    //根据帧创建一个精灵
    auto mole = Sprite::createWithSpriteFrame(frame);
    //设置精灵的位置
    mole->setPosition(size.width/2,100);
    //把精灵添加到当前场景
    this->addChild(mole);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值