Cocos游戏开发中的倒水游戏效果

点击上方亿元程序员+关注和★星标

引言

Cocos游戏开发中的倒水游戏效果

近日,笔者看到小伙伴正在推广他的小游戏,深入游玩了一波,这游戏不仅体验非常好、界面精美,据说活跃、留存等数据都很不错。

言归正传,游戏体验过之后,非常感兴趣这个游戏中的倒水游戏效果是如何实现的呢?

今天 给大家介绍一下如何在Cocos游戏开发中实现倒水游戏效果,非常感谢小伙伴的投稿。

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

1. 分析一下游戏

我们先来分析一下实现这个游戏有哪些关键点:

  1. 杯子:杯子的属性有它的容量,杯子倒水时的点以及倾斜倒水的动作。

  2. :水的分层显示,跟随着杯子倒水时倾斜而倾斜,还有倒水过程中的水的波纹。

  3. 水流:倒水过程中一束水流的效果。

2. 水的效果

本游戏最大的实现难度应该是水的波纹、倾斜、以及倒水效果。

在这里有几个关键的数学判断和参数,主要用于模拟倾斜容器中水的动态和波纹效果。

下面是这些判断和参数的简要解释以及相关的数学公式:

1. 倾斜角度判断与模拟水面倾斜

着色器通过检查倾斜角度来决定水面的倾斜方式和范围。

水的倾斜效果是通过计算水面与容器边界交互的结果来实现的。

  • 角度计算公式
  • 这个公式将倾斜角度从度转换为弧度,以便使用三角函数。
  • 倾斜的处理: 根据水的高度与容器的比例和倾斜角度,确定水面的中心点和倾斜程度。使用 tan 函数来判断水面是否会接触到容器的上底或下底。这个计算涉及到容器的宽高比和水的当前高度。

2. 水面波纹的模拟

水面波纹是通过正弦函数来模拟的,这在视觉上表示为水面随时间波动。

这部分使用的数学公式包括振幅、角速度和频率,以创建动态波浪的效果。

  • 波纹公式:
  • 其中,amplitude 控制波浪的高度,angularVelocity 控制波的周期,frequency 控制波浪的速度。cc_time.x 用于根据时间动态改变波的位置,实现动态效果。
ini 复制代码
// 波纹计算
bool hasWave = curIdx==arrSize-1;//只有最上面一层有波浪
hasWave = hasWave;
if(hasWave){
  // 代入正弦曲线公式计算模拟水面波浪 y = Asin(ωx ± φ)
  float amplitude = 0.0;// 振幅(控制波浪顶端和底端的高度)
  float angularVelocity = 0.0;// 角速度(控制波浪的周期)
  float frequency = 0.0;// 频率(控制波浪移动的速度)
  if(abs(corrugationType-1.0)<0.01){//往里倒水
    amplitude = 0.08;
    angularVelocity = 10.0;
    frequency = 10.0;
  }else if(abs(corrugationType-2.0)<0.01){//往外倒水
    amplitude = 0.03;
    angularVelocity = 5.0;
    frequency = 6.0;
  }
  y = amplitude * sin((angularVelocity * uv1.x) + (frequency * cc_time.x)*(toLeft ? 1. : -1.));
}

3. 颜色和透明度处理

片段着色器 最终将计算的水面透明度(alpha)与纹理颜色和顶点颜色相结合来决定最终像素的颜色。

  • 颜色混合公式
  • 如果水面的某部分完全透明,则使用 discard 指令跳过这些像素,优化性能。
ini 复制代码
//从最下面一层开始绘制
for(int i=0;i<MAX_ARR_LEN;i++){
  if(heights[i].x<0.001){
    continue;
  }
  _height+=heights[i].x;
  a += drawWater(uv,angle,_height,size,i);
  if(a>0.0){//绘制过的,跳过
      ret *= a*colors[i]; 
      break;
  }
}
if(a<0.001){
  discard;
}
// 输出颜色
gl_FragColor = ret;

这些数学判断和参数的使用使得着色器能够根据不同的输入动态调整水的视觉表现。

从而在游戏或视觉效果中提供更加真实和动态的水体表现。

3. 实现倒水游戏效果

1.资源准备

我们 准备好我们的杯子以及杯子的Mask图片,把核心的水的Shader做成材质球。

  • 环境:CocosCreator

  • 版本:2.4.6

2.源码解析

首先 构建我们的水的对象Water类。主要用来管理水的大小和颜色、倾斜状态以及完成与Shader的交互。

其中 最主要通过heights属性和tiltAngle属性去控制Shader的效果。

然后构建我们的杯子类。控制杯子的倾斜动画、倒水落点、水的分层以及通关的判断。

其中倒水的核心逻辑:

最后 就是我们的水流效果,这一块比较简单,我们可以通过cc.Graphics组件去实现,核心逻辑如下:

3.效果演示

结语

本文核心Shader 可通过私信 发送pourwater获取。

需要完整源码 的小伙伴可下方通过阅读原文获取。

store.cocos.com/app/detail/...

小伙伴 已经把源码上架CocosStore,源码非常完整。

涵盖核心玩法,商城,每日任务,每日签到,新年吉祥物,抽奖、排行榜以及兑换码等众多功能。

并且已经接入微信和抖音广告,非常适合学习和二开。

最重要的是小伙伴还支持授权,据说这小游戏收益还非常的不错!物超所值!

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

AD:笔者线上的小游戏《填色之旅》《方块掌机经典》《贪吃蛇掌机经典》《重力迷宫球》大家可以自行点击搜索体验。

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

推荐专栏:

你知道和不知道的微信小游戏常用API整理,赶紧收藏用起来~

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

知识付费专栏

点击下方绿色按钮+关注。

相关推荐
神夜大侠1 小时前
VUE 实现公告无缝循环滚动
前端·javascript·vue.js
明辉光焱1 小时前
【Electron】Electron Forge如何支持Element plus?
前端·javascript·vue.js·electron·node.js
柯南二号1 小时前
HarmonyOS ArkTS 下拉列表组件
前端·javascript·数据库·harmonyos·arkts
wyy72931 小时前
v-html 富文本中图片使用element-ui image-viewer组件实现预览,并且阻止滚动条
前端·ui·html
前端郭德纲2 小时前
ES6的Iterator 和 for...of 循环
前端·ecmascript·es6
王解2 小时前
【模块化大作战】Webpack如何搞定CommonJS与ES6混战(3)
前端·webpack·es6
欲游山河十万里2 小时前
(02)ES6教程——Map、Set、Reflect、Proxy、字符串、数值、对象、数组、函数
前端·ecmascript·es6
明辉光焱2 小时前
【ES6】ES6中,如何实现桥接模式?
前端·javascript·es6·桥接模式
PyAIGCMaster2 小时前
python环境中,敏感数据的存储与读取问题解决方案
服务器·前端·python
baozhengw2 小时前
UniAPP快速入门教程(一)
前端·uni-app