【3.x】

(1)去掉“CC”

【v3.3】

我们在 ui模块 下实现了一个新的Scale9Sprite类。它的内部实现比之前的Scale9Sprite更为简洁,功能也更为强大。

重新实现这个类的主要的原因是:Scale9Sprite在UI模块被大量使用。

现在UI模块不再依赖于extension模块。 通过采用全新的 ui::Scale9Sprite ,很多部件类内部的代码更加简洁,优雅。


什么是CCScale9Sprite呢?CCScale9Sprite对象,是一种CCSprite对象的变形,它的用法和CCSprite类似,不同点是:CCScale9Sprite对象有个特性就是缩放贴图时可以尽量不失帧。如下图所示,用普通的CCSprite拉伸后四个角模糊失真了,而是用CCScale9Sprite进行拉伸后,依旧很清晰。

1、原理

CCScale9Sprite的实现非常巧妙,是通过1个CCSpriteBatchNode和9个CCSprite来实现的,原理很简单,通过将原纹理资源切割成9部分(PS: 这也是叫九宫图的原因),根据想要的尺寸,完成以下的三个步骤:

(1)保持4个角部分不变形

(2)单向拉伸4条边(即在4个角两两之间的边,比如上边,只做横向拉伸)

(3)双向拉伸中间部分(即九宫图的中间部分,横向,纵向同时拉伸,PS:拉伸比例不一定相同)

CCSpriteBatchNode的资源为整个的纹理,9个CCSprite对应于纹理的9个部分(根据纹理不同,9部分所占比例会有所不同),根据想要的尺寸,将9部分拼装在一起!

2、需要引用的头文件及命名空间

//
#include "cocos-ext.h" //包含cocos-ext.h头文件
using namespace cocos2d::extension; //引用cocos2d::extension命名空间
//

3、常用操作

CCScale9Sprite继承于CCNodeRGBA,所以除了可以使用以下自定义的操作外,还可以使用节点类CCNode、以及节点颜色类CCNodeRGBA的相关函数操作。

//
/************************************************************************/
/* 以上面原理部分提到的图片为例 */
/************************************************************************/ class CCScale9Sprite : public CCNodeRGBA
{
/**
* 创建的三类方式
* create , createWithSpriteFrame , createWithSpriteFrameName
*/
//使用图片资源名来创建
//参数说明:
// rect整个图的矩形大小
// capInsets中间部分区域对应的矩形大小
//rect = CCRectMake(0, 0, 80, 80);
//capInsets = CCRectMake( 12, 12, 56, 56);
//create("sp.png", rect, capInsets);
//create(capInsets, "sp.png");
static CCScale9Sprite* create(const char* file);
static CCScale9Sprite* create(const char* file, CCRect rect);
static CCScale9Sprite* create(const char* file, CCRect rect, CCRect capInsets);
static CCScale9Sprite* create(CCRect capInsets, const char* file); //使用精灵帧来创建
static CCScale9Sprite* createWithSpriteFrame(CCSpriteFrame* spriteFrame);
static CCScale9Sprite* createWithSpriteFrame(CCSpriteFrame* spriteFrame, CCRect capInsets); //使用精灵帧的名称来创建
static CCScale9Sprite* createWithSpriteFrameName(const char* spriteFrameName);
static CCScale9Sprite* createWithSpriteFrameName(const char* spriteFrameName, CCRect capInsets); /**
* 属性设置
* setSpriteFrame , setCapInsets ,
* setPreferredSize , setContentSize ,
* setOpacity , setColor
*/
//设置精灵帧
virtual void setSpriteFrame(CCSpriteFrame * spriteFrame); //设置中间部分区域对应的矩形大小
CC_PROPERTY(CCRect, m_capInsets, CapInsets); //设置需要生成的尺寸大小,默认为精灵图的原始大小
CC_PROPERTY(CCSize, m_preferredSize, PreferredSize); //CCScale9Sprite是通过这个来拉伸的,而CCSprtie是通过setScale来拉伸。
virtual void setContentSize(const CCSize & size); //设置透明度
virtual void setOpacity(GLubyte opacity);
virtual GLubyte getOpacity(); //设置颜色
virtual void setColor(const ccColor3B& color);
virtual const ccColor3B& getColor();
};
//

