“我要验牌”很火吗?我特意写了个Shader去验...

1 阅读8分钟

电影截屏

引言

哈喽大家好,我是亿元程序员,相信大家都看或者听到过下面几句台词:

“我要验牌(wò yāo yān pǎi)”。

“牌没有问题”。

“给我擦皮鞋”。

如果要评选马年开年第一热梗,这几句台词估计能够遥遥领先。

为此,我特意写了一个Shader来"验牌"(蹭热度是吧?)。

言归正传,本期带大家一起来看看如何在Cocos游戏开发中,通过Shader实现卡牌的掀角(搓牌)效果,进行“验牌”

本文源工程可在文末获取,小伙伴们自行前往。

什么是掀角(搓牌)效果?

卡牌从一个角 / 边开始,以卷曲、倾斜、透视变形的方式,从背面逐渐翻转为正面,过程中牌面局部先露出、整体渐进展开,模拟真实纸张的弯曲与光影变化。

还是不懂?我斥巨资买了一副扑克牌来演示给大家看:

验给大家看

原来如此,但是游戏中要它何用?

掀角(搓牌)效果有什么用?

掀角(搓牌)效果不是花里胡哨,是专门用来提升 “手感、悬念、运营数据” 的,在棋牌、卡牌游戏里属于非常实用的设计。

总的来说有以下几种常见用处:

  • 提升真实手感 : 模拟现实里用手指搓开牌角偷看的动作,更像 “真打牌”,在棋牌和卡牌游戏中很常见。
  • 制造悬念,强化情绪 :不是一下子翻开,而是先露一点、再慢慢展开,在抽卡类游戏中很常见,常用作动画效果。
  • 循序渐进 :模拟翻书效果,逐渐展示全部内容,避免直白刷新,常用来展开新篇章。

好哦好哦,那要怎么实现呢?

掀角(搓牌)效果实战

这部分会比较啰嗦,小伙伴们可以直接跳到末尾四键四连点赞分享收藏转发

1.前期准备

首先准备正反面的扑克牌,有条件的可以买扑克自己拍,我直接去找AI搭子:

你这是扑克牌吗

然后CocosCreator3.8.7创建一个名叫woyaoyanpai2D项目,将准备好的图片放到assets目录下,简单布置场景,此处小3埋下伏笔。

买家秀

老规矩,我们先找到Shader的模板,为什么不用菜单生成?因为那不适用。

在资源管理器,搜索sprite找到内置的spriteshader,然后复制到assets目录,改个名字woyaoyanpai

让它抄

2.初见端倪

Cocos Shader的固定格式通常分成以下3个部分:

  • 声明参数和渲染状态:定义渲染配置(混合模式、深度测试、属性参数等)。
  • 顶点着色器:决定每个顶点的位置和UV(纹理坐标)。
  • 片元着色器:决定每个像素的最终颜色。

正如笔者前面说过的,Shader入门阶段理解这三部分就足够上手,复杂效果可以结合AI辅助实现。。

下面我们将根据上面的三部分分别进行。

3.CCEffect(参数和渲染规则声明)

这部分是“配置项”,小伙伴们不用深钻细节,重点看properties里的参数(脚本会给这些参数传值):

划重点

具体如下

参数名作用
faceTexture卡牌正面的贴图(比如牌面的花色 / 数字)
faceUVFlip正面贴图的翻转(比如牌面左右 / 上下反了,用这个修正)
touchPos手指 / 鼠标拖拽的位置(UV 坐标,0~1 范围)
cornerPos卡牌被掀起的角的位置(比如右下角是 (1,0),UV 坐标)
radius卷曲的弧度(值越大,卷曲越明显)
paddingData扩充范围数据(x/y 是向四周扩的像素,z/w 是卡牌宽高)

4.sprite-fs(片元着色器)

因为掀角(搓牌)主要在片元着色器实现,因此我们先来看看这部分。

片元着色器,粗暴地理解就是,它决定每个像素是什么颜色。

因此我们需要知道什么时候显示牌面,什么时候显示牌背才能知道显示什么颜色。

卷

卡片卷起来的时候,这里面涉及到一个数学模型叫“卷曲坐标系”。

看不懂别慌,问题不大

其中具体的含义如下:

变量含义
dir卷曲方向(和我们理解的方向相反)
D拖拽距离(手指到角起点距离)
R圆柱半径(卷起来的圆柱半径)

可以把卡牌卷曲理解成“绕一个圆柱滚起来”。

  • D:表示当前拖拽长度
  • 圆周公式:C = 2πR
  • 我们只卷一部分,所以用 D ≈ πR(半圈)

因此R ≈ D / π

这样就能根据拖拽距离动态算出卷曲半径。

建立完成以后,我们可以算出来当前渲染像素点相对于“卷曲交界线”的垂直距离x(投影),然后我们就能够根据x的值来进行分区,得出最终颜色。

看不懂要谎,问题很大

为了让小伙伴们更加容易理解,我给每一层叠加一层半透明的颜色(红、绿,蓝,黄),方便大家理解。

这下好理解了吧

5.sprite-vs(顶点着色器)

小伙伴可能会有疑问,什么时候应该在顶点着色器写,什么时候应该在片元着色器写。

先上一个简单的结论(其实后面还会涉及计算量问题,暂不讨论):

  • 顶点着色器(VS):改“形状”。
  • 片元着色器(FS):改“像素颜色”。

我们的效果有什么需要在顶点着色器完成的,直接给大家看下效果:

被裁了

对于一个Sprite,渲染范围就四个顶点,所以当像素出界后,无法正常显示。

因此我们需要在顶点着色器把范围扩大一下。

根据顶点位置扩大

扩大之后,图像会被拉伸,因此我们还要把UV缩回去,这样才能保证不变形。

相对运动

6.最终效果

原来是小瘪三

结语

我要验牌”这个梗最近的确很火,终于是烧到了游戏开发。

适度玩梗益脑,沉迷玩梗伤身。

本文实例工程可通过私信发送“我要验牌”获取。

更多实战完整源码包含编辑器已集成到亿元Cocos小游戏实战合集(已完结),感谢小伙伴们对创作的支持。


我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

实不相瞒,想要个爱心!请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐文章:

亿元Cocos小游戏实战合集

老板说最近这款游戏很火让我抄,可是我连玩都玩不明白...

这款值68亿的游戏,你不实战一下吗?安排!

小伙伴说我的拼图游戏用Mask不能合批...

俄罗斯方块谁不会做......啊?流沙版?

最近很火的一个拼图游戏,老板让我用Cocos3.8做一个...

老板说拼图游戏太卷了,让我用Cocos做个3d版本的...

敢不敢挑战用Cocos3.8复刻曾经很火的割绳子游戏?