七夕-又到了在女朋友面前秀技术的时刻

废话放前面

欢迎关注【牛马圈】,专注于技术知识分享的宝藏公众号!分享解决方案、高效工具,以及独家项目源码。有任何技术问题,都可添加我的微信好友,共同探讨交流。分享的资源在小程序里,需要观看广告后获取,如不喜欢这种方式,也可添加我的微信好友直接获取。希望持续关注,持续受益。

转盘小游戏

情侣转盘小游戏是一款充满趣味与互动的桌面游戏,专为情侣或亲密关系中的双方设计。游戏以增进感情、了解彼此为宗旨,通过轻松愉快的游戏氛围,让双方在游戏中感受爱情的甜蜜与温馨。

技术栈

uniApp + Vue

核心功能

组件封装

// turntable
<template>
 <view class="base_roulette _div">
  <view class="game_wrap _div">
   <view class="game_inner _div" :style="'transform: rotate('+ctrl.rotate+'deg);transform-origin: center center;'">
    <view class="roul_1 _div">
    </view>
    <view class="roul_2 _div" :style="ctrl.borderStyle">
    </view>
    <view class="items _div" v-for="(item, index) in cardList" :key="index"
     :style="'transform: translate(0%,-50%) rotate('+item.rotate+'deg) ;transform-origin: left center'">
     <text class="_span" :class="'text_color_'+index%4+' max'+item.text.length"
      @click.stop="open(item, index)">{{item.text}}</text>
    </view>
    <!-- <image class="roll_btn pos_center_center _div" src="../../static/images/playbtn.png" @click="startRoll"></image> -->
    <button class="roll_btn pos_center_center _div" type="default" style="font-size: 48rpx;line-height: 3.555556;"
     @click="startRoll">Start</button>
   </view>
  </view>
  <view class="show_res _div" v-if="result">
   <text class="_span">{{result.text}}</text>
  </view>
  <content-pop v-if="show" :show="show" :content="content" :index="index" @set="set"></content-pop>
 </view>
</template>

<script>
 import ContentPop from '@/components/content-pop/index.vue'
 export default {
  name: 'Turntable',
  components: {
   ContentPop
  },
  props: {
   configList: {
    type: Array,
    default: () => ([])
   }
  },
  watch: {
   configList: {
    handler(newVal, oldVal) {
     this.cardList = newVal
    },
    deep: true
   }
  },
  data() {
   return {
    cardList: this.configList,
    ctrl: {
     loading: false,
     isOver: true,
     rotate: 0,
     borderStyle: '',
     borderLightStyle: 0,
    },
    result: null,
    show: false,
    content: null,
    index: 0
   }
  },
  methods: {
   async startRoll() {
    if (this.ctrl.loading) {
     return
    }
    this.ctrl.loading = true
    this.result = null
    this.ctrl.isOver = false

    let randomIndex = this.getRandomNumber(0, 15)
    let rotateAngle = this.configList[randomIndex].rotate
    let config = this.configList[randomIndex]

    rotateAngle = rotateAngle <= 270 ? 270 - rotateAngle : 360 - rotateAngle + 270

    let count = 0
    let totalRotate = 720 + rotateAngle - this.ctrl.rotate
    let currentRotate = 0
    let speed = 12

    while (!this.ctrl.isOver) {
     if (Math.abs(currentRotate - totalRotate) < 25) {
      // 根据角度差值设置样式

      this.ctrl.borderStyle = "box-shadow: 0 0 ".concat(this.getRandomNumber(2, 12), "px ").concat(this
       .getRandomColor())
     } else if (Math.abs(currentRotate - totalRotate) < 70) {
      this.ctrl.borderStyle = "box-shadow: 0 0 ".concat(this.getRandomNumber(5, 25), "px ").concat(this
       .getRandomColor())
     } else if (Math.floor(currentRotate) % 30 < 5) {
      this.ctrl.borderStyle = "box-shadow: 0 0 ".concat(this.getRandomNumber(30, 100), "px ").concat(this
       .getRandomColor())
     }

     count++

     if (currentRotate > 360) {
      speed = 11
     }

     this.ctrl.rotate = (this.ctrl.rotate + speed) % 360
     currentRotate += speed

     if ((Math.abs(currentRotate - totalRotate) <= 1 || currentRotate - totalRotate > 0)) {
      this.ctrl.isOver = true
      this.ctrl.loading = false
      this.result = config
     }
     await this.awaitTimes(36)
    }
   },
   getRandomNumber(t, e) {
    return Math.floor(Math.random() * (e - t + 1) + t)
   },
   getRandomColor() {
    var t = "#" + (16777215 * Math.random() << 0).toString(16)
    return 6 === t.length && (t += 0), t
   },
   awaitTimes(t) {
    return new Promise(function(e) {
     setTimeout(function() {
      e()
     }, t)
    })
   },
   open(data, i) {
    this.show = true
    this.content = data
    this.index = i
   },
   set() {
    this.show = false
    this.$emit('set')
   }
  }
 }
</script>

<style lang="less" scoped>
 // ...
</style>

功能预览

首页

alt

转动结果

alt

设置模式

alt

源码

源码在小程序搜“转盘小游戏”自行获取

公众号: 牛马圈
小程序: 牛马圈分享

alt

话题

你认为爱情需要经营吗?

本文由 mdnice 多平台发布

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值