如何在Cocos2D 1.0 中掩饰一个精灵(六)
如何 一个 cocos2d 1.0 精灵
2023-09-14 08:56:50 时间
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)
- (CCSprite *)maskedSpriteWithSprite:(CCSprite *)textureSprite maskSprite:(CCSprite *)maskSprite { // 1 CCRenderTexture * rt = [CCRenderTexture renderTextureWithWidth:maskSprite.contentSizeInPixels.width height:maskSprite.contentSizeInPixels.height]; // 2 maskSprite.position = ccp(maskSprite.contentSize.width/2, maskSprite.contentSize.height/2); textureSprite.position = ccp(textureSprite.contentSize.width/2, textureSprite.contentSize.height/2); // 3 [maskSprite setBlendFunc:(ccBlendFunc){GL_ONE, GL_ZERO}]; [textureSprite setBlendFunc:(ccBlendFunc){GL_DST_ALPHA, GL_ZERO}]; // 4 [rt begin]; [maskSprite visit]; [textureSprite visit]; [rt end]; // 5 CCSprite *retval = [CCSprite spriteWithTexture:rt.sprite.texture]; retval.flipY = YES; return retval; }
让我们一段一段的看:
为之前描述的每一个精灵设置混合函数. 调用begin去在CCRenderTexture中开始绘制,绘制掩饰图片然后是纹理,最后调用end去结束绘制. 基于CCRenderTexture的精灵纹理创建一个新的精灵,因为该纹理是上下翻转的,所以需要在y坐标轴上翻转它.
在我们讨论的所有东西之后,现在让我们来实际使用它!用一下代码替换BEGINTEMP和ENDTEMP之间的代码:
CCSprite * mask = [CCSprite spriteWithFile:@"CalendarMask.png"]; CCSprite * maskedCal = [self maskedSpriteWithSprite:cal maskSprite:mask]; maskedCal.position = ccp(winSize.width/2, winSize.height/2); [self addChild:maskedCal];
该代码用我们新的函数去掩饰日历精灵,并且添加掩饰后的版本到场景中.
编译运行,你应该看到一个被Cocos2D 1.0掩饰后的精灵!
关于CCRenderTexture方法的缺点
对于这个简单的例子app来说工作的不错,但是这里该方法有一些缺点你可能会在更复杂的app中注意到:
每一次你应用一个掩饰图片都会在内存中创建额外的纹理.纹理内存在iPhone中是非常受限制的,所以你必须非常小心对待你一次可以添加多少纹理到内存中去.如果一次添加少量纹理那表示没什么问题,但是如果你必须掩饰100张图片呢? 绘制会耗费时间.用CCRenderTexture绘制并非毫无代价(特别是你的纹理尺寸变大的时候).如果你频繁的做这些事,你可能注意到性能上的冲击.
就像我前面提到的那样,在OpenGL ES 1.0中据我所知没有办法绕过这些缺点.但在OpenGL ES 2.0中你可以通过着色器掩饰的更有效率 — 但是那是另一段旅程的主题了! ;)
《Cocos2D权威指南》——3.6 CCSprite精灵类 本节书摘来自华章计算机《Cocos2D权威指南》一书中的第3章,第3.6节,作者:王寒,屈光辉,周雪彬著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
《Cocos2D-x权威指南》——3.5 精灵类 本节书摘来自华章计算机《Cocos2D-x权威指南》一书中的第3章,第3.5节,作者:满硕泉著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
相关文章
- 如何使用yum 下载 一个 package ?如何使用 yum install package 但是保留 rpm 格式的 package ? 或者又 如何通过yum 中已经安装的package 导出它,即yum导出rpm?
- 安卓手机备忘录中的笔记如何分类管理?
- 如何创建一个RESTful WCF Service
- iOS中如何对具有复杂依赖的SDK在真机上进行单元测试
- 如何使用 Workman 做一个聊天室
- Win7如何解决精简版的迅雷7无法运行
- Solidworks如何在装配图中保存单独的一个零件
- md之Typora如何将图片集中保存到统一的文件夹内,并使用相对路径
- 如何用 Python 写一个简易的抽奖程序
- Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统
- 如何设计一个优惠卷系统
- 如何使用SAP CRM WebClient UI实现一个类似新浪微博的字数统计器
- 如何找到Angular应用的某个directive是属于哪一个Angular module
- 如何使用SAP Cloud Application Studio创建一个PDF form
- 如何在Kubernetes里创建一个Nginx service
- C++ 中如何访问 QML
- 一个游戏创业者如何跳出模式
- 如何在html中把一个图片或者表格覆盖在一张已有图片上的任意位置
- 程序员如何选公司,这八个要素一定要记牢了
- 字节面试官:Rocketmq如何测试?看看我的回答能拿几分?
- 做软件测试,如何才能实现月入20K?
- Windows7如何在安全模式下卸载驱动(亲测)
- 马上跨年了,如何用代码写一个“跨年倒计时”呢?
- 全干工程师神器 - Jmeter 08 - 如何利用Jmeter进行接口测试
- 如何正确理解 CPU 使用率和平均负载的关系?看完你就知道了
- ubuntu下的vscode终端如何cmd下一个文件目录?