
字节笔记本
2026年10月7日 · 约 7 分钟读完
转盘要先选定发布目标
小程序里的动画和小游戏里的引擎不是同一条发布路径。对话先列了页面上就能用的做法,再说明 Cocos、Laya 这类引擎面向的是小游戏。用户写的 cccc 被理解成 Cocos,用来做转盘。转盘若走引擎,项目就应按小游戏发布,而不是在普通页面里指望完整引擎。

页面里先用原生动画和样式
wx.createAnimation 是小程序自己的动画对象,把一组变化应用到视图。简单的位移、透明度,用样式里的 transition 和 animation 就够。更复杂的绘制用 canvas,自己控制每一帧画什么。帧动画是换图,适合序列已经画好的情况。SVG 对话里写明支持有限,只适合简单变化。
Lottie 用来播矢量动画,跨端,小程序里可以接。它播放的是现成的动画数据,不是一套游戏循环。页面上的过场、图标,优先在这几项里选。选的标准是对话里说的:需求、复杂度和性能。一个按钮的反馈不要上 canvas。一段长的逐帧绘制不要硬塞进样式关键帧。
引擎发布到小游戏
对话对“能不能用游戏引擎”的回答是:小程序不直接带完整引擎。Cocos Creator 和 Laya Air 可以发布到微信小游戏,用来做二维或三维。微信自己的小游戏框架提供 canvas 和音频这一类基础,不是传统引擎。Three.js 可以在小程序里做三维,但它不是引擎的发布流程。也有人在小程序能力上自己写很轻的循环。这些方案大多针对小游戏。
若需求是动画而不是游戏,应回到上一节的原生动画。若确实要引擎级别的场景、碰撞或转盘那种持续交互,就把项目定成小游戏。同一套代码不要一边当小程序页面、一边当小游戏包。发布目标不同,入口和限制不同。
cccc 在对话里没有别的定义,回答把它当成 Cocos Creator 的缩写,并准备了一份转盘组件。缩写对不上时,转盘实现会跑偏。先确认是 Cocos 还是页面里的 canvas。确认之前不要按引擎的组件装饰器去写页面。
转盘这种交互有持续的角度和停靠位置,样式过渡能做一次旋转,停在指定格上要自己算角度。算角度和循环已是小游戏或 canvas 的范围。页面若只是展示一段旋转,用样式。要可重复地点按、停下、对结果,按小游戏或 canvas 做,并单独发布。

先定是页面还是小游戏
页面动画用 wx.createAnimation、样式过渡、canvas、换帧、有限度的 SVG,或 Lottie 播现成矢量。引擎和 Cocos、Laya 走小游戏发布。Three.js 只解决三维绘制,不把项目变成小游戏。cccc 先确认缩写。转盘要停在某一格上时,不要只写一条样式过渡就当作完成。
转盘不该先写引擎装饰器
页面里一次旋转可以用样式过渡,角度从 0 到某个值。要停在指定的一格,得先知道一圈有几格、每一格多少度,再算出最终角度。样本里的引擎转盘默认 8 个扇区,旋转持续 5 秒。角度是多转 5 圈,再加上 360 / 扇区数 * 随机扇区,用 tween 绕 Z 轴负方向,缓动名为 quadOut。isSpinning 为真时直接返回,避免叠上一次旋转。这套导入来自 cc。普通小程序页面没有这个模块,编译会停在导入,还没转到。对话接着写明:这段不能直接当普通小程序用,要按小游戏发布。用户要求导出成小程序之后,另一段改用 wx.createAnimation,时长 5000,timingFunction 写成 ease-out,同样多转 5 圈。扇区来自组件属性 sectors。图片尺寸写成 300 乘 300。旋转中按钮禁用。结束时用 spinend 把扇区交回页面。两套入口不要塞进同一个工程。Three.js 只在你需要三维网格时才加,转盘是二维的,对话没有要求三维。
Lottie 适合已经在别的工具里做好的矢量。转盘的停靠取决于这次点击的结果,不是一段固定动画。固定动画播完总停在同一帧,对不上随机或指定的那一格。帧动画同样是预先画好的序列。格子结果要变化时,用计算角度,不用换一套帧。
性能按对话的标准取舍。一个转盘的角度动画,canvas 每帧重画整张图,比改一次样式的旋转更重。没有粒子、碰撞和多对象时,不必上引擎。引擎带来的是场景管理,也带来小游戏的发布限制。需求只是“转一下并停下”,停在页面侧。
引擎样本的扇区结果用 randomSection + 1 打日志,从 1 数起。小程序样本把 sectors[randomSector] 交给 spinend,下标从 0 数起。两段的“第几格”差一。页面上的文案要和自己用的那一段对齐,不要混用加一之后的编号和原始下标。
小程序组件在 json 里用 usingComponents 声明 wheel 的路径。页面标签把 sectors 传成一个数组,并监听 spinend。样本数组是四条奖项文案。数组长度就是扇区数,角度用 360 / sectors.length。长度为 0 时除法没有意义,调用 spin 前要先有扇区。旋转中 disabled 绑在 isSpinning 上,和脚本里的提前返回是同一道闸。
Cocos 那段要求在编辑器里把转盘节点拖到 wheelNode。没有这个节点,tween 没有目标。小程序那段要求换掉图片路径 /path/to/wheel/image.png。路径留着占位,运行时图片空白,旋转仍会发生。先换图,再对角度。
页面侧的时长是 5000 毫秒,和 setTimeout 的等待相同。动画时间和解除 isSpinning 的时间必须一致。只改 duration、不改等待,按钮会提前或延后恢复。引擎侧用的是 spinDuration 字段,默认 5 秒,单位在 tween 的第一个参数里。两套的时间不要抄错单位。
导出成小程序时,对话给出的是自定义组件,而不是 cc 的类。脚本放在组件的 js 里,结构放在 wxml,尺寸放在 wxss。页面 json 用 usingComponents 指向组件路径。sectors 用数组传入,停稳后在页面里读 event.detail.sector。样本用 wx.showToast 把该扇区显示出来。这些接口属于小程序,不属于 Cocos 编辑器。若项目仍是引擎工程,贴进这套组件也编译不过。先选定一边。选小游戏,就保留 8 扇区、5 秒、多转 5 圈和 quadOut。选小程序,就保留 5000 毫秒、ease-out、同样多转 5 圈,并换掉占位图片路径。
页面动画和小游戏引擎是两条发布路径。简单变化用原生动画或样式。转盘要停在某一格上,就要算角度。引擎样本默认八个扇区、转五秒、多转五圈。小程序样本用原生动画,时长五秒,缓动不同,扇区来自传入的数组。引擎代码不能贴进普通小程序页面。用户要求导出成小程序时,应改用后一套组件,并换掉占位图片。两边都要挡住连点。编号从零还是从一开始,要和自己用的那一段一致,不要混用。



