如何在Cocos2D 1.0 中掩饰一个精灵(六)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)



掩饰一个精灵:实现代码

打开HelloWorldLayer.m并且在init方法上方添加如下方法:

- (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;

}

让我们一段一段的看:

  1. 用和掩饰精灵相同的宽和高创建CCRenderTexture.
  2. 将掩饰精灵和纹理精灵放置到左下0,0的位置.
  3. 为之前描述的每一个精灵设置混合函数.
  4. 调用begin去在CCRenderTexture中开始绘制,绘制掩饰图片然后是纹理,最后调用end去结束绘制.
  5. 基于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中你可以通过着色器掩饰的更有效率 — 但是那是另一段旅程的主题了! ;)

时间: 2024-10-02 16:00:09

如何在Cocos2D 1.0 中掩饰一个精灵(六)的相关文章

如何在ASP.NET Core中实现一个基础的身份认证

注:本文提到的代码示例下载地址> How to achieve a basic authorization in ASP.NET Core 如何在ASP.NET Core中实现一个基础的身份认证 ASP.NET终于可以跨平台了,但是不是我们常用的ASP.NET, 而是叫一个ASP.NET Core的新平台,他可以跨Windows, Linux, OS X等平台来部署你的web应用程序,你可以理解为,这个框架就是ASP.NET的下一个版本,相对于传统ASP.NET程序,它还是有一些不同的地方的,比

如何在Ubuntu QML应用中实现一个垂直的Slider

我们在使用Ubuntu SDK中的Slider的时候,我们发现,它没有orientation的属性尽管在Qt官方网站的slider是有这个属性的.在默认的情况下,这个Slider是水平的.那么我们该如实现这个呢? 我们的任何一个QML Item都有一个属性叫做rotation.我们可以通过这个属性来得到一个旋转90度的水平Slider.这样我们就可以用如下的代码来实现了: import QtQuick 2.0 import Ubuntu.Components 1.1 /*! \brief Mai

如何在Microsoft Edge浏览器中添加一个Hello World插件

注:本文提到的代码示例下载地址> How to add a Hello World extension to Microsoft Edge Microsoft Edge 随着Win 10一起推出,是微软现在主推的浏览器.Edge 相比较于IE, 有更强的交互性,安全性,提供了更好的用户体验.而且这次Edge浏览器也开始支持浏览器插件喽. Edge 上的插件跟其他Chrome, FireFox等浏览器上的插件类似.但其API还在开发当中,截止到目前,已经可以支持大部分的API了.如果想要看具体的A

如何在Solid Edge SP中获得一个装配的所有图纸

在设计工作完成后,经常需要把整个装配下面的所有图纸挑选出来,进行批量打印.在大多数PDM系统中,这项工作需要进行二次开发完成.不过在Solid Edge SP(以下简称SESP)中,这件事很容易做到.方法如下: 1.进入SESP PDM 界面,选中需要打印图纸的装配的版本.例如我们要打印"PRT-00086/C-立柱装配"的所有图纸,就选中这个版本. 2.在工具条上点击"创建包"按钮. 3.在创建包的输出类型中,请选择"ZIP",不要选择&quo

如何在iOS 7.0中隐藏状态栏

使用Cordova做了一个小项目,在原来iOS6的时候显示挺好,升级为iOS7后,每次App启动后都会显示状态栏,而且状态栏和App的标题栏重叠在一起,非常难看,因此需要将状态栏隐藏起来. 首先,考虑了采用Code的方式,在MainViewControoler.m中写下如下代码: 但是测试并不生效. 于是尝试修改Info.plist文件,因为每个工程Info.plist的位置可能不尽相同,最好在底部的搜索框中进行搜索.添加了下面两个属性后,在启动App,状态栏隐藏了. 参考资料: 1.iOS7

Cocos2d-x 3.0中实现多点触摸

Cocos2d-x 3.0中实现多点触摸 尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=2713 在上一篇<Cocos2d-x 3.0 中使用单点触摸>中介绍了在Cocos2d-x 3.0中实现单点触摸,但是有些游戏还会用到多点触摸,其中最典型的游戏是节奏大师,在节奏大师中会不断产生运动的音符,玩家需要不停地点击音符以获得高分,而且玩家可以多个手指头一起点,多个手指头一起点就是使用多点触摸实现的. 下面通过一个小的例子介绍如何在Cocos2d-x

【IHttpHandler】在ASP.Net2.0中使用UrlRewritingNet实现链接重写

很多时候我们需要链接转向(Url Rewriting),例如二级域名转向.文章访问链接等场合. 让我们看两个例子: 1 你现在看到的当前作者的博客园的域名: http://jx270.cnblogs.com/ 实际上是 http://www.cnblogs.com/jx270 的一种链接重写(Url Rewriting). 2 codeproject上的文章,我们获取的地址都是以文章主要关键字做的网页名称: http://www.codeproject.com/cs/webservices/ws

cocos2d-x快乐的做让人快乐的游戏3:cocos-2d 3.x中的物理世界

Cocos2d-x 3.0+ 中全新的封装的物理引擎给了开发人员最大的便捷,你不用再繁琐与各种物理引擎的细节,全然的封装让开发人员能够更快更好的将物理引擎的机制加入?到自己的游戏中,简化的设计是从2.0到3.0+的一个质的飞跃.(假设用的2.x版本号的cocos2d-x,看前一篇文章box2d) 以下相同以一个小demo来展示一下物理引擎的运用,同一时候说一下我在运用物理引擎中遇到的一些小小的问题. Cocos2d-x 3.0+中的物理属性: 1.物理世界被集成到场景中,当你创建一个场景,你能够

不算“真正的语言”?详说Swift 2.0中的错误处理

苹果公司在今年的全球开发者大会(Worldwide Developers Conference, WWDC)上宣布推出Swift2.0,该语言的首席架构师Chris Lattner表示,Swift 2.0主要在语言基本语法.安全性和格式美观度这三方面进行了改进.除了这些新的功能特性,还有对语法的优化.修饰及美化,最后是Swift 1.x中最具影响力的错误处理机制. 这是因为你根本无法回避它.如果打算使用Swift 2.0的话,必须接受错误处理这样的机制,并且错误处理机制将改变Cocoa和Coco