第六章精灵

Cocos2d-x学习笔记


Sprite精灵类

Sprite是Node的子类,Sprite直接继承于Node类。

创建Sprite精灵对象

创建精灵对象有很多方式,其中常用的函数如下:

  • static Sprite * create ():创建一个精灵对象,纹理等属性需要在创建之后设置。
  • static Sprite * create ( const std::string & filename ):指定图片创建精灵。
  • static Sprite * create ( const std::string & filename, const Rect & rect ):指定图片和裁剪区域来创建精灵。
  • static Sprite * creataWithTexture ( Texture2D * texture ):指定纹理创建精灵。
  • static Sprite * createWithTexture ( Textrue2D * texture, const Rect & rect, bool rotated = false ):指定纹理和裁剪的矩形区域来创建精灵,第三个参数是否旋转纹理,默认不旋转。
  • static Sprite * createWithSpriteFrame ( SpriteFrame * pSpriteFrame ):通过一个精灵帧对象创建另一个精灵对象。
  • static Sprite * createWithSpriteFrameName ( const std::stirng & spriteFrameName ):通过指定帧缓存中精灵帧名创建精灵对象。

实例

HelloWorld.h文件

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

class HelloWorld : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();

    virtual bool init();

    // a selector callback


    // implement the "static create()" method manually
    CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__

HelloWorld.cpp文件

#include "HelloWorldScene.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();

    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }

    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    /
    // 2. add you code
    auto background = Sprite::create("background.png");
    background->setAnchorPoint(Vec2::ZERO);//背景设置锚点
    this->addChild(background, 0);//第二个参数表示Z轴上的顺序

    auto tree1 = Sprite::create("tree1.png", Rect(604, 38, 302, 295));//左上角点坐标+(宽,高) 注:UI坐标系
    tree1->setPosition(Vec2(200, 230));//注意这里是GL坐标系
    this->addChild(tree1, 0);

    //通过纹理缓存TextureCache创建纹理Texture2D对象,通过Director的getTextureCache()函数可以获得TextureCache实例,TextureCache的addImage()函数可以创建Texture2D对象。
    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(500, 200));
    this->addChild(tree2, 0);

    return true;
}

精灵的性能优化

游戏是一种很耗费资源的应用,特别是在移动设备中。精灵的性能优化可以使用精灵表缓存

使用纹理图集

纹理图集(Texture Atlas)也称为精灵表(Sprite Sheet),它是把许多晓得精灵图片组合成一张大图里面,其优点如下所述:

  • 减少文件读取次数,读取一张图片比读取一堆小文件要快。
  • 减少OpenGl ES调用并且加速渲染。
  • 减少内存消耗。
  • Cocos2d-x全面支持Zwoptex和TexturePacker,所以创建和使用纹理图集是很容易的。

使用精灵帧缓存

精灵帧缓存是缓存的一种,缓存有如下几种:

  • 纹理缓存(TextureCache):使用纹理缓存可以创建纹理对象。
  • 精灵帧缓存(SpriteFrameCache):能够从精灵表中创建精灵帧缓存,然后再从精灵帧缓存中获取精灵对象,反复使用精灵对象,使用精灵帧缓存可以节省内存消耗。
  • 动画缓存(AnimationCache):动画缓存主要用于精灵动画,精灵动画中的每一帧是从动画缓存中获取得到的。

精灵帧缓存主要介绍精灵帧缓存(SpriteFrameCache),要使用精灵帧缓存涉及到类有:SpriteFrameSpriteFrameCache
SpriteFrameCache 使用实例:

SpriteFrameCache::getInstance()->addSpriteFramesWithFile("SpriteSheet.plist");
auto mountain1 = Sprite::createWithSpriteFrameName("mountain1.png");

移除精灵帧缓存

  • void removeSpriteFrameByName( const std::string & name ):指定具体的精灵帧名移除。
  • void removeSpriteFrames():指定移除精灵缓存。
  • void removeSpriteFramesFormFile(const std::stirng & plist):指定具体的坐标文件移除精灵帧。
  • void removeUnusedSpriteFrames():移除没有使用的精灵帧。

实例

HelloWorld.h文件

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

class HelloWorld : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();

    virtual bool init();

    // a selector callback
    virtual void onExit();

    // implement the "static create()" method manually
    CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__

HelloWorld.cpp文件

#include "HelloWorldScene.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();

    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }

    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    /
    auto background = Sprite::create("background.png");
    background->setAnchorPoint(Vec2::ZERO);
    this->addChild(background, 0);

    SpriteFrameCache * frameCache = SpriteFrameCache::getInstance();
    frameCache->addSpriteFramesWithFile("SpirteSheet.plist");

    auto mountain1 = Sprite::createWithSpriteFrameName("mountain1.png");
    mountain1->setAnchorPoint(Vec2::ZERO);
    mountain1->setPosition(Vec2(-200, 80));
    this->addChild(mountain1, 0);

    SpriteFrame * heroSpriteFrame = frameCache->getSpriteFrameByName("hero1.png");
    Sprite *hero1 = Sprite::createWithSpriteFrame(heroSpriteFrame);
    hero1->setPosition(Vec2(800, 200));
    this->addChild(hero1, 0);

    return true;
}

void HelloWorld::onExit()
{
    Layer::onExit();
    SpriteFrameCache::getInstance()->removeSpriteFrames();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值