4、使用说明:

    4.1、关于参数

当使用CCScale9Sprite::create(const char* file, CCRect rect,  CCRect capInsets);进行创建的时候,必须要注意理解 rect 和 capInsets 这两个参数。

在曾经讲到的精灵类CCSprite中,是否还记得下列创建的方法?

//
CCSprite::create(const char *pszFileName, const CCRect& rect);
//

该方法就是使用pszFileName图片资源,并从中截取某区域矩形的小图rect,来创建CCSprite精灵。当然若为设置rect的话,默认为整张图片的大小。

而在 CCScale9Sprite 中的 rect 其实用法也是一样的。如果是需要整张图片资源sp.png的话,只要设置rect为整张图片的大小,坐标为(0,0)即可。

另外对于 capInsets 的设置,则是决定了CCScale9Sprite的九宫分割的区域大小。若未对CCScale9Sprite的capInsets进行设置,创建的九宫图的分区为九等分。capInsets则是设置了中间区域的大小,从而得到其他8块区域的大小。(这样就不一定是等分了)

 4.2、关于图片拉伸

我们都知道 CCSprite 的拉伸方式是通过 setScale(); 来实现的,而对于 CCScale9Sprite 则不同。它是通过 setContentSize(const CCSize & size); 来实现图片的拉伸。不过貌似使用 setPreferredSize(const CCSize & size); 的效果类似?


【代码实战】

1、使用三组图片进行测试

2、引入头文件及命名空间:

//
#include "cocos-ext.h"
using namespace cocos2d::extension;
//

3、编写测试对比函数test

//
/**
* file:图片资源名称,如"sp.png"
* index:第几组测试数据
*/
void HelloWorld::test(const char* file, int index)
{ //获取可视区域尺寸大小
CCSize mysize = CCDirector::sharedDirector()->getVisibleSize();
//获取可视区域的原点位置
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
//屏幕正中心位置
CCPoint midPos = ccp(mysize.width/2, mysize.height/2); //CCSprite,精灵拉伸
CCSprite* sprite1 = CCSprite::create(file);
sprite1->setPosition( ccp(120 * index, mysize.height - 60) );
this->addChild(sprite1); //精灵拉伸
sprite1->setScale(2.0f); //scale9Sprite1,不设置capInsets
CCScale9Sprite* scale9Sprite1 = CCScale9Sprite::create(file);
scale9Sprite1->setPosition( ccp(120 * index, mysize.height/2) );
this->addChild(scale9Sprite1); //不设置capInsets,拉伸
scale9Sprite1->setContentSize( CCSizeMake(80, 80) ); //scale9Sprite2,设置capInsets
CCScale9Sprite* scale9Sprite2 = CCScale9Sprite::create(file);
scale9Sprite2->setPosition( ccp(120 * index, 60) );
this->addChild(scale9Sprite2); //设置capInsets,并拉伸
scale9Sprite2->setCapInsets( CCRectMake(3, 3, 34, 34) );
scale9Sprite2->setContentSize( CCSizeMake(80, 80) );
}
//

4、测试三组图片

//
bool HelloWorld::init()
{
if ( !CCLayer::init() )
{
return false;
} test("Icon.png", 1); //用Icon.png做测试
test("CloseNormal.png", 2); //用CloseNormal.png做测试
test("Rect.png", 3); //用Rect.png做测试 return true;
}
//

5、运行结果

cocos2dx基础篇(11) 点九图CCScale9Sprite的更多相关文章

  1. [置顶] 【玩转cocos2d-x之三十】点九图和输入框的使用

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/17297721 登录界面一个帐号/密码输入框或者主角命名框是少不了的.这节就来 ...

  2. cocos2dx基础篇(10) 按钮控件CCControlButton

    [3.x] (1)去掉 “CC” (2)对象类 CCObject 改为 Ref (3)按钮事件回调依旧为 cccontrol_selector ,没有使用 CC_CALLBACK_2 (4)按钮状态  ...

  3. cocos2dx基础篇(3) 常用重要类

    ---------------------------------------- 入口类main.cpp 主要控制类AppDelegate.cpp -------------------------- ...

  4. Java多线程系列--“基础篇”11之 生产消费者问题

    概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...

  5. cocos2dx基础篇(23) 粒子系统CCParticleSystem

    [3.x]     (1)去掉"CC"     (2)粒子位置模式 tPositionType 改为强枚举类型 ParticleSystem::PositionType:: // ...

  6. 【Cocos2d入门教程二】Cocos2d-x基础篇

    上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...

  7. python 基础篇 11 函数进阶----装饰器

    11. 前⽅⾼能-装饰器初识本节主要内容:1. 函数名的运⽤, 第⼀类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ⼆. 闭包什么是 ...

  8. cocos2dx基础篇(27) 屏幕适配

    [3.x]https://blog.csdn.net/qq_40338728/article/details/82964046 [屏幕适配] 1.两个分辨率 1.1.窗口分辨率 在main.cpp中有 ...

  9. cocos2dx基础篇(25) 简单碰撞检测

    [3.x] 将数学类 CCPoint.CCRect 改为v3.x版本的 Vec2.Rect 就好了. [简单碰撞检测] 在一些游戏中经常会遇到碰撞检测的情况,如愤怒的小鸟飞出去后,是否与石头发生碰撞. ...

随机推荐

  1. [BZOJ1299]巧克力棒(博弈论,线性基)

    [BZOJ1299]巧克力棒 Description TBL和X用巧克力棒玩游戏.每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度.TBL先手两人轮流,无法操作的人输. ...

  2. [易学易懂系列|rustlang语言|零基础|快速入门|(4)|借用Borrowing]

    [易学易懂系列|rustlang语言|零基础|快速入门|(4)] Borrowing 继续讲讲另一个重要的概念:借用(borrowing), 什么是借用? 我们先来看前一文章([易学易懂系列|rust ...

  3. Jmeter性能测试--自己看到的博客收集

    性能测试的场景:https://www.cnblogs.com/little-little-bai/p/10338156.html

  4. spring 定时器时间配置

    Spring--quartz中cronExpression The '*' character is used to specify all values. For example, "*& ...

  5. Docker(1)--概述

    Docker概述 Docker是一个用于开发,交付和运行应用程序的开放平台.Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件.借助Docker,您可以以与管理应用程序相同的方式来管理 ...

  6. 约瑟夫环(CVTE、网易2014.3.16笔试题offerP228)

    题目:0,1,2,……,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 法一:用环形链表模拟圆圈的经典算法(时间复杂度O(nm),空间复杂 ...

  7. VUEX报错 [vuex] Do not mutate vuex store state outside mutation handlers

    数组 错误的写法:let listData= state.playList; // 数组深拷贝,VUEX就报错 正确的写法:let listDate= state.playList.slice(); ...

  8. 恩友歌 What a friend we've found 歌词

      Verse 1   何等恩友仁慈救主 负我罪孽担我忧 何等权利能将万事 来到耶稣座前求 多少平安我们坐失 多少痛苦冤枉受 都是因为未将万事 来到耶稣座前求     Verse 2   我们有无试探 ...

  9. Github添加密钥

    打开git bash添加上自己的git用户名和git邮箱: 添加上远程仓库:git remote add [shortname] [url] 输入命令:ssh-keygen -t rsa -C &qu ...

  10. Q15格式表示负小数

    1.用Q15.16-bit格式,表示出-0.5? 解析:其实很简单,Q15是dsp里为了优化浮点的,就是将小数* 2^15. 例如:0.333 * 32768 = 10911.744  取整数就是10 ...