使用Tween.js实现精确控制的转盘抽奖功能
创作时间:
作者:
@小白创作中心
使用Tween.js实现精确控制的转盘抽奖功能
引用
CSDN
1.
https://m.blog.csdn.net/m0_38082783/article/details/138854230
实现效果
需求分析
- 与传统的指针式转盘抽奖不同,本实现要求奖品必须刚好停留在奖品的位置,不能随机停止。
- 通过上图可以看出,转盘需要精确控制转动角度,以确保奖品能够准确对齐。
常见转盘抽奖实现
常见的转盘抽奖实现方式包括九宫格抽奖和传统的指针式转盘抽奖。本实现将采用Tween.js库来实现精确的动画控制。
使用库
- Tween.js:一个轻量级的JavaScript动画库,支持多种缓动函数。
- 张鑫旭大佬实现的动画函数算法库
引入 Tween.js 算法库
<script src="./js/tween.js"></script>
<script src="./js/animation.js"></script>
HTML 布局
转盘抽奖界面由转盘图片、指针图片和开始按钮组成。
<div class="rui-game-luck-content">
<img src="./images/game_luck.png"
:style="`transform: translate(-50%, -50%) rotate(${angleNumber}deg)`"
:data-id="angleNumber"
id="turntable"
class="rui-game-luck-img" alt="转盘图片">
<img src="./images/game_check.png" style="z-index: 10;" class="rui-game-luck-img" alt="指针图片">
<img src="./images/game_btn.png" @click="drawLuck" class="rui-game-luck-btn" alt="开始按钮">
</div>
CSS 实现
.rui-game-luck-content{
width: 5.38rem;
height: 5.38rem;
position: relative;
margin: 1.55rem auto 0.35rem;
}
.rui-game-luck-img{
width: 5.38rem;
height: 5.38rem;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.rui-game-luck-btn{
width: 2.26rem;
height: 2.26rem;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 12;
}
点击旋转动画实现
抽奖功能通过Vue框架实现,主要步骤包括:
- 申明一个Lock锁,用于防止抽奖时的重复点击;
- 抽奖的各个变量申明;
- 抽奖次数已用完判断;
- 判断锁是否生效;
- 生成0到5之间的随机整数;
- 计算最后的角度;
- 转盘旋转动画;
- 抽奖次数减少;
- 显示遮罩层中奖奖品;
- 记录上一次转动最终角度。
const lock = new Lock();
var app = new Vue({
el: "#app",
data: {
show: false, // 遮罩层
luckNumber: 0, // 中奖位置
luckList: ['成长快乐','笑口常开','健康活泼','成长快乐','笑口常开','健康活泼'], // 奖品列表
angleNumber: 0, // 转盘旋转角度
drawNumber: 3, // 抽奖次数
recordPrevAngle: 0, // 上一次转动最终角度
drawOverMask: false, // 抽奖次数已用完遮罩层
},
methods: {
// 再抽一次
drawAgainLuck(){
this.show = false;
this.drawLuck();
},
// 抽奖
drawLuck(){
// 抽奖次数已用完
if(this.drawNumber <= 0){
this.drawOverMask = true;
return false;
}
// 判断锁是否生效
if(lock.isLocked){
return false;
}
// 获取锁
lock.acquire();
let _this = this;
let prevLuckAngle = this.luckNumber * 60;
// 生成0到5之间的随机整数
let randomNum = Math.floor(Math.random() * this.luckList.length);
this.luckNumber = randomNum;
// 计算最后的角度
let endAngle = 360 * 20 + _this.luckNumber * 60 - prevLuckAngle;
// 转盘旋转动画
Math.animation(_this.recordPrevAngle, _this.recordPrevAngle + endAngle, 5000, 'Cubic.easeInOut',function(value, isEnding) {
_this.angleNumber = value;
if(isEnding){
lock.release(); // 释放锁
// 抽奖次数减少
_this.drawNumber--;
// 显示遮罩层中奖奖品
_this.show = true;
// 记录上一次转动最终角度
_this.recordPrevAngle += endAngle;
console.log(_this.luckList[_this.luckNumber])
}
})
}
}
});
总结
- 使用Tween.js库可以大大简化动画实现的复杂度,提高开发效率。
- 本实现方案适用于不需要异步中奖结果的场景。如果需要异步中奖,可以考虑使用多个动画配合实现。
- 同一个需求可以有多种实现方式,选择最适合自己的方案是关键。
热门推荐
心慌最快的恢复方法
名中医丁书文:心血管健康的守护者,心系疾病热毒学说的开创者
现代社会中焦虑的来源与应对方法
《中国妇女》微调查:择偶“硬杠杠”其实都是“软实力”
首航新能三年上市路:从35亿募资缩水至12亿,多重挑战考验未来发展
厨房里的化学家:闻起来香,吃起来呢?
交领右衽邂逅长安古建:一场“穿在身上的文化行走”
纪录片《寻护者》暖心收官,真实呈现中华穿山甲救护保护全过程
居家办公久了,收藏这份健康攻略,学习正确坐姿
女生体味重但不是狐臭怎么办?
2024广东高考本科投档结果公布,高校排名呈现新格局
解读思想实验“薛定谔的猫”,为什么会出现“既死又活”的猫
2024男生秋冬潮流穿搭,这3套保暖又帅气,值得尝试!
青春·力量丨听,刚入警的“00”后“小萌新”们说……
我们需要像担心“预制菜”那样担心通过试管婴儿技术出生的“预制宝宝”吗?
岭南画派纪念馆“上新”,多维呈现岭南中国画的现代转型之路
高血糖者注意:这些器官正在被高糖 “侵蚀”,要抓紧自救!
武术难以实战?最大的问题是“知行不合一”
“偏见”之外,真实的南非比想象中更美
风水学的核心理论及其实践应用
河南十大经典名菜:道道经典,色香味俱全
为学生设计的 10 个思维导图创意及其益处
数据可视化的十大热门应用领域
MBTI的局限性、火爆原因与可靠性问题
如何计算黄金的价值?这种计算方法在实际交易中有何应用?
博鳌报告:亚洲多数股指或在频繁波动中上涨,主要经济体汇率预计将保持总体稳定
怎样知道一个人是君子还是小人?
长沙麓山寺碑:历史、文化与书法艺术的深度解析
解决安卓手机系统更新困难:深度分析及解决策略,保障设备稳定性与安全性
茶道,一期一会,会者定离,难得一面,世当珍惜