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

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


大家知道Cocos2d本身是一个非常强悍的2d游戏引擎,其中自带了很多使用的图像处理功能,但是别忘了Apple自带的Core Graphics里也有很多强大的图像处理功能,比如滤镜 CIFilter.

Apple在iOS上提供了近百种不同的滤镜效果,可以用来方便快捷的渲染图像.至于CIFilter的具体使用大家可以参考苹果CG编程相关的书籍,这里由于篇幅原因不深入介绍了.

在这些滤镜中,我们选择一个复古类型的滤镜(CISepiaTone)来说明使用方法:

CIImage *ciImage = [CIImage imageWithCGImage:cgImage];
    CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"];
    [filter setValue:ciImage forKey:@"inputImage"];
    [filter setValue:@(0.9) forKey:@"inputIntensity"];
    CIImage *outputImage = [filter outputImage];

寥寥几行代码实现了将样板图像转换为滤镜效果的输出文件.

接下来的关键就是如何将精力的纹理转换为图片,下面是转换方法:

-(UIImage*)convertSpriteToImage:(CCSprite*)sprite{
    CGSize size = sprite.contentSize;
    _rt = [CCRenderTexture renderTextureWithWidth:size.width height:size.height];
    [_rt begin];
    [sprite visit];
    [_rt end];
    return [_rt getUIImage];
}

显示通过精灵大小设置对应渲染器的渲染大小,然后取得渲染后精灵的图片文件.

因为用滤镜处理图片对性能有不小的影响,所以为了效率因素,我们接下来写一个缓存用来存放滤镜过滤后的效果:

-(CCSpriteFrame*)getSF{
    CCSpriteFrame *sf = self.spriteFrame;
    for (NSDictionary *dict in _sfMDict.allKeys) {
        NSString *name = dict[@"Name"];
        CGRect rect = [dict[@"Rect"] CGRectValue];

        if ([sf.textureFilename isEqualToString:name] &&
            CGRectEqualToRect(sf.rect, rect)) {
            return _sfMDict[dict];
        }
    }
    return nil;
}

大家可以看到只有在缓存中找不到对应CCSpriteFrame时才实际处理图片(返回nil表示不在缓存中),否则直接使用之前处理过的图片,这样可以极大的提升效率.

最后需要在Sprite的精灵帧改变的时候调用滤镜处理方法,所以我们重载其setSpriteFrame方法:

-(void)setSpriteFrame:(CCSpriteFrame *)spriteFrame{
    [super setSpriteFrame:spriteFrame];
    if (_isRTCaused) {
        _isRTCaused = NO;
        return;
    }
    [self transferSF];
}

因为在滤镜处理后也要修改精灵的SpriteFrame所以这里用一个BOOL类型的变量_isRTCaused区分一下,否则必定死循环也 ;)

下面我们看一下实际的效果,这是正常游戏人物的显示:

下面是应用复古滤镜后人物的效果:

最后是实际游戏运行的效果,注意这是在模拟器上运行略有卡顿,在真机上还是很顺畅的:

可以看到所有游戏人物的显示都被复古化了,包括游戏界面按钮中的人物,因为我是在GC类上做的效果.

有了Cocoa中强大的图像处理能力更是对Cocos2D如虎添翼,后面如果大家感兴趣我们再说说其他特效,比如马赛克效果,曝光效果等等,see you ;)

Cocos2D添加精灵纹理滤镜实现图像复古效果的转换的更多相关文章

  1. Cocos2D中的纹理(textures)的解释

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  2. 图像柔光效果(SoftGlow)的原理及其实现。

    图像柔光效果在很多商业软件中都有实现,比如美图秀秀,光影魔术手等.其能针对原始图像产生一副新的比较平滑感觉光线比较柔和的效果,给人一种朦胧美,如下面几幅图所示:                     ...

  3. 【温故而知新-Javascript】图片效果(图像震动效果、闪烁效果、自动切换图像)

    1.当鼠标指针经过图像时图像震动效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  4. 给UIScrollView添加category实现UIScrollView的轮播效果

    给UIScrollView添加category实现UIScrollView的轮播效果 大家都知道,要给category添加属性是必须通过runtime来实现的,本教程中给UIScrollView添加c ...

  5. 为 Elasticsearch 添加中文分词,对比分词器效果

    转自:http://keenwon.com/1404.html 为 Elasticsearch 添加中文分词,对比分词器效果 Posted in 后端 By KeenWon On 2014年12月12 ...

  6. Win8 Metro(C#)数字图像处理--2.44图像油画效果算法

    原文:Win8 Metro(C#)数字图像处理--2.44图像油画效果算法  [函数名称]   图像油画效果      OilpaintingProcess(WriteableBitmap src ...

  7. Win8 Metro(C#)数字图像处理--2.43图像马赛克效果算法

    原文:Win8 Metro(C#)数字图像处理--2.43图像马赛克效果算法  [函数名称] 图像马赛克效果        MosaicProcess(WriteableBitmap src, i ...

  8. Win8Metro(C#)数字图像处理--2.15图像霓虹效果

    原文:Win8Metro(C#)数字图像处理--2.15图像霓虹效果  [函数名称] 图像霓虹效果函数NeonProcess(WriteableBitmap src) 上述公式进行开方即可. [函 ...

  9. Win8Metro(C#)数字图像处理--2.17图像木刻效果

    原文:Win8Metro(C#)数字图像处理--2.17图像木刻效果  [函数名称] 图像木刻效果函数WoodCutProcess(WriteableBitmap src) [函数代码] ///& ...

随机推荐

  1. ●线段树的三个题(poj 3225,hdu 1542,hdu 1828)

    ●poj 3225 Help with Intervals(线段树区间问题) ○赘述题目 给出以下集合操作: 然后有初始的一个空集S,和以下题目给出的操作指令,并输入指令: 要求进行指令操作后,按格式 ...

  2. 51Nod 1331 狭窄的通道

    有一个长为L的狭窄通道,我们假设这个通道在x轴上,其两个出口分别在x=0与x=L处.在这个通道里有N只狼,第i只狼有一个初始位置ai,它想到达位置bi(0<=i=L处空间足够大可以装下任意数量的 ...

  3. 音频自动增益 与 静音检测 算法 附完整C代码

    前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...

  4. SpringBoot跨域问题解决方案

    一.允许全部请求跨域许可的代码: 需要继承WebMvcConfigurerAdapter类 @Configuration public class MyWebAppConfigurer extends ...

  5. mooc-python语言语法week3-6

    week3 1.类型的概念:程序编程不允许有歧义的数据类型存在,所以对数据进行了划分,python语言类型分为,数字类型.字符串类型.元组类型.列表类型.文件类型.字典类型. i:数字类型: pyth ...

  6. linux安装mysql数据库

    安装mysql 1.下载MySQL的安装文件 安装MySQL需要下面两个文件: MySQL-server-4.0.23-0.i386.rpm MySQL-client-4.0.23-0.i386.rp ...

  7. form submit提交

    form内控件参数自动添加到url后,而自定义的url参数则不能添加到url后 $('#fm').form('submit', { url: 'Data/Diary.ashx?dt=' + new D ...

  8. c# 虚拟路径转化为物理路径

    string strPhycicsPath= Server.MapPath(path);

  9. C程序练习

    1.编程从键盘任意输入两个时间(例如4时55分和1时25分),计算并输出这两个时间之间的间隔.要求不输出时间差的负号. #include<stdio.h> int main() { int ...

  10. JVM Class详解之一

    首先看Class中包含哪些信息简单的说所有Java文件中有的信息class文件都有,编译器帮我们将java文件转化成了JVM能看懂的class格式而已 Class 概述 Class文件是一组以8位字节 ...