Cocos2D添加精灵纹理滤镜实现图像复古效果的转换

简介:

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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 ;)

相关文章
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
760 2
|
9月前
|
存储 弹性计算 资源调度
阿里云服务器收费模式对比:包年包月与按量付费的适用场景与选择参考
在我们购买阿里云服务器的时候,云服务器的收费模式主要有多种收费模式,其中包年包月和按量付费两种主流模式。对于准备在阿里云上部署应用的用户来说,选择合适的收费模式至关重要,因为它直接关系到成本控制和资源使用的灵活性。本文将对这两种收费模式做一个对比,以供参考和选择。
1262 14
|
存储 云安全 安全
云概述:云计算简明概述
本文概述了云计算的基本概念、服务模型(IaaS、PaaS、SaaS)、部署模型(私有云、社区云、公共云、混合云)、应用场景(云存储、云桌面、云游戏等)及市场趋势,强调了云计算在推动数字化转型中的重要作用。
1499 60
云概述:云计算简明概述
|
Ubuntu Linux
在Linux中,如何添加路由?
在Linux中,如何添加路由?
|
12月前
|
安全 网络安全 开发工具
解决Ascend上vllm运行时出现urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED]
在使用vllm模型时,运行示例代码下载模型文件时遇到了SSL安全校验问题。临时解决方案是修改`requests/sessions.py`文件中`request`函数的`verify`参数默认值为`False`。
|
测试技术 PyTorch 算法框架/工具
魔搭开源推理引擎 DashInfer,助力CPU服务器解锁大模型超强推理
ModelScope推出了预训练大语言模型(LLM)推理引擎DashInfer,采用C++ Runtime编写,提供C++和Python语言接口,具有生产级别的高性能表现,适用于多种CPU架构,包括x86和ARMv9。DashInfer支持连续批处理(Continuous Batching)和多NUMA推理(NUMA-Aware),能够充分利用服务器级CPU的算力,为推理14B及以下的LLM模型提供更多的硬件选择。该项工作已开源。
C#获取文件基本信息,文件名称、修改时间、文件路径等
C#获取文件基本信息,文件名称、修改时间、文件路径等
303 0
线性回归 特征扩展的原理与python代码的实现
在线性回归中,多项式扩展是种比较常见的技术,可以通过增加特征的数量和多项式项的次数来提高模型的拟合能力。 举个例子,多项式扩展可以将一个包含 n 个特征的样本向量 x 扩展为一个包含 k 个特征的样本向量,其中 k 可以是 n 的任意多项式。例如,如果我们使用二次多项式扩展,可以将样本向量[x1, x2]扩展为一个包含原始特征和交叉项的新特征向量,例如 [x1, x2, x1^2, x2^2, x1*x2]。这些新特征可以捕捉到更丰富的特征组合和非线性关系,从而提高模型的拟合能力。
|
JSON 编解码 缓存
探究|Go JSON 三方包哪家强?
本文作者从评判标准、功能评测、性能评测等多方面剖析三方库哪些家强,并给出了比较务实的建议。
探究|Go JSON 三方包哪家强?
|
人工智能 编解码 自然语言处理
prompt提示词
prompt提示词
1318 0