You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

271 lines
7.0 KiB
Vue

1 year ago
<template>
<view class="tm-choujiang py-32">
<view class="tm-choujiang-theme-1 flex-center flex-col">
<view class="tm-choujiang-bg ">
<view
:animation="animationData"
class="tm-choujiang-bg-image"
:style="{
backgroundImage: `url(${them_data.bg})`
}"
></view>
<view :animation="animationData" class="tm-choujiang-bg-prod ">
<view
class="tm-choujiang-bg-cp text-red absolute text-align-center "
:style="{
width: intewidth,
height: inteheight,
transform: `rotate(${45 * (index + 1)}deg)`
}"
v-for="(item, index) in listData"
:key="index"
>
<tm-images v-if="item.img" :previmage="false" :width="60" :src="item.img"></tm-images>
<view class="mx-40" style="line-height: 1;">
<text v-if="item.name" class="text-size-xs ">{{ item.name }}</text>
</view>
</view>
</view>
<view class="flex-center tm-choujiang-point"><tm-images v-if="them_data.point" @click="clickImgPlay" :previmage="false" :width="120" :src="them_data.point"></tm-images></view>
</view>
<view class="tm-choujiang-pingtai flex-center"><tm-images v-if="them_data.dizuo" :previmage="false" :width="600" :src="them_data.dizuo"></tm-images></view>
</view>
</view>
</template>
<script>
/**
* 转盘抽奖
* @property {Number} theme-index = [] 默认0主题索引我已内置两套皮肤
* @property {Array} theme-list = [] 默认[已内置两套]主题列表数据已有两套
* @property {Boolean} disabled = [] 默认 false是否禁用
* @property {Boolean} disabledCenter = [] 默认 false是否禁用点中间图片开始
* @property {Number} duration = [] 默认 3000动画时长
* @property {Number} turns = [] 默认2转的圈数
* @property {Array} list = [] 默认 [测试的数据]奖品数据
* @property {Function} start 游戏开始时触发
* @property {Function} end 游戏结束触发并返回结果数组
* @example <tm-choujiang ></tm-choujiang>
*/
import tmImages from "@/tm-vuetify/components/tm-images/tm-images.vue"
export default {
components:{tmImages},
name: 'tm-choujiang',
props: {
themeIndex: {
type: Number,
default: 0
},
themeList: {
type: Array,
default: () => {
return [
{
bg: 'https://jx2d.cn/yuwuimages/choujiang_theme_1_0.png?k=9',
point: 'https://jx2d.cn/yuwuimages/choujiang_theme_1_1.png',
dizuo: 'https://jx2d.cn/yuwuimages/choujiang_theme_1_2.png'
},
{
bg: 'https://jx2d.cn/yuwuimages/choujiang_theme_2_0.png?k=9',
point: 'https://jx2d.cn/yuwuimages/choujiang_theme_2_1.png',
dizuo: 'https://jx2d.cn/yuwuimages/choujiang_theme_2_2.png'
}
];
}
},
disabled: {
type: Boolean,
default: false
},
// 动画时长
duration: {
type: Number,
default: 3000
},
turns:{
type:Number,
default:3
},
//是否禁用点中间图片开始。
disabledCenter:{
type: Boolean,
default: false
},
list: {
type: Array,
default: () => {
return [
{ name: '谢谢惠顾', gailv: 30, id: 1, img: 'https://jx2d.cn/yuwuimages/jiangping_2.png' },
{ name: '90', gailv: 10, id: 2, img: 'https://jx2d.cn/yuwuimages/jiangping_1.png' },
{ name: '135', gailv: 10, id: 3, img: 'https://jx2d.cn/yuwuimages/jiangping_2.png' },
{ name: '180', gailv: 10, id: 4, img: 'https://jx2d.cn/yuwuimages/jiangping_1.png' },
{ name: '225', gailv: 10, id: 5, img: 'https://jx2d.cn/yuwuimages/jiangping_2.png' },
{ name: '275', gailv: 10, id: 7, img: 'https://jx2d.cn/yuwuimages/jiangping_1.png' },
{ name: '315', gailv: 10, id: 8, img: 'https://jx2d.cn/yuwuimages/jiangping_2.png' },
{ name: '360', gailv: 10, id: 9, img: 'https://jx2d.cn/yuwuimages/jiangping_1.png' }
];
}
},
//默认返回真执行,否则不执行开始游戏。
playCallback:{
type:Function,
default:()=>{
return function(){
return true;
}
}
}
},
data() {
return {
animationData: '',
aniOff: true,
jiaodu_old:0,
listData: []
};
},
mounted() {
this.listData = this.list;
this.chuliganlv();
},
watch:{
list:{
handler(){
this.listData = this.list;
this.chuliganlv();
},
deep:true
}
},
computed: {
intewidth: function() {
if (!this.list.length) return 0;
return (uni.upx2px(400) * 3.14) / this.list.length + 'px';
},
inteheight: function() {
if (!this.list.length) return 0;
return uni.upx2px(400) / 2 + 'px';
},
them_index: function() {
return this.themeIndex;
},
them_data: function() {
return this.themeList[this.them_index];
}
},
methods: {
chuliganlv() {
var ml = new this.$tm.choujiang(this.listData);
let jieguo = ml.getResult();
let jd = 360 / this.listData.length;
let index = this.listData.findIndex(item => {
return item.id === jieguo.id;
});
return {
index: index,
data: this.listData[index],
jiaodu: 360 - (index + 1) * 45 + 180*(this.turns*2)
};
},
clickImgPlay(){
if (this.disabledCenter) return;
this.play(this.playCallback);
},
async play(callback) {
if (this.disabled) return;
if (!this.aniOff) {
console.warn('未结束动画,不能连续点击.');
return;
}
let isPlay = true;
if(typeof callback ==='function'){
isPlay = callback();
}
if(isPlay==false) return;
// 开始动画.
this.$emit('start');
let zhongjiang = this.chuliganlv();
this.$nextTick(async function() {
await this.resetInit();
this.animationData = '';
this.aniOff = false;
let duration = this.duration;
var animation = uni.createAnimation({
duration: duration,
timingFunction: 'ease'
});
this.animation = animation;
animation.rotate(zhongjiang.jiaodu).step();
this.animationData = animation.export();
await uni.$tm.sleep(duration);
// 结束动画.
this.aniOff = true;
this.$emit('end', this.listData[zhongjiang.index]);
});
},
// 重置 角度。
async resetInit() {
this.animationData = '';
var animation = uni.createAnimation({
duration: 0,
timingFunction: 'ease'
});
this.animation = animation;
animation.rotate(-45).step();
this.animationData = animation.export();
await uni.$tm.sleep(50);
}
}
};
</script>
<style lang="less" scoped>
.tm-choujiang {
.tm-choujiang-theme-1 {
.tm-choujiang-bg {
width: 600upx;
height: 600upx;
position: relative;
z-index: 2;
.tm-choujiang-bg-image {
width: 100%;
height: 100%;
background-repeat: no-repeat;
background-size: cover;
}
.tm-choujiang-point {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
}
.tm-choujiang-bg-prod {
position: absolute;
width: 400upx;
height: 400upx;
top: 100upx;
left: 100upx;
display: flex;
justify-content: center;
transform: rotate(0deg);
.tm-choujiang-bg-cp {
transform-origin: center bottom;
}
}
}
.tm-choujiang-pingtai {
position: relative;
z-index: 1;
margin-top: -120upx;
}
}
}
</style>