Cocos2D添加精灵纹理滤镜实现图像复古效果的转换
来源:互联网 发布:jquery请求json数据 编辑:程序博客网 时间:2024/04/29 06:28
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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添加精灵纹理滤镜实现图像复古效果的转换
- iOS 图像的滤镜效果实现
- cocos2d-x 精灵添加描边效果
- unity3d 纹理的精灵动画效果
- cocos2d-x利用精灵表和纹理缓存实现优化
- 图像滤镜艺术---Photoshop实现Instagram之Mayfair滤镜效果
- CSS实现的滤镜效果
- cocos2d-x精灵的添加和移动
- 图像滤镜效果
- 图像滤镜艺术---图像光照效果滤镜
- 图像处理之图像纹理添加效果(利用JAVA 2D纹理画笔)
- cocos2d--仿真树叶飘落效果的实现(精灵旋转、翻转、钟摆运动等综合运用)
- quick-cocos2d-x(lua) 拖动精灵使其在屏幕移动的效果实现
- 学习COCOS2D-x 精灵动画 实现一个《热血传奇》开门效果
- cocos2d-x一个函数实现精灵变灰效果
- 通过领域滤波(卷积)来实现图像滤镜效果
- 图像滤镜艺术--大雾效果滤镜
- Cocos2d-x实现精灵的拖动
- 刷票漏洞
- Ruby on Rails环境中的异步编程
- live555 h264videostream数据流与时间戳分析
- graphx操作实例02-joinVertices
- linux中常用网络命令学习随笔
- Cocos2D添加精灵纹理滤镜实现图像复古效果的转换
- app 申请加急审核
- 华为机试——计算整数二进制表达式中0的个数
- Android 设置AlertDialog固定大小
- Android样式开发系列文章
- 凸函数与简森不等式(Jensen's inequality)
- ps
- HTTP - POST 406 Not Acceptable
- Unity3d之截图方法