【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖游戏总结
大家好!先上图看看本次案例的整体效果。

完整版实战课程附源码:【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖
实现思路:
- Vue component实现九宫格水果机组件,可以嵌套到任意要使用的页面。
- css3 transform控制九宫格水果机抽奖过程的动画效果。
- 抽奖组件内使用钩子函数watch监听抽奖结果的返回情况播放九宫格水果机动画并给用户弹出中奖提示。
- 中奖结果弹窗,为抽奖组件服务。
实现步骤如下:
- 构建api奖品配置信息和抽奖接口,vuex全局存放奖品配置和中奖结果数据信息。
api:export default {
getPrizeList () {
let prizeList = [
{
id: 1,
name: '小米8',
img: 'https://i1.mifile.cn/f/i/g/2015/cn-index/m8-140.png'
},
{
id: 2,
name: '小米电视',
img: 'https://i1.mifile.cn/f/i/g/2015/TV4A-43QC.png'
}, {
id: 3,
name: '小米平衡车',
img: 'https://i1.mifile.cn/f/i/g/2015/cn-index/scooter-140!140x140.jpg'
}, {
id: 4,
name: '小米耳机',
img: 'https://c1.mifile.cn/f/i/g/2015/video/pinpai140!140x140.jpg'
}
]
return prizeList
},
lottery () {
return {
id: 4,
name: '小米耳机',
img: 'https://c1.mifile.cn/f/i/g/2015/video/pinpai140!140x140.jpg'
}
}
}store:
import lotteryApi from '../../api/lottery.api.js' const state = {
prizeList: [],
lotteryResult: {}
} const getters = {
prizeList: state => state.prizeList,
lotteryResult: state => state.lotteryResult
} const mutations = {
SetPrizeList (state, { prizeList }) {
state.prizeList = prizeList
},
SetLotteryResult (state, { lotteryResult }) {
state.lotteryResult = lotteryResult
}
} const actions = {
getPrizeList ({ commit }) {
let result = lotteryApi.getPrizeList()
commit('SetPrizeList', { prizeList: result })
},
lottery ({ commit }) {
let result = lotteryApi.lottery()
commit('SetLotteryResult', { lotteryResult: result })
}
} export default {
state,
getters,
mutations,
actions,
namespaced: true
} - 编写抽奖组件,为保证通用性,组件只负责播放抽奖结果。接收两个数据和一个方法,如下:
数据一:预置的奖品列表数据(轮播奖品需要)
数据二:抽奖结果,播放抽奖动画和弹出中奖结果需要
方法:抽奖动作,返回的抽奖结果数据即为数据二,响应式传递给组件
大概代码思路如下(仅供参考,不可运行)<template>
<div class="main">
<div class="squared"
v-if="slotPrizes.length>0">
<ul class="squared-warpper">
<li class="squared-item"
v-for="(item,index) in slotPrizes"
v-bind:key="index">
<img class="squared-item-btn"
@click="parentEmitLottery()"
v-if="index==4"
src="//images.cnblogs.com/cnblogs_com/codeon/878827/t_startLottery.jpg">
<div v-if="index!=4"
class="squared-item-prise"
:class="item.slotIndex==playIndex ? 'on':''">
<img :src="item.img">
</div>
</li>
</ul>
</div>
<prize-pop :prize="lotteryResult"
v-if="showPrize"
@closeLotteryPop="showPrize=false" />
</div>
</template>
<script>
import PrizePop from './common/prize-pop.vue'
export default {
name: 'FruitMachine',
data () {
return {
isStart: false,
showPrize: false,
count: 0, // 移动总次数
prizeIndex: -1, // 中奖的奖品索引
timeOut: 100, // 延迟执行时间
endingTimeOut: 200, // 最后一圈延迟执行时间
intervalCount: 4, // 循环轮播次数
playIndex: 0 // 当前移动的索引
}
},
components: {
PrizePop
},
props: {
prizes: {
type: Array,
required: false
},
lotteryResult: {
type: Object,
default: () => { }
}
},
computed: {
slotPrizes () {
let prize = []
var self = this
console.log(self.prizes)
if (self.prizes.length > 0) {
prize.push({ ...self.prizes[0], slotIndex: 1 })
prize.push({ id: -1, slotIndex: 2, img: '//www.cnblogs.com/images/cnblogs_com/codeon/878827/t_thanksAccept.png' })
prize.push({ ...self.prizes[1], slotIndex: 3 })
prize.push({ id: -1, slotIndex: 8, img: '//www.cnblogs.com/images/cnblogs_com/codeon/878827/t_thanksAccept.png' })
prize.push({ id: -1, slotIndex: -1, img: '//www.cnblogs.com/images/cnblogs_com/codeon/878827/t_thanksAccept.png' })
prize.push({ id: -1, slotIndex: 4, img: '//www.cnblogs.com/images/cnblogs_com/codeon/878827/t_thanksAccept.png' })
prize.push({ ...self.prizes[3], slotIndex: 7 })
prize.push({ id: -1, slotIndex: 6, img: '//www.cnblogs.com/images/cnblogs_com/codeon/878827/t_thanksAccept.png' })
prize.push({ ...self.prizes[2], slotIndex: 5 })
}
return prize
}
},
methods: {
/**
* 触发父页面调用抽奖
*/
parentEmitLottery () {
this.$emit('lottery')
},
/**
* 开始抽奖
*/
startLottery () {
},
/**
* 获取中奖结果所在奖品列表中的索引,以确定抽奖动画最终落在哪个奖品
*/
getPrizeIndex () {
},
/**
* 执行抽奖动画
*/
intervalPlay() {
}
},
watch: {
lotteryResult (newVal, oldVal) {
if (newVal.id && newVal.id > 0) {
this.startLottery()
}
}
}
}
</script> - 弹出中奖结果组件,依附于抽奖组件,在上一步的执行抽奖结果动画结束后执行。
<template>
<div class="subject-pop" style="z-index: 10;" v-if="prize.id>0">
<div class="subject-pop-mask"></div>
<div class="subject-pop-box">
<h3>恭喜您</h3>
<p>
<img :src="prize.img" alt>
</p>
<h4>获得
<span></span>
<span>{{prize.name}}</span>
</h4>
<div class="subject-pop-footer">
<a href="javascript:;" class="november-btn1" @click="closeLotteryEmit">知道了</a>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
prize: {
type: Object,
default: () => {
return {
id: 0
}
}
}
},
methods: {
closeLotteryEmit () {
this.$emit('closeLotteryPop')
}
}
}
</script> - 抽奖组件运用在需要使用的页面中,此页面需要为抽奖组件提前准备好预置奖品列表和中奖结果信息,并提供好抽奖方法供子组件(抽奖组件)触发,触发完更改抽奖结果响应式传入到抽奖组件中。
<template>
<section>
<div style="width:100%;text-align:center;margin:2rem 0;">您有一次抽奖机会,祝君好运~~~</div>
<FruitMachine v-bind:prizes="prizeList"
v-bind:lotteryResult="lotteryResult"
v-on:lottery="lottery" />
</section>
</template> <script>
import { mapGetters, mapActions } from 'vuex'
import FruitMachine from '@/components/fruitMachine'
export default {
data () {
return { }
},
created () {
var self = this
self.getPrizeList()
},
components: {
FruitMachine
},
computed: {
...mapGetters({
prizeList: 'lottery/prizeList',
lotteryResult: 'lottery/lotteryResult'
})
},
methods: {
...mapActions({
getPrizeList: 'lottery/getPrizeList',
lottery: 'lottery/lottery'
})
}
}
</script>
以上就是九宫格水果机抽奖核心步骤的整体思路,欢迎讨论。
完整版九宫格水果机实战课程附源码:【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖
Vue.js实战之游戏抽奖系列全集
↓↓↓↓↓↓↓↓↓↓↓
【Vue.js游戏机实战】- Vue.js实现老虎-机抽奖总结
【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖游戏总结
【Vue.js游戏机实战】- Vue.js实现大转盘抽奖总结
【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖游戏总结的更多相关文章
- 【Vue.js游戏机实战】- Vue.js实现老虎-机抽奖总结
大家好!先上图看看本次案例的整体效果. 完整版实战课程附源码:[Vue.js游戏机实战]- Vue.js实现老虎-机抽奖 实现思路: Vue component实现老虎-机组件,可以嵌套到任意要使用的 ...
- 【Vue.js游戏机实战】- Vue.js实现大转盘抽奖总结
大家好!先上图看看本次案例的整体效果. 实现思路: Vue component实现大转盘组件,可以嵌套到任意要使用的页面. css3 transform控制大转盘抽奖过程的动画效果. 抽奖组件内使用钩 ...
- Vue.js起手式+Vue小作品实战
本文是小羊根据Vue.js文档进行解读的第一篇文章,主要内容涵盖Vue.js的基础部分的知识的,文章顺序基本按照官方文档的顺序,每个知识点现附上代码,然后根据代码给予个人的一些理解,最后还放上在线编辑 ...
- 08Vue.js快速入门-Vue综合实战项目
8.1. 前置知识学习 npm 学习 官方文档 推荐资料 npm入门 npm介绍 需要了解的知识点 package.json 文件相关配置选项 npm 本地安装.全局安装.本地开发安装等区别及相关命令 ...
- 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发
每天记录一点:NetCore获得配置文件 appsettings.json 用NetCore做项目如果用EF ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...
- 分享Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站
这是个什么的项目? 使用 Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站. 博客线上地址:www.boblog.com Github地址:https: ...
- 第10章-Vue.js 项目实战
一.本节内容 掌握项目环境中路由的配置方法 ***** 熟练掌握编写单文件组件的编写 *** 能够使用swiper.js进行轮播图组件的封装 能够使用axios进行数据请求 二.webpack项目的目 ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十七 ║Vue基础:使用Vue.js 来画博客首页+指令(一)
缘起 书说前两篇文章<十五 ║ Vue前篇:JS对象&字面量&this>和 <十六 ║ Vue前篇:ES6初体验 & 模块化编程>,已经通过对js面向对 ...
- Vue的理解:Vue.js新手入门指南----转
最近在逛各大网站,论坛,以及像SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,楼主自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在 ...
随机推荐
- python day4 元组/字典/集合类知识点补充
目录 python day4 元组/字典/集合类知识点补充 1. 元组tuple知识点补充 2. 字典dict的知识点补充 3. 基本数据类型set 4. 三元运算,又叫三目运算 5. 深复制浅复制 ...
- 学习笔记之CloudCompare
CloudCompare - Open Source project https://www.danielgm.net/cc/ 3D point cloud and mesh processing s ...
- iOS加密之AES
心急的童鞋直接看这里Demo 运行之后可以去在线加密网站验证 AES(Advanced Encryption Standard)高级加密标准,又称Rijndael加密法,是美国联邦政府采用的一种区块加 ...
- 程序写入mycat中文乱码解决(也包括mysql编码修改)
乱码问题可能出现的三个地方 1.程序连接的编码要设置 jdbc:mysql://192.168.1.1:8066/TESTDB?useUnicode=true&characterEncodin ...
- PHP传引用/作用域 问题
$arr = [1,2,3]; foreach($arr as &$v) { //nothing todo. } foreach($arr as $v) { //nothing todo. } ...
- Deep learning_CNN_Review:A Survey of the Recent Architectures of Deep Convolutional Neural Networks——2019
CNN综述文章 的翻译 [2019 CVPR] A Survey of the Recent Architectures of Deep Convolutional Neural Networks 翻 ...
- 【转】java.io.Closeable接口
说到java.io.Closeable接口就避不开java.lang.AutoCloseable接口,因为在java版本7.0时引入了java.lang.AutoCloseable接口,同时java. ...
- C++ ---定义变量初始化
定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构.在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”. 每种类型的变量都有各自的初始化方法,mems ...
- Kotlin构造方法详解与初始化过程分析
在上一次https://www.cnblogs.com/webor2006/p/11192025.html已经初识了Kolin的面向对象,先来回顾一下: 介绍了primary 构造方法,其特点回忆一下 ...
- 怎么给win10进行分区?
新安装的win10系统的朋友,对于win10系统分区不满意应该如何是好呢?今天给大家介绍两种win10系统分区的方法,一个是windows自带分区管理软件来操作;另一个就是简单方便的分区助手来帮助您进 ...