“打工搬砖记”中吃什么的轮盘功能实现(二)

news2024/11/17 7:24:59

文章目录

    • 打工搬砖记
    • 转盘主要的逻辑实现
    • 转盘的素材
    • 小结

打工搬砖记

先来一个吃什么轮盘的预览图,这轮盘文案加字呈圆形铺出来,开始后旋转到指定的选项处停下来。
已上线小程序“打工人搬砖记”,可以扫码进行预览观看。
请添加图片描述
请添加图片描述

转盘主要的逻辑实现

1、通过绑定style绑定值为“prizeBoxStyle”,设置每个选项的颜色以及后续转盘转动需要操作这个值。
2、通过绑定style绑定值为“prizeStyle”,然后通过“rotateAngle()”方法计算出总共有几个选项,然后算出每个选项需要旋转的角度。
3、通过“totalRunAngle()”计算出转盘最后需要转动角度,所以说游戏在开始的一瞬间就程序就已经知道,抽中的是那一个。
4、为了使转盘有声音就使用“uni.createInnerAudioContext()”来创建音乐,这个地方需要注意的是,如果想要后续“.stop()”停下音乐,在创建的时候一定不要设置为自动播放,就是说“autoplay = false”。

具体代码如下:

<template>
	<view>
		<image src="../../static/lunch/lunchBcg.jpg" class="bcgImg" mode=""></image>
		<view class="container">
			<view class="container-title"></view>

			<view class="prize-box-relative">
				<view class="prize-box">
					<view class="prize-list" ref="prizeWrap" :style="prizeBoxStyle">
						<div class="prize-item" v-for="(item, index) in prizeList" :style="[prizeStyle(index)]">
							<text>{{ item }}</text>
						</div>
					</view>
				</view>
			</view>
			<image @click="openGame()" src="../../static/lunch/turntable.png" class="turntableImg" mode=""></image>
		</view>

		<!-- 弹框 :抽中要吃的-->
		<view v-show="tipShow" class="tip_box">
			<view class="tip_content">
				<image src="../../static/lunch/tip.png" class="tip_img" mode=""></image>
				<view class="tip_txt">
					{{prizeList[prizeId] }}
				</view>
				<view class="tip_btn" @click="tipShow = false"></view>
			</view>
		</view>
	</view>
</template>

<script>
	import {
		turnList
	} from 'config/api.js';
	export default {
		data() {
			return {
				// colorList: ['#f69602', '#f8ca41', '#ffe7c9','#afe2ec'],
				colorList: ['#fe9539', '#fadf94', '#5fcbd1', '#ffffff'],
				prizeList: ["豆浆", "胡辣汤", "韭菜鸡蛋韭菜鸡蛋", "奖品4", "奖品5", "奖品6", "奖品4", "奖品5", "奖品6"],
				isRunning: false, // 是否正在抽奖
				baseRunAngle: 360 * 5, // 总共转动角度 至少5圈
				prizeId: 0, // 中奖id
				rotatePrize: 40,
				tipShow: false,
				prizeBoxStyle: '',
				audioMusic: '',
			}
		},
		onLoad() {
			this.getPrizeList()
			uni.$on('updateTurn', (data) => {
				this.getPrizeList()
			})
		},
		methods: {
			getPrizeList() {
				turnList({
					data: {
						eatType: this.activeMenu
					},
					custom: {
						auth: true,
						toast: false,
						catch: true
					}
				}).then((res) => {
					let arr = []
					res.map(value => {
						arr.push(value.name)
					})
					this.prizeList = arr
					this.rotatePrize = 360 / arr.length
					this.prizeBoxStyle = this.bgColor()
					this.initGame()
				})
			},
			// 初始化转盘游戏
			initGame() {
				this.rotateAngle()
			},
			// 开始游戏
			openGame() {
				this.startGame()
			},
			// 开始游戏
			startGame() {
				if (!this.isRunning) {
					this.isRunning = true
					this.prizeId = this.getRandomNum()
					this.startRun()
				}
			},
			// 游戏运行
			startRun() {
				this.prizeBoxStyle = `${this.bgColor()} transform: rotate(${this.totalRunAngle()}deg);transition: all 4s ease;`

				this.audioMusic = uni.createInnerAudioContext();
				this.audioMusic.autoplay = false;
				this.audioMusic.startTime = 2;
				this.audioMusic.sessionCategory = 'ambient';
				this.audioMusic.src = '/static/lunch/music01.mp3';
				this.audioMusic.play();
				setTimeout(() => {
					this.audioMusic.stop()
					this.audioMusic.destroy()
					this.audioMusic = null
				}, 3700)


				this.playAudio()
				setTimeout(() => {
					this.tipShow = true
					this.isRunning = false
					this.prizeBoxStyle = `${this.bgColor()} transform: rotate(${this.totalRunAngle() - this.baseRunAngle}deg);`
				}, 4000)
			},
			getRandomNum() {
				const num = Math.floor(Math.random() * this.prizeList.length)
				return num
			},
			// 平均每个奖品角度
			rotateAngle() {
				this.rotatePrize = 360 / this.prizeList.length
			},
			// 奖品布局
			prizeStyle(i) {
				let _degree = this.rotatePrize
				let style = {}

				style.width = 2 * 130 * Math.sin(_degree / 2 * Math.PI / 180) + 'px'
				style.height = '130px'
				style.transform = `rotate(${_degree * i + _degree / 2}deg)`
				style.transformOrigin = '50% 100%'

				return style
			},
			// 计算绘制转盘背景
			bgColor() {
				let colorVal = ''
				for (let i = 0; i < this.prizeList.length; i++) {
					colorVal += `${this.colorList[i % 4]} ${this.rotatePrize * i}deg ${this.rotatePrize * (i + 1)}deg,`
				}
				return ` background: conic-gradient(${colorVal.slice(0, -1)});transform: rotate(-${this.rotatePrize/2}deg); `
			},

			// 要执行总转角度数
			totalRunAngle() {
				return this.baseRunAngle + 360 - this.prizeId * this.rotatePrize - this.rotatePrize / 2
			},
			// 转盘停下来时的声音
			playAudio() {
				setTimeout(() => {
					const innerAudioContext = uni.createInnerAudioContext();
					innerAudioContext.autoplay = true;
					innerAudioContext.sessionCategory = 'ambient';
					innerAudioContext.src = '/static/lunch/music.mp3';
					innerAudioContext.onPlay();
				}, 3800)
			}

		}
	}
</script>

<style lang="scss">
	.bcgImg {
		position: fixed;
		width: 750rpx;
		height: 100vh;
	}

	.container {
		position: relative;
		width: 660rpx;
		height: 660rpx;
		margin: 0 auto;
	}

	.container-title {
		font-size: 56rpx;
		font-weight: bold;
		color: #FFFFFF;
		text-align: center;
		line-height: 160rpx;
		height: 160rpx;
		letter-spacing: 20px;
	}

	.turntableImg {
		width: 100%;
		height: 100%;
		position: absolute;
		top: 160rpx;
	}



	.prize-box-relative {
		width: 100%;
		height: 100%;
		display: flex;
		align-items: center;
		justify-content: center;
	}

	.prize-box {
		width: 300px;
		height: 300px;
		position: relative;
	}

	.prize-list {
		width: 100%;
		height: 100%;
		border-radius: 50%;
		overflow: hidden;
	}

	.prize-item {
		/*border: 2px solid red;*/
		position: absolute;
		left: 0;
		right: 0;
		top: 20px;
		margin: auto;
		text-align: center;
	}

	.prize-item text {
		display: flex;
		align-items: center;
		writing-mode: vertical-rl;
		color: #333333;
		font-size: 26rpx;
		font-weight: bold;
		text-align: center;
		line-height: 20px;
		width: 100%;
	}

	.tip_box {
		z-index: 10;
		position: fixed;
		top: 0;
		width: 100%;
		height: 100vh;
		background: rgba(0, 0, 0, 0.5);
		display: flex;
		align-items: center;
		justify-content: center;
	}

	.tip_content {
		position: relative;
	}

	.tip_img {
		width: 640rpx;
		height: 480rpx;
	}

	.tip_txt {
		position: absolute;
		top: 160rpx;
		width: 600rpx;
		text-align: center;
		font-weight: bold;
		font-size: 38rpx;
	}

	.tip_btn {
		position: absolute;
		bottom: 60rpx;
		left: 210rpx;
		width: 200rpx;
		height: 100rpx;
	}


	.food_menu_list {
		position: fixed;
		bottom: 100rpx;
		width: 710rpx;
		padding: 50rpx 20rpx;
		display: flex;
		flex-wrap: wrap;
		font-size: 26rpx;
		color: #999999;
		font-weight: bold;

		.menu_box {
			margin: 0 10rpx;
			width: 174rpx;
			background: rgba(244, 244, 244, 0.6);
			box-shadow: 0 0 10rpx #FFFFFF;
			display: flex;
			align-items: center;
			padding: 20rpx;
			border-radius: 10rpx;
			margin-bottom: 30rpx;

			.menu_img {
				width: 40rpx;
				height: 40rpx;
				margin-right: 10rpx;
			}
		}

		.menu_active {
			color: #53851b;
			background: #f4f4f4;
			box-shadow: 0 0 10rpx #f4f4f4;
		}


		.menu_btn {
			font-size: 36rpx;
			color: #ffffff;
			line-height: 80rpx;
			text-align: center;
			width: 100%;
			border-radius: 10rpx;
			border: 2rpx #FFFFFF solid;
		}
	}
</style>

转盘的素材

我发现穿上后好像就成为了jpg格式了,注意转盘哪个一定要是png格式的,不然会把转盘的内容给覆盖住,音乐和背景图的话就自己找找吧!
请添加图片描述
请添加图片描述

小结

总的来说实现过程不难,难的是思路以及行动力。加油打工人!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1676347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springMVC基础使用(示例)

maven依赖&#xff08;javax.servlet-api版本与spring-webmvc班恩要匹配不然会报java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRespons&#xff09;&#xff1a; <dependencies><dependency><groupId>javax.servlet</groupId><arti…

Java面试题:ConcurrentHashMap

ConcurrentHashMap 一种线程安全的高效Map集合 jdk1.7之前 底层采用分段的数组链表实现 一个不可扩容的数组:segment[] 数组中的每个元素都对应一个HashEntry数组用以存放数据 当放入数据时,根据key的哈希值找到对应的segment数组下标 找到下标后就会添加一个reentrantlo…

Open AI再次定义AI PC?

从传统的文字交互&#xff0c;到语音和图像交互——Open AI再次提升了人们对AI PC的想象空间。 这种更贴近人类间交互的模式&#xff0c;会多大程度改变目前PC的生态&#xff1f; 随着苹果M4芯片、高通骁龙X的发布&#xff0c;AI PC也逐渐成为了市场热议的产品。 从各家PC厂…

OpenAI 深夜发布 GPT-4o,完全免费,强到让人恐怖,这还是AI?!又一批人将面临失业...

文章首发于公众号&#xff1a;X小鹿AI副业 大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 看了 OpenAI 最新的…

算法-卡尔曼滤波之卡尔曼滤波的其他三个方程

一维不带噪声的卡尔曼滤波方程有五个&#xff0c;下面分析剩余的三个方程&#xff1a; 分析第一个例子&#xff0c;其中测量值和真实值之间的误差属于测量误差&#xff08;使用准确性来描述&#xff09;&#xff0c;由于测量误差是随机的&#xff0c;我们可以使用方差来描述&am…

电力物联网-(2)系统设计

电力物联网系统设计 前言 在此之前写过《电力物联网系统设计》开篇文章&#xff0c;上一篇文章主要的概述性的内容&#xff0c;发表之后总觉得对电力物联网系统设计这一方面还只是开了一个头&#xff0c;没有把相关的内容讲解清楚&#xff0c;于是经过一段时间的构思终于产出了…

DTAS 尺寸公差分析及尺寸链计算-建模神器 — 用户DIY装配

工业互联网&#xff08;工业4.0) 是未来智能制造的核心&#xff0c;工业软件是智能制造的灵魂。 相关工业软件及系统的自主研发是智能制造和质量升级转型亟需解决的卡脖子环节&#xff0c;而公差分析软件系统是前期质量研发精准设计、降本增效的关键。 数字化时代&#xff0…

【windows小知识#1】ISO镜像,OEM、Retail这些到底是什么意思

汇总一下每个版本windows会衍生哪些镜像出来&#xff0c;以windows7为例 这些文件名代表的是不同版本和不同语言的Windows 7操作系统的安装光盘映像&#xff08;ISO文件&#xff09;。这些文件主要区分为以下几个方面&#xff1a; 语言&#xff1a;这些文件都是中文版&#x…

算法学习笔记(一)-快速幂

#问题的引入-对于幂次方的求解我们怎么可以最大限度的降低时间复杂度呢 #对于一个基本的幂次运算&#xff0c;c代码如下示例 long long int myPower(int base,int power) {long long int result 1 ;for (int i 1 ; i < power ; i){result * base ;}return result ; } #…

架构每日一学 6:作为架构师,你必须学会寻找商业模式

本文首发于公众平台&#xff1a;腐烂的橘子 在前面的文章中&#xff0c;我们已经讲了架构师的两条生存法则&#xff0c;第一条是有且仅有一个目标&#xff0c;感兴趣的可以看一下原文&#xff1a; 架构每日一学 2&#xff1a;架构师六个生存法则之一&#xff1a;架构必须有且仅…

IC卡16个扇区详解:揭秘智能卡的存储结构

目录标题 IC卡的基本结构扇区的划分扇区的功能扇区的安全性扇区的应用NFC卡和IC卡&#xff0c;从外观怎样区分总结 在智能卡的世界里&#xff0c;IC卡&#xff08;Integrated Circuit Card&#xff09;以其安全性和便捷性成为了现代生活中不可或缺的一部分。无论是用于支付、身…

【讲解下iCloud如何高效利用】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【算法】二分查找——二分查找

本节博客详述“二分查找”并且以例子来进行讨论&#xff0c;有需要借鉴即可。 目录 1.二分查找1.1使用前提1.2模板 2.题目3.题解代码示例4.二分查找的一般模板5.总结 1.二分查找 1.1使用前提 使用的条件&#xff1a;数组具有“二段性”&#xff0c;二段性指的是数组可以根据某…

2024 年 4 月区块链游戏研报:市场低迷中活跃用户数创新高

2024 年 4 月区块链游戏研报 作者&#xff1a;stellafootprint.network 数据来源&#xff1a;GameFi 研究页面 2024 年 4 月&#xff0c;Web3 游戏领域在经历 3 月创纪录的表现后&#xff0c;迎来了显著波动。比特币自历史高位回调&#xff0c;月跌幅达到 10.4%。与此同时&a…

详细分析Vue3中的ref(附Demo)

目录 前言1. 基本知识2. Demo 前言 由于新项目涉及Vue3&#xff0c;本着探究问题的本质研究所不会的疑问 1. 基本知识 ref 是 Vue 3 中用于创建响应式数据的函数 接收一个初始值并返回一个包含了该值的响应式引用对象与 Vue 2.x 中的 data 属性不同&#xff0c;ref 返回的是…

Navicat Premium安装pojie版

下载、安装mysql&#xff0c;环境变量配置 1、官网下载mysql&#xff1a;https://www.mysql.com/downloads/ 下载成功&#xff0c;进行安装 一直点下一步 验证&#xff0c;开始中搜索mysql 说明安装成功 环境变量配置 默认安装路径C:\Program Files\MySQL …

2024年高考倒计时精品网页

2024年高考倒计时精品网页 前言效果图部分代码领取源码下期更新预报 前言 随着季风轻轻掠过&#xff0c;岁月如梭&#xff0c;再次迎来了这个属于青春与梦想交汇的时刻——高考。这是一场知识的较量&#xff0c;更是一次意志的考验。在这最后的冲刺阶段&#xff0c;每一刻都显…

Vision Mamba 代码调试---Pycharm+AutoDL

《AutoDL使用手册》 1. 服务器租用与配置 先上项目链接&#xff1a; GitHub - hustvl/Vim: Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 1.1 服务器租用与配置 根据环境要求&#xff0c;去租一个服务器&#xff1a;AutoDL算…

一文读懂通用漏洞评分系统CVSS4.0:顺带理清CVE、CWE及其与CVSS之间的关系

事件响应和安全团队论坛 (FIRST&#xff0c;Forum of Incident Response and Security Teams) 于 2023 年 11 月 1 日正式推出第四版通用漏洞评分系统 (CVSS 4.0&#xff0c;Common Vulnerability Scoring System version 4.0)。CVSS 4.0 是评估计算机系统安全漏洞严重性的行业…

初次查询大数据信用报告,需要注意哪些问题?

随着大数据的普及&#xff0c;基于大数据技术的大数据信用也变得越来越重要&#xff0c;比如在申贷之前&#xff0c;不少地方都会查询申贷人的大数据信用&#xff0c;作为风险控制的必要手段&#xff0c;那对于初次查询大数据信用报告的人来说&#xff0c;需要注意哪些问题呢?…