Cocos2D添加精灵纹理滤镜实现图像复古效果的转换
2016-01-08 14:47
537 查看
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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添加精灵纹理滤镜实现图像复古效果的转换
- cocos2d-x scoket 解决方案
- cocos2dx在win32中全屏
- Lua/cocos2d-lua中定义类的四中方法
- Cocos2D瓦块地图高清屏(retina)显示比例问题的解决
- Cocos2D瓦块地图高清屏(retina)显示比例问题的解决
- Cocos2D瓦块地图高清屏(retina)显示比例问题的解决
- 将Cocos项目部署到Eclipse工程中
- Cocos输出中文字符
- cocos2d-x 精灵的创建和基本使用
- cocos2d-x源码
- 安装、配置、部署Cocos2d-x
- cocos2d-3.8.1版本tableview的使用(怎么取消弹簧效果);
- COCOS学习笔记--坐标系统与坐标系转换
- Cocos2d-x利用jni调用java层代码
- cocos jpg alpha_mask png
- cocos2d-x Undefined symbols for architecture x86_64 when porting iOS app in Xcode? 问题的解决
- Cocos2d-x环境搭建
- 关于Can't find Class org.cocos2dx.cpp.AppActivity的解决
- Cocos2d-x 多分辨率适配完全解析