切取图片的一部分(利用CCRenderTexture)

本文介绍了一种在Cocos2d-x中裁剪图片的有效方法,通过使用CCRenderTexture来精确地截取图片的指定部分,而非采用setTextureRect的方式。文章详细解释了具体步骤,包括创建CCRenderTexture、开始渲染、设置待裁剪的Sprite属性、结束渲染并创建新的Sprite。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       显示图片时,在项目中经常会用只读取图片的一部分,而不是全部。

       错误方式:很多人这时候会采用setTextureRect(CCRectMake(x, y, width, height)),事实证明,这种方法是不可取的。

       正确方式:

       那么,我们应该用什么方法呢??下面来介绍一种方法,给出函数的实现。

CCSprite * HelloWorld::getPartTexture(CCSprite * pSprite)
{
	if (!pSprite) {
		return CCSprite::create();
	}
	//把renderTexture矩形当做一个画布,左下角为原点。
	CCRenderTexture * rt = CCRenderTexture::create(180, 200);
	rt->begin();
	pSprite->setFlipY(true);
	pSprite->setAnchorPoint(ccp(0, 0));
	pSprite->setPosition(ccp(-10, 0));
	pSprite->visit();
	rt->end();

	return CCSprite::createWithTexture(rt->getSprite()->getTexture());
}

      首先,创建一个CCRenderTexture,大小就是你想显示的图片大小。

      其次,调用 CCRenderTexture:begin. 这个方法会启动OpenGL,并且接下来,任何绘图的命令都会渲染到CCRenderTexture里面去,而不是画到屏幕上。

     第三,对所要切的Sprite1调用visit方法。(如果你要对Sprite1进行锚点、位置或者翻转进行设置,必须要在调用visit之前,否则写了和没写的效果是一样的

     第四,调用 CCRenderTexture:end。这个方法会渲染纹理,并且会关闭渲染至CCRenderTexture的通道。

     第五,从生成的纹理中创建生成一个Sprite2。

     注意:在绘制过程中,CCRenderTexture所创建的矩形相当于一个坐标系L,左下角的坐标为(0,0),向右和向上越来越大。Sprite1设置坐标是以这个L作为坐标系的。

1.深度优先遍历(Depth-First Traversal) 假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。 2.广度优先遍历 1)从图中某个顶点V0出发,并访问此顶点; 2)从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点; 3)重复步骤2,直到全部顶点都被访问为止。 3. prim算法 假设V是图中顶点的集合,E是图中边的集合,TE为最小生成树中的边的集合,则prim算法通过以下步骤可以得到最小生成树: 1)初始化:U={u 0},TE={f}。此步骤设立一个只有结点u 0的结点集U和一个空的边集TE作为最小生成树的初始形态,在随后的算法执行中,这个形态会不断的发生变化,直到得到最小生成树为止。 2)在所有u∈U,v∈V-U的边(u,v)∈E中,找一条权最小的边(u 0,v 0),将此边加进集合TE中,并将此边的非U中顶点加入U中。此步骤的功能是在边集E中找一条边,要求这条边满足以下条件:首先边的两个顶点要分别在顶点集合U和V-U中,其次边的权要最小。找到这条边以后,把这条边放到边集TE中,并把这条边上不在U中的那个顶点加入到U中。这一步骤在算法中应执行多次,每执行一次,集合TE和U都将发生变化,分别增加一条边和一个顶点,因此,TE和U是两个动态的集合,这一点在理解算法时要密注意。 3)如果U=V,则算法结束;否则重复步骤2。可以把本步骤看成循环终止条件。我们可以算出当U=V时,步骤2共执行了n-1次(设n为图中顶点的数目),TE中也增加了n-1条边,这n-1条边就是需要求出的最小生成树的边。 4.Kruskal算法 假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。之后,从网的边集 E 中选一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可,而应该下一条权值最小的边再试之。依次类推,直至森林中只有一棵树,也即子图中含有 n-1条边为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值