Cocos视频拼图,终于支持微信小游戏了!

引言

哈喽大家好 ,我是亿元程序员,一位有着8年游戏行业经验的主程。

不知道 大家还记不记得笔者上一期出的《Cocos视频拼图,拼图游戏的最后一块碎片,支持原生!》,当时我们搞定了 WebAndroid 原生 两端的视频纹理提取,拼图玩法直接复用,效果杠杠的。

但是 ,文章发出去没多久,评论区和私信就被同一个问题刷屏了:

既然如此 ,笔者只好再次出手,把拼图游戏在 Cocos 里的 最后一块平台碎片 也补上—— 微信小游戏

言归正传 ,本期带大家实战看看: 在微信小游戏里如何解码视频、提取纹理、完成拼图游戏,并且和Web/原生共用一套业务代码

本文实战完整源码可在文末获取,已经拥有合集的小伙伴可以直接更新。

上期回顾:Web 和原生怎么做的?

简单回顾 一下,上期我们已经跑通了两条路:

1. Web 环境

利用 document.createElement('video') 创建视频标签,每帧把画面 drawImage 到 Canvas,再 uploadDataTexture2D

2. Android 原生

魔改 官方 Creator3.7.3_VideoTexture 示例,通过 window.gfx.Video + FFmpeg 解码 mp4 ,在 frame_update 回调里上传纹理。

拼图核心BoardPieceShader 切块)完全不用动,变的只是「视频怎么变成一张动态纹理」。

那么 ,微信小游戏既没有 document ,也没有我们自定义的 gfx.Video怎么办?

微信小游戏为什么难?

相信 做过互动影游小游戏的同学都有体会:微信环境里,想拿视频像素数据,选择并不多。

我列举一下 当时评估过的方案:

1. VideoPlayer 组件

Web / 原生一样的问题—— 拿不到视频帧数据 ,还有原生层级遮挡等老毛病。

拼图 需要采样纹理,直接排除。

2. 视频转图片逐帧播放

上期 笔者已经实测过:包体暴涨、加载次数多、原生还会莫名加速。

小游戏 当然也扛不住, 排除

3. wx.createVideoDecoder

微信 提供的 底层视频解码器 ,可以 getFrameData() 拿到 RGBA 帧数据,再上传到 CocosTexture2D —— 本期选用

方案 微信可行性 结论
VideoPlayer 组件 无法取纹理、层级问题 排除
视频转图片逐帧 包体暴涨 排除
wx.createVideoDecoder 可取帧数据 本期选用

其实 思路和上期一脉相承: 解码视频 → 上传 Texture2D → 拼图 Shader 切块显示 。变的只是解码方式。

核心实战:微信小游戏视频纹理

1. 平台分流:一套代码,三端运行

首先VideoTexturePlayer 里做平台判断。微信小游戏用 MINIGAME 宏,优先级高于原生 JSB

对外 API 不变GameManager 只管调 videoPlayer.load()Board 拿到 Texture2D 就开始切拼图。

2. 创建解码器,逐帧上传纹理

核心流程 就四步:

第一步 ,创建微信视频解码器:

第二步 ,监听 start 事件,拿到视频宽高,创建 Texture2D

第三步 ,启动解码:

第四步 ,在 update() 里逐帧取数据、上传纹理:

踩坑实录:循环播放

第一版 跑通播放后,笔者信心满满地加了循环逻辑:

// ❌ 错误方案
decoder.on('stop', () => {
    this.wechatDecoder.seek(0);
});

万万没料到 ,视频自然播完触发的不是 stop ,而是 ended

更坑的是 :单独 seek(0) 无法恢复解码 ,画面直接卡住,拼图拼完了视频也不动了:

正确做法

  1. 监听 ended 事件,而不是 stop
  2. 调用 decoder.stop() ,再 decoder.start({ source }) 重新解码
  3. wechatLooping 防止重入, wechatDestroying 防止销毁时竞态
  4. stop().then(start) 失败时,才 fallbackseek(0)

这一刀 ,拼图完成后视频才能丝滑循环,美术妹子才不会“ 定住 ”。

其他细节

1. 核心流程

本文 核心依然是: 微信端解码视频 → 提取纹理 → 显示到拼图块上

拼图玩法 直接沿用上期, Board 通过 Shader 参数切同一张动态纹理的不同区域,小伙伴们可以翻看旧文或源码。

2. 组件整合

完整组件 已经包含在合集源码里。

上期native 文件夹( Android 原生解码)照旧保留;

本期 微信端 不需要额外 native 插件 ,只需确保 VideoTexturePlayer 脚本和 types/wx.d.ts 在项目中,调用 load() 即可:

image

3. 一套代码三端运行

VideoTexturePlayer 封装了 Web / 原生 / 微信 三条路径, GameManagerBoard 、拼图 Shader 完全不用改。

最终效果

拼图完成之后 ,视频循环播放,美术妹子动起来啦!

3*3狗狗拼图:

10*10美术妹子拼图:

结语

本文 实战完整源码 已集成到亿元Cocos小游戏实战合集2.0,已经拥有的小伙伴可以直接更新。

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

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

推荐文章:

亿元Cocos小游戏实战合集2.0

亿元Cocos小游戏实战合集1.0

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

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

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

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

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

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

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

5赞

牛逼, 我要学习

支持支持 :heart_eyes:

:cow::cow::cow::cow::cow:

牛的, 之前论坛有个哥们做了一个小游戏, 养成美女的, 就是各种视频,他那边是不是你这种方案。

这个, 类似方案把, 我之前也在抖音小游戏做过播一个开头视频然后接游戏。 好像也是用的类似方案。

不错不错学习了。

好奇在小游戏里播放视频,有没有什么预加载的方式,总担心会卡顿

:+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1::+1:

666,又学到了

厉害:+1: 能出一些创意的东西