mirror of
https://github.com/ialley-workshop-open/uni-halo.git
synced 2026-06-12 13:19:31 +08:00
v1.0.0-beta 源码正式开源
This commit is contained in:
@@ -0,0 +1,467 @@
|
||||
<template>
|
||||
<view class="tm-choujiangGame py-32">
|
||||
<view class="tm-choujiangGame-theme-1 flex-center flex-col">
|
||||
<view class="tm-choujiangGame-bg ">
|
||||
<view
|
||||
@click="clickImgPlay"
|
||||
class="tm-choujiangGame-bg-image"
|
||||
:style="{
|
||||
backgroundImage: `url(${them_data.bg})`
|
||||
}"
|
||||
></view>
|
||||
<view class="tm-choujiangGame-bg-prod ">
|
||||
<view
|
||||
class="tm-choujiangGame-bg-cp text-red text-align-center "
|
||||
:style="{
|
||||
width: '25%',
|
||||
height: '100%',
|
||||
transform: `translateY(${reisetInitTop}px)`
|
||||
}"
|
||||
:animation="animationData0"
|
||||
>
|
||||
<view
|
||||
v-for="(item, index) in listData"
|
||||
:key="index"
|
||||
style="height: 100%;"
|
||||
class="flex-center flex-col"
|
||||
>
|
||||
<tm-images v-if="item.img" :previmage="false" :width="60" :src="item.img"></tm-images>
|
||||
{{item.name}}
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
class="tm-choujiangGame-bg-cp text-red text-align-center "
|
||||
:style="{
|
||||
width: '25%',
|
||||
height: '100%',
|
||||
transform: `translateY(${reisetInitTop}px)`
|
||||
}"
|
||||
:animation="animationData1"
|
||||
>
|
||||
<view
|
||||
v-for="(item, index) in listData"
|
||||
:key="index"
|
||||
style="height: 100%;"
|
||||
class="flex-center flex-col"
|
||||
>
|
||||
<tm-images v-if="item.img" :previmage="false" :width="60" :src="item.img"></tm-images>
|
||||
{{item.name}}
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
class="tm-choujiangGame-bg-cp text-red text-align-center "
|
||||
:style="{
|
||||
width: '25%',
|
||||
height: '100%',
|
||||
transform: `translateY(${reisetInitTop}px)`
|
||||
}"
|
||||
:animation="animationData2"
|
||||
>
|
||||
<view
|
||||
v-for="(item, index) in listData"
|
||||
:key="index"
|
||||
style="height: 100%;"
|
||||
class="flex-center flex-col"
|
||||
>
|
||||
<tm-images v-if="item.img" :previmage="false" :width="60" :src="item.img"></tm-images>
|
||||
{{item.name}}
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
class="tm-choujiangGame-bg-cp text-red text-align-center "
|
||||
:style="{
|
||||
width: '25%',
|
||||
height: '100%',
|
||||
transform: `translateY(${reisetInitTop}px)`
|
||||
}"
|
||||
:animation="animationData3"
|
||||
>
|
||||
<view
|
||||
v-for="(item, index) in listData"
|
||||
:key="index"
|
||||
style="height: 100%;"
|
||||
class="flex-center flex-col"
|
||||
>
|
||||
<tm-images v-if="item.img" :previmage="false" :width="60" :src="item.img"></tm-images>
|
||||
{{item.name}}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="flex-end tm-choujiangGame-point">
|
||||
<view class="tm-choujiangGame-point-bar"
|
||||
:style="{
|
||||
transform: aniOff?'rotate(0)':'rotate(25deg)'
|
||||
}"
|
||||
>
|
||||
<tm-images :previmage="false" :width="120" :src="them_data.point"></tm-images>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- transform: choujiangJieGuo==null?`translateY(-100%)`:`translateY(0)` -->
|
||||
<view class="tm-choujiangGame-pingtai flex-center">
|
||||
<view class="tm-choujiangGame-pingtai-coll" :style="{
|
||||
transition: 'all 0.5s',
|
||||
transform: choujiangJieGuo==null?`translateY(-100%)`:`translateY(0)`
|
||||
}">
|
||||
<view class="tm-choujiangGame-pingtai-text">中奖啦~</view>
|
||||
<tm-images :previmage="false" :width="380" :height="200" :src="them_data.dizuo"></tm-images>
|
||||
</view>
|
||||
</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 {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-choujiangGame',
|
||||
props: {
|
||||
themeIndex: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
themeList: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return [
|
||||
{
|
||||
bg: 'https://jx2d.cn/yuwuimages/choujiangGame_1.png?k=9',
|
||||
point: 'https://jx2d.cn/yuwuimages/choujiangGame_1_0.png',
|
||||
dizuo: 'https://jx2d.cn/yuwuimages/choujiangGame_2_1.png'
|
||||
},
|
||||
{
|
||||
bg: 'https://jx2d.cn/yuwuimages/choujiangGame_2.png?k=9',
|
||||
point: 'https://jx2d.cn/yuwuimages/choujiangGame_2_0.png',
|
||||
dizuo: 'https://jx2d.cn/yuwuimages/choujiangGame_2_1.png'
|
||||
}
|
||||
];
|
||||
}
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//是否禁用点中间图片开始。
|
||||
disabledCenter:{
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 动画时长
|
||||
duration: {
|
||||
type: Number,
|
||||
default: 150
|
||||
},
|
||||
list: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return [
|
||||
{ name: '1', gailv: 30, id: 1, img: 'https://jx2d.cn/yuwuimages/jiangping_2.png' },
|
||||
{ name: '2', gailv: 10, id: 2, img: 'https://jx2d.cn/yuwuimages/jiangping_1.png' },
|
||||
{ name: '3', gailv: 10, id: 3, img: 'https://jx2d.cn/yuwuimages/jiangping_2.png' },
|
||||
{ name: '4', gailv: 10, id: 4, img: 'https://jx2d.cn/yuwuimages/jiangping_1.png' },
|
||||
{ name: '5', gailv: 10, id: 5, img: 'https://jx2d.cn/yuwuimages/jiangping_2.png' },
|
||||
{ name: '7', gailv: 10, id: 7, img: 'https://jx2d.cn/yuwuimages/jiangping_1.png' },
|
||||
{ name: '8', gailv: 10, id: 8, img: 'https://jx2d.cn/yuwuimages/jiangping_2.png' },
|
||||
{ name: '9', gailv: 10, id: 9, img: 'https://jx2d.cn/yuwuimages/jiangping_1.png' }
|
||||
|
||||
];
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
animationData0: '',
|
||||
animationData1: '',
|
||||
animationData2: '',
|
||||
animationData3: '',
|
||||
aniOff: true,
|
||||
choujiangJieGuo:null,
|
||||
listData: [],
|
||||
|
||||
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.listData = this.list;
|
||||
|
||||
},
|
||||
computed: {
|
||||
reisetInitTop:function(){
|
||||
return -(this.listData.length-1)*uni.upx2px(160)
|
||||
},
|
||||
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(),
|
||||
ml.getResult(),
|
||||
ml.getResult(),
|
||||
ml.getResult()
|
||||
]
|
||||
|
||||
for(let i=0 ;i<xh.length;i++){
|
||||
|
||||
let index = 0
|
||||
for(let j=0;j<this.listData.length;j++){
|
||||
if(this.listData[j].id === xh[i].id){
|
||||
index = j;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
//(this.listData.length-1)*2
|
||||
let cisu = (this.listData.length-1)*2+1 + (this.listData.length - index);
|
||||
zhongle.push({
|
||||
index:index,
|
||||
data:xh[i],
|
||||
playNum:cisu
|
||||
})
|
||||
}
|
||||
|
||||
return zhongle;
|
||||
},
|
||||
async 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(async function() {
|
||||
await this.resetInit();
|
||||
|
||||
this.aniOff = false;
|
||||
let duration = this.duration;
|
||||
let dhIndex=[0,0,0,0];//内部播放次数。
|
||||
let ydIndex =[0,0,0,0] ; //达到长度时,要循环。
|
||||
let isok = [false,false,false,false]
|
||||
async function aniOpen(ix){
|
||||
if(ydIndex[ix]>t.listData.length-1){
|
||||
|
||||
|
||||
if(ix==0){
|
||||
var animation0 = uni.createAnimation({
|
||||
duration: 0
|
||||
});
|
||||
t.animationData0 = animation0;
|
||||
animation0.translateY(-(t.listData.length-1)*uni.upx2px(160)).step({duration:0});
|
||||
t.animationData0 = animation0.export();
|
||||
}else if(ix==1){
|
||||
var animation1 = uni.createAnimation({
|
||||
duration: 0
|
||||
});
|
||||
t.animationData1 = animation1;
|
||||
animation1.translateY(-(t.listData.length-1)*uni.upx2px(160)).step({duration:0});
|
||||
t.animationData1 = animation1.export();
|
||||
}else if(ix==2){
|
||||
var animation2 = uni.createAnimation({
|
||||
duration: 0
|
||||
});
|
||||
t.animationData2 = animation2;
|
||||
animation2.translateY(-(t.listData.length-1)*uni.upx2px(160)).step({duration:0});
|
||||
t.animationData2 = animation2.export();
|
||||
}else if(ix==3){
|
||||
var animation3 = uni.createAnimation({
|
||||
duration: 0
|
||||
});
|
||||
t.animationData3 = animation3;
|
||||
animation3.translateY(-(t.listData.length-1)*uni.upx2px(160)).step({duration:0});
|
||||
t.animationData3 = animation3.export();
|
||||
}
|
||||
await uni.$tm.sleep(50);
|
||||
ydIndex[ix] = 0;
|
||||
}else{
|
||||
var animation = uni.createAnimation({
|
||||
duration: duration,
|
||||
timingFunction: 'linear'
|
||||
});
|
||||
|
||||
|
||||
if(ix==0){
|
||||
t.animationData0 = animation;
|
||||
let jl = -(t.listData.length-1)*160+ydIndex[ix]*160;
|
||||
animation.translateY(uni.upx2px(jl)).step();
|
||||
t.animationData0 = animation.export();
|
||||
}else if(ix==1){
|
||||
t.animationData1 = animation;
|
||||
let jl = -(t.listData.length-1)*160+ydIndex[ix]*160;
|
||||
animation.translateY(uni.upx2px(jl)).step();
|
||||
t.animationData1 = animation.export();
|
||||
}else if(ix==2){
|
||||
t.animationData2 = animation;
|
||||
let jl = -(t.listData.length-1)*160+ydIndex[ix]*160;
|
||||
animation.translateY(uni.upx2px(jl)).step();
|
||||
t.animationData2 = animation.export();
|
||||
}else if(ix==3){
|
||||
let jl = -(t.listData.length-1)*160+ydIndex[ix]*160;
|
||||
animation.translateY(uni.upx2px(jl)).step();
|
||||
t.animationData3 = animation.export();
|
||||
|
||||
}
|
||||
|
||||
await uni.$tm.sleep(duration);
|
||||
|
||||
|
||||
}
|
||||
|
||||
dhIndex[ix] = dhIndex[ix]+1;
|
||||
ydIndex[ix] = ydIndex[ix]+1;
|
||||
|
||||
if(dhIndex[ix] > zhongjiang[ix].playNum){
|
||||
isok[ix] = true;
|
||||
if(isok[0]&&isok[1]&&isok[2]&&isok[3]){
|
||||
// 结束动画.
|
||||
t.aniOff = true;
|
||||
t.$emit('end',zhongjiang)
|
||||
t.choujiangJieGuo = zhongjiang;
|
||||
}
|
||||
}else{
|
||||
await aniOpen(ix);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
for(let i =0;i<zhongjiang.length;i++){
|
||||
aniOpen(i);
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
},
|
||||
// 重置 角度。
|
||||
async resetInit() {
|
||||
this.animationData0 = '';
|
||||
var animation0 = uni.createAnimation({duration: 0});
|
||||
this.animationData0 = animation0;
|
||||
animation0.translateY(-uni.upx2px((this.listData.length-1)*160)).step();
|
||||
this.animationData0 = animation0.export();
|
||||
|
||||
this.animationData1 = '';
|
||||
var animation1 = uni.createAnimation({duration: 0});
|
||||
this.animationData1 = animation1;
|
||||
animation1.translateY(-uni.upx2px((this.listData.length-1)*160)).step();
|
||||
this.animationData1 = animation1.export();
|
||||
|
||||
this.animationData2 = '';
|
||||
var animation2 = uni.createAnimation({duration: 0});
|
||||
this.animationData2 = animation2;
|
||||
animation2.translateY(-uni.upx2px((this.listData.length-1)*160)).step();
|
||||
this.animationData2 = animation2.export();
|
||||
|
||||
this.animationData3 = '';
|
||||
var animation3 = uni.createAnimation({duration: 0});
|
||||
this.animationData3 = animation3;
|
||||
animation3.translateY(-uni.upx2px((this.listData.length-1)*160)).step();
|
||||
this.animationData3 = animation3.export();
|
||||
await uni.$tm.sleep(50);
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.tm-choujiangGame {
|
||||
overflow: hidden;
|
||||
.tm-choujiangGame-theme-1 {
|
||||
.tm-choujiangGame-bg {
|
||||
width: 600upx;
|
||||
height: 600upx;
|
||||
position: relative;
|
||||
|
||||
z-index: 2;
|
||||
.tm-choujiangGame-bg-image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
z-index: 3;
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
}
|
||||
.tm-choujiangGame-point {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
.tm-choujiangGame-point-bar{
|
||||
position: relative;
|
||||
right: 0;
|
||||
z-index: 0;
|
||||
top: -50upx;
|
||||
transform-origin: left right;
|
||||
transition:all 0.5s;
|
||||
}
|
||||
}
|
||||
.tm-choujiangGame-bg-prod {
|
||||
position: absolute;
|
||||
overflow: hidden;
|
||||
width: 370upx;
|
||||
height: 160upx;
|
||||
top: 95upx;
|
||||
left: 103upx;
|
||||
display: flex;
|
||||
z-index: 4;
|
||||
.tm-choujiangGame-bg-cp {
|
||||
transform-origin: center bottom;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
.tm-choujiangGame-pingtai {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
margin-left: -20upx;
|
||||
margin-top: -140upx;
|
||||
overflow: hidden;
|
||||
height: 190upx;
|
||||
.tm-choujiangGame-pingtai-coll{
|
||||
position: relative;
|
||||
.tm-choujiangGame-pingtai-text{
|
||||
position: absolute;
|
||||
z-index: 3;
|
||||
font-size: 48upx;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
top: 10upx;
|
||||
color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user