cocos2d-x中的精灵

精灵类Sprite是一张二维图片对象,可以使用一张图片或者一张图片的一块矩形部分来定义。精灵对象可以移动,旋转,缩放,执行动画,并接受其他转换,是一个游戏中主要操作的对象,就Sprite的一些应用做一个总结:
首先对于Sprite相关的类做一些了解
Texture2D
Texture2D是OpenGL的概念。在OpenGL中称图片为贴图,在Cocos2d-x中Texture2D就是图片对象的意思,可以通过Texture2D对象来创建Sprite精灵,可以把它看成一个纹理,它是cocos2d-x渲染图形的重要参数

CCTexture2D* cache = CCTextureCache::sharedTextureCache()->addImage("hero.png"); 
CCSprite* sprite = CCSprite::spriteWithTexture(cache);

Sprite:
这个就是精灵类,是CCNode的子类,它的内部封装了CCTexture2D(纹理)

CCSprite* sprite = CCSprite::spriteWithFile("hero.png"); 

CCTextureCache
它相当于CCTexture2D的容器,是内存池,用来缓存CCTexture2D对象的,它内部有一个字典,CCMutableDictionary m_pTextures,key为图片的名称,值是CCTexture2D。当调用它的addImage函数添加图片时,会先根据图片名称去内存中查找是否已存在,是则直接取出返回
如果需要一次加载多张图片的时候,可以先把图片加载到CCTextureCache中,这样使用图片的时候速度就会很快了

SpriteFrame
SpriteFrame也就是精灵帧的概念。精灵帧这个是相对于动画而产生的。一个精灵是一张二维图片,如果一个精灵具有动画效果。我们使用程序进行控制,使精灵在不同的二维图片之间进行切换,这样就形成了动画效果
SpriteFrameCache
精灵帧缓存类SpriteFrameCache用来存储精灵帧,提前缓存起来有助于提高程序的效率。SpriteFrameCache是一个单例模式实现的,它不属于某个精灵,而是所有精灵共享使用的

SpriteBatchNode
它是批处理绘制精灵,主要是用来提高精灵的绘制效率的,需要绘制的精灵数量越多,效果越明显,SpriteBatchNode类就可以批处理精灵

SpriteBatchNode* batchNode = SpriteBatchNode::create("..\\Resources\\CloseNormal.png", 1000);
batchNode->setPosition(CCPointZero);
this->addChild(batchNode);

for (int i = 0; i < 1000; ++i)
{
    int x = rand() % 960;
    int y = rand() % 640;
    Sprite* testIcon = Sprite::createWithTexture(batchNode->getTexture());
    testIcon->setPosition(ccp(x, y));
    batchNode->addChild(testIcon);
}

设置锚点:
锚点就是所有旋转,移动,缩放的参考点。cocos2-x中默认的锚点是中心点。锚点用比例来表示范围为0-1,(0,0)点代表左下点,(1,1)代表右上点。设置的函数为setAnchorPoint(ccp(0.5, 0.5));

旋转
setRotation(angle) 其中angle为角度不是弧度。正数为顺时针旋转,负数为逆时针旋转
位置
setPosition(ccp(xPos, yPos)) xPos和yPos为相对于父节点锚点的位置。

缩放
setScale(s); // 整体缩放
setScaleX(s); // 原图片坐标X轴缩放
setScaleY(s); // 原图片坐标Y轴缩放
s为比例,s = 1表示原尺寸。

可见
setIsVisible(bVisible)
bVisible为bool值true代表可见false代表不可见

bool GameScene::init()
{
    if(!Layer::init())      //初始化父类
        return false;

    //获取屏幕大小
    Size visibleSize = Director::getInstance()->getVisibleSize();

    //创建精灵的六种方法
    //方法一
    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);


    //设置是否可见
    sprite4->setVisible(true);

    //设置颜色
    sprite1->setColor(Color3B(0, 0, 255));

    //设置透明度
    sprite2->setOpacity(100);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值