You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
292 lines
6.8 KiB
292 lines
6.8 KiB
<script setup>
|
|
|
|
import { ref, onBeforeMount,onMounted } from 'vue'
|
|
import jiantou from '../assets/img/jiantou.png'
|
|
|
|
const showPopup = ref(false);
|
|
const popupMessage = ref('');
|
|
const totalScore = ref(4000) // 初始分数
|
|
const myLucky = ref()
|
|
// 新增变量记录基础分数
|
|
//const baseScore = 4000
|
|
const wheelConfig = ref({
|
|
})
|
|
const prizes = ref([
|
|
{ fonts: [{ text: '-199', top: '10%', fontColor: '#FF2C29', fontSize: '40px' }], background: '#FAF9F0' }, //0
|
|
{ fonts: [{ text: '-55', top: '10%', fontColor: '#FF2C29', fontSize: '40px' }], background: '#F5D7AD' }, //1
|
|
{ fonts: [{ text: '+200', top: '10%', fontColor: '#FF2C29', fontSize: '40px' }], background: '#FAF9F0' }, //2
|
|
{ fonts: [{ text: '-88', top: '10%', fontColor: '#FF2C29', fontSize: '40px' }], background: '#F5D7AD' }, //3
|
|
{ fonts: [{ text: '-11', top: '10%', fontColor: '#FF2C29', fontSize: '40px' }], background: '#FAF9F0' }, //4
|
|
{ fonts: [{ text: '-299', top: '10%', fontColor: '#FF2C29', fontSize: '40px' }], background: '#F5D7AD' }, //5
|
|
{ fonts: [{ text: '+200', top: '10%', fontColor: '#FF2C29', fontSize: '40px' }], background: '#FAF9F0' }, //6
|
|
{ fonts: [{ text: '-66', top: '10%', fontColor: '#FF2C29', fontSize: '40px' }], background: '#F5D7AD' }, //7
|
|
])
|
|
const blocks = ref([{ padding: '13px', background: ' #FF2A00' }])
|
|
const buttons = ref([{
|
|
radius: '35%',
|
|
imgs: [{
|
|
src: jiantou,
|
|
width: '100%',
|
|
top: '-130%'
|
|
}],
|
|
//background: '#8a9bf3',
|
|
|
|
pointer: true,
|
|
|
|
}])
|
|
|
|
//自定义数组
|
|
const customOrder = ref([0, 4, 3, 1, 2, 4, 5, 7, 3, 4, 0])
|
|
let orderIndex = 0;
|
|
|
|
function startCallback() {
|
|
// 重置为初始分数
|
|
//totalScore.value = baseScore
|
|
// 调用抽奖组件的play方法开始游戏
|
|
myLucky.value.play()
|
|
// 模拟调用接口异步抽奖
|
|
setTimeout(() => {
|
|
//
|
|
console.log(orderIndex, 'orderIndex')
|
|
|
|
const index = orderIndex
|
|
|
|
console.log(customOrder.value[index], 'custome')
|
|
// 调用stop停止旋转并传递中奖索引
|
|
myLucky.value.stop(customOrder.value[index])
|
|
//更新指针(循环)
|
|
orderIndex = (index + 1) % customOrder.value.length;
|
|
}, 3000)
|
|
}
|
|
const scoreAnimation = ref(false)
|
|
|
|
|
|
// 抽奖结束end回调
|
|
function endCallback(prize) {
|
|
const result = Number(prize.fonts[0].text)
|
|
console.log(prize.fonts[0].text)
|
|
// 更新总分
|
|
totalScore.value = totalScore.value + result
|
|
// 触发动画
|
|
animateScoreChange()
|
|
// 先清空文字
|
|
popupMessage.value = "";
|
|
showPopup.value = true;
|
|
// 设置弹窗内容
|
|
setTimeout(() => {
|
|
popupMessage.value= `${result}金币`;
|
|
}, 1000); // <--- 正确的用法
|
|
|
|
showPopup.value = true;
|
|
// 3秒后隐藏弹窗
|
|
setTimeout(() => {
|
|
showPopup.value = false;
|
|
}, 3000);
|
|
}
|
|
// 添加分数变化动画方法
|
|
const animateScoreChange = () => {
|
|
scoreAnimation.value = true
|
|
setTimeout(() => {
|
|
scoreAnimation.value = false
|
|
}, 3000)
|
|
}
|
|
|
|
onMounted(() => {
|
|
console.log(import.meta.env.MODE,'1111')
|
|
console.log(process.env.NODE_ENV,'2222')
|
|
})
|
|
|
|
</script>
|
|
|
|
<template>
|
|
<div class="full-background">
|
|
<!-- <img :src="jiantou" alt="111"> -->
|
|
<div class="art-text" :class="{ 'score-change': scoreAnimation }">
|
|
{{ totalScore }}金币
|
|
</div>
|
|
<div class="luckyWheel">
|
|
<LuckyWheel class="lucky" ref="myLucky" width="434px" height="434px" :default-config="wheelConfig"
|
|
:prizes="prizes" :blocks="blocks" :buttons="buttons" @start="startCallback" @end="endCallback" />
|
|
|
|
</div>
|
|
|
|
|
|
<div class="full-background">
|
|
<!-- 其他原有代码不变 -->
|
|
|
|
</div>
|
|
|
|
<div class="wheel-base">
|
|
</div>
|
|
<transition name="popup-fade">
|
|
<div v-if="showPopup" class="score-popup" :class="{ 'boom-effect': showPopup }">
|
|
<!-- <div class="score-popup" :class="{ 'boom-effect': showPopup }"> -->
|
|
<div class="ziti">
|
|
|
|
{{ popupMessage }}
|
|
</div>
|
|
</div>
|
|
|
|
</transition>
|
|
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped>
|
|
/* 爆炸动画关键帧 */
|
|
@keyframes boom {
|
|
0% {
|
|
transform: translate(-50%, -50%) scale(0);
|
|
opacity: 0;
|
|
}
|
|
|
|
50% {
|
|
transform: translate(-50%, -50%) scale(1.2);
|
|
opacity: 1;
|
|
}
|
|
|
|
100% {
|
|
transform: translate(-50%, -50%) scale(1);
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.score-popup {
|
|
/* 基础样式同上 */
|
|
|
|
|
|
position: fixed;
|
|
left: 50%;
|
|
top: 45%;
|
|
transform: translate(-50%, -50%);
|
|
|
|
z-index: 1000;
|
|
|
|
/* 背景图配置 */
|
|
background:
|
|
url('/public/tanchuang.png') center/contain no-repeat;
|
|
padding: 120px 80px;
|
|
/* 根据图片留出边距 */
|
|
|
|
/* 尺寸控制 */
|
|
width: 800px;
|
|
height: 1000px;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
|
|
.score-popup::before {
|
|
background: rgba(255, 215, 0, 0.1);
|
|
}
|
|
|
|
.ziti {
|
|
/* 文字样式 */
|
|
font-family: '华康金文体', 'Arial Black', sans-serif;
|
|
|
|
font-size: 100px;
|
|
|
|
/* 根据图片调整字号 */
|
|
color: #ffd904;
|
|
/* 金色文字 */
|
|
line-height: 250px;
|
|
/* 垂直居中文字 */
|
|
text-shadow: 2px 2px 0 #B8860B;
|
|
/* 略微加粗文字 */
|
|
margin-bottom: 100px;
|
|
}
|
|
|
|
/* 添加艺术字样式 */
|
|
.art-text {
|
|
position: fixed;
|
|
left: 30%;
|
|
bottom: 20%;
|
|
transform: translateX(-50%);
|
|
font-family: 'Arial Black', sans-serif;
|
|
font-size: 150px;
|
|
color: #FFD700;
|
|
/* 金色 */
|
|
text-shadow:
|
|
3px 3px 0 #FF0000,
|
|
/* 红色描边 */
|
|
-1px -1px 0 #000,
|
|
1px -1px 0 #000,
|
|
-1px 1px 0 #000,
|
|
1px 1px 0 #000;
|
|
transition: transform 0.3s ease;
|
|
z-index: 1000;
|
|
}
|
|
|
|
|
|
|
|
/* 添加分数变化动画 */
|
|
.score-change {
|
|
transform: translateX(-50%) scale(1.2);
|
|
color: hwb(69 0% 0%);
|
|
/* 变化时的橙色 */
|
|
}
|
|
|
|
.full-background {
|
|
background-image: url('/public/bg.png');
|
|
background-size: cover;
|
|
background-repeat: no-repeat;
|
|
background-position: center;
|
|
width: 100vw;
|
|
height: 100vh;
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
z-index: 0;
|
|
}
|
|
|
|
.custom-text {
|
|
position: fixed;
|
|
left: 300px;
|
|
bottom: 200px;
|
|
color: black;
|
|
font-size: 150px;
|
|
z-index: 999;
|
|
}
|
|
|
|
.luckyWheel {
|
|
position: fixed;
|
|
z-index: 999;
|
|
left: 1140px;
|
|
top: 443px;
|
|
pointer-events: auto;
|
|
}
|
|
|
|
/* 转盘底的样式 */
|
|
.wheel-base {
|
|
background-image: url('/public/wheel-base.png');
|
|
position: fixed;
|
|
left: 1065px;
|
|
top: 350px;
|
|
width: 568px;
|
|
height: 600px;
|
|
z-index: 990;
|
|
|
|
}
|
|
|
|
|
|
|
|
.luckyWheel .lucky {
|
|
aspect-ratio: 1/1;
|
|
color: aqua;
|
|
}
|
|
|
|
h1 {
|
|
position: relative;
|
|
z-index: 1;
|
|
text-align: center;
|
|
/* 居中标题 */
|
|
width: 100%;
|
|
top: 50px;
|
|
/* 让标题占据整个宽度 */
|
|
font-size: 100px;
|
|
/* 文字大小 */
|
|
|
|
}
|
|
</style>
|