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.

318 lines
9.1 KiB
Vue

1 year ago
<template>
<view class="tm-choujiangGrid">
<view class="tm-choujiangGrid-bg"
:style="{
backgroundImage: `url(${them_data.bg})`
}"
>
<view v-if="listData.length==8" class="tm-choujiangGrid-con">
<view v-for="(item,index) in 3" :key="index" class="tm-choujiangGrid-grid">
<block v-if="index==0">
<view class="tm-choujiangGrid-item">
<view class="tm-choujiangGrid-item-img flex-center">
<tm-images :width="100" :src="listData[0].img"></tm-images>
</view>
<view :class="{on:(aniOff==false&&active==0)||(choujiangJieGuo&&aniOff&&active==0)}" class="tm-choujiangGrid-item-hover"></view>
</view>
<view class="tm-choujiangGrid-item">
<view class="tm-choujiangGrid-item-img flex-center">
<tm-images :width="100" :src="listData[1].img"></tm-images>
</view>
<view :class="{on:(aniOff==false&&active==1)||(choujiangJieGuo&&aniOff&&active==1)}" class="tm-choujiangGrid-item-hover"></view>
</view>
<view class="tm-choujiangGrid-item">
<view class="tm-choujiangGrid-item-img flex-center">
<tm-images :width="100" :src="listData[2].img"></tm-images>
</view>
<view :class="{on:(aniOff==false&&active==2)||(choujiangJieGuo&&aniOff&&active==2)}" class="tm-choujiangGrid-item-hover"></view>
</view>
</block>
<block v-if="index==1">
<view class="tm-choujiangGrid-item">
<view class="tm-choujiangGrid-item-img flex-center">
<tm-images :width="100" :src="listData[7].img"></tm-images>
</view>
<view :class="{on:(aniOff==false&&active==7)||(choujiangJieGuo&&aniOff&&active==7)}" class="tm-choujiangGrid-item-hover"></view>
</view>
<view @click="clickImgPlay" class="tm-choujiangGrid-item">
<view class="tm-choujiangGrid-item-img flex-center tm-choujiangGrid-item-point">
<tm-images :width="140" :src="them_data.point"></tm-images>
</view>
<view class="tm-choujiangGrid-item-hover"></view>
</view>
<view class="tm-choujiangGrid-item">
<view class="tm-choujiangGrid-item-img flex-center">
<tm-images :width="100" :src="listData[3].img"></tm-images>
</view>
<view :class="{on:(aniOff==false&&active==3)||(choujiangJieGuo&&aniOff&&active==3)}" class="tm-choujiangGrid-item-hover"></view>
</view>
</block>
<block v-if="index==2">
<view class="tm-choujiangGrid-item">
<view class="tm-choujiangGrid-item-img flex-center">
<tm-images :width="100" :src="listData[6].img"></tm-images>
</view>
<view :class="{on:(aniOff==false&&active==6)||(choujiangJieGuo&&aniOff&&active==6)}" class="tm-choujiangGrid-item-hover"></view>
</view>
<view class="tm-choujiangGrid-item">
<view class="tm-choujiangGrid-item-img flex-center">
<tm-images :width="100" :src="listData[5].img"></tm-images>
</view>
<view :class="{on:(aniOff==false&&active==5)||(choujiangJieGuo&&aniOff&&active==5)}" class="tm-choujiangGrid-item-hover"></view>
</view>
<view class="tm-choujiangGrid-item">
<view class="tm-choujiangGrid-item-img flex-center">
<tm-images :previmage="false" :width="100" :src="listData[4].img"></tm-images>
</view>
<view :class="{on:(aniOff==false&&active==4)||(choujiangJieGuo&&aniOff&&active==4)}" class="tm-choujiangGrid-item-hover"></view>
</view>
</block>
</view>
</view>
</view>
</view>
</template>
<script>
/**
* 转盘抽奖
* @property {Number} theme-index = [] 默认0主题索引我已内置两套皮肤
* @property {Array} theme-list = [] 默认[已内置两套]主题列表数据已有两套
* @property {Boolean} disabled = [] 默认 false是否禁用
* @property {Number} duration = [] 默认 3000动画时长
* @property {Boolean} disabledCenter = [] 默认 false是否禁用点中间图片开始
* @property {Number} turns = [] 默认 2转的圈数
* @property {Number} specify = [] 默认 null为整数时即可指定奖品始终中奖保持在这个位置
* @property {Array} list = [] 默认 [测试的数据]奖品数据
* @property {Function} start 游戏开始时触发
* @property {Function} end 游戏结束触发并返回奖品数据
* @example <tm-choujiangGame ></tm-choujiangGame>
*/
import tmImages from "@/tm-vuetify/components/tm-images/tm-images.vue"
export default {
components:{tmImages},
name: 'tm-choujiangGrid',
props: {
themeIndex: {
type: Number,
default: 0
},
themeList: {
type: Array,
default: () => {
return [
{
bg: 'https://jx2d.cn/yuwuimages/choujiangGrid_1.png?k=9',
point: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_0.png'
},
{
bg: 'https://jx2d.cn/yuwuimages/choujiangGrid_2.png?k=9',
point: 'https://jx2d.cn/yuwuimages/choujiangGrid_2_0.png'
}
];
}
},
disabled: {
type: Boolean,
default: false
},
//是否禁用点中间图片开始。
disabledCenter:{
type: Boolean,
default: false
},
// 动画时长
duration: {
type: Number,
default: 100
},
list: {
type: Array,
default: () => {
return [
{ name: '1', gailv: 30, id: 1, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_1.png' },
{ name: '2', gailv: 10, id: 2, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_2.png' },
{ name: '3', gailv: 10, id: 3, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_1.png' },
{ name: '4', gailv: 10, id: 4, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_2.png' },
{ name: '5', gailv: 10, id: 5, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_2.png' },
{ name: '6', gailv: 10, id: 7, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_1.png' },
{ name: '7', gailv: 10, id: 8, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_1.png' },
{ name: '8', gailv: 10, id: 9, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_2.png' }
];
}
},
// 转的圈数。
turns:{
type:Number,
default:2
},
//指定中奖的奖品数组索引从0开始
specify:{
type:Number,
default:null
}
},
data() {
return {
aniOff: true,
active:0,
choujiangJieGuo:null,
listData: [],
timeid:8564
};
},
mounted() {
this.listData = this.list;
},
destroyed() {
clearTimeout(this.timeid)
},
computed: {
them_index: function() {
return this.themeIndex;
},
them_data: function() {
return this.themeList[this.them_index];
}
},
methods: {
clickImgPlay(){
if (this.disabledCenter) return;
this.play();
},
chuliganlv() {
var ml = new this.$tm.choujiang(this.listData);
let zhongle = [];
let xh = ml.getResult();
let index = 0
for(let j=0;j<this.listData.length;j++){
if(this.listData[j].id === xh.id){
index = j;
break;
}
}
let cisu = (this.listData.length-1)*this.turns+this.turns*2 + (this.specify!==null?this.specify:index);
zhongle = {
index:index,
data:xh,
playNum:cisu
}
return zhongle;
},
play() {
let t = this;
if (this.disabled) return;
if (!this.aniOff) {
console.warn('未结束动画,不能连续点击.');
return;
}
// 开始动画.
this.$emit('start');
this.choujiangJieGuo = null;
let zhongjiang = this.chuliganlv();
this.$nextTick(function() {
this.aniOff = false;
let duration = this.duration;
let playcCisu = 0; //总次数的序列。
// 循环的内部索引.
let nbIndex = 0;
function aniOpen(){
if(nbIndex>t.listData.length-1){
nbIndex = 0;
t.active = nbIndex;
}else{
t.active = nbIndex;
nbIndex += 1;
}
clearTimeout(t.timeid);
t.timeid = setTimeout(function() {
playcCisu +=1;
if(playcCisu > zhongjiang.playNum){
t.$emit('end',{index:zhongjiang.index,data:zhongjiang.data})
t.choujiangJieGuo = zhongjiang;
t.aniOff = true;
}else{
aniOpen();
}
}, duration);
}
aniOpen();
});
},
}
};
</script>
<style lang="less" scoped>
.tm-choujiangGrid {
overflow: hidden;
.tm-choujiangGrid-bg{
width:600upx;
height: 600upx;
position: relative;
margin: auto;
background-repeat: no-repeat;
background-size: cover;
.tm-choujiangGrid-con{
position: absolute;
width: 450upx;
height: 450upx;
top: 75upx;
left: 75upx;
.tm-choujiangGrid-grid{
display: flex;
justify-content: space-between;
.tm-choujiangGrid-item{
width: 137upx;
height: 130upx;
border-radius: 20upx;
overflow: hidden;
margin-left: 10upx;
position: relative;
margin-bottom: 28upx;
.tm-choujiangGrid-item-img{
width: 100%;
height: 100%;
color: black;
&.tm-choujiangGrid-item-point{
animation: scalanit 1s linear infinite;
}
}
.tm-choujiangGrid-item-hover{
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-color: #ffaa17;
opacity: 0;
&.on{
opacity: 0.6;
}
}
}
}
}
}
}
@keyframes scalanit {
0%{
transform: scale(0.9);
}
50%{
transform: scale(1.1);
}
100%{
transform: scale(0.9);
}
}
</style>