目录
- 一、项目展示
- 二、核心代码
- 三、效果图
一、项目展示
摇色子是一款简易的游戏类小程序
用户可以投出1-9个色子
二、核心代码
dice.wxml
<!--pages/dice/dice.wxml-->
<import src="dice/dice-template.wxml" />
<view id="header">
<view class="btn" catchtap="reduceDice">
<image src="/images/btn-left.png"></image>
</view>
<text id="dice-count">{{diceCount}}</text>
<view class="btn" catchtap="addDice">
<image src="/images/btn-right.png"></image>
</view>
</view>
<view id="dice-zone">
<block wx:for="{{dicesData}}">
<template is="dice-template" data="{{...item}}" />
</block>
</view>
<view id="btn-roll-container" catchtap="onRollTap">
<text id="btn-roll" >摇</text>
</view>
dice.js
// pages/dice/dices.js
Page({
data: {
diceCount:,
dicesData:[]
},
onLoad: function (options) {
// 页面初始化 options为页面跳转所带来的参数
this.dotsData = {: "5",
: "28",
: "357",
: "1379",
: "13579",
: "134679"
};
this.timer = null;
this.animation = wx.createAnimation({
duration:,
timingFunction: 'linear',
});
},
onReady: function () {
// 页面渲染完成
},
onShow: function () {
// 页面显示
},
// 产生色子点数
createDotData: function () {
var num = Math.ceil(Math.random() *);
var diceData = this.dotsData[num];
var dotsHidden = {};
for (var i =; i <= 9; i++) {
if (diceData.indexOf(i) > -) {
dotsHidden[i] = "black";
} else {
dotsHidden[i] = "white";
}
};
return dotsHidden;
},
// 产生色子动画
createAnim: function (left, top) {
// 色子移入屏幕
this.animation.top(top + "rpx").left(left + "rpx").rotate(Math.random()*).step({ duration: 1000, timingFunction: "ease-out" });
return this.animation.export();
},
// 产生色子移动终点位置
createDicesPos: function () {
var dicesPos = [];
// 色子位置判断
function judgePos(l, t) {
for (var j =; j < dicesPos.length; j++) {
// 判断新产生的色子位置是否与之前产生的色子位置重叠
if ((dicesPos[j].left- < l && l < dicesPos[j].left + 146) && (dicesPos[j].top-146 < t && t < dicesPos[j].top + 146)) {
return false;
}
}
return true;
}
for (var i =; i < this.data.diceCount; i++) {
var posData = {},
left =,
top =;
do {
// 随机产生色子的可能位置
left = Math.round(Math.random() *); // 0~600,根据色子区域和色子的大小计算得出
top = Math.round(Math.random() *); // 0~550,根据色子区域和色子的大小计算得出
} while (!judgePos(left,top));
posData.left = left;
posData.top = top;
dicesPos.push(posData);
}
return dicesPos;
},
// 设置色子数据
setDicesData: function (diceCount) {
var dicesData = [];
// 色子动画数据
var dicesPos = this.createDicesPos(); // 所有色子的位置数据
for (var i =; i < diceCount; i++) {
var diceData = {};
diceData.anim = this.createAnim(dicesPos[i].left, dicesPos[i].top);
diceData.dots = this.createDotData();
dicesData.push(diceData);
}
this.setData({ dicesData: dicesData });
},
// 摇色子
onRollTap: function () {
// 设置色子移出动画
var newData = this.data.dicesData;
if(newData.length < this.data.diceCount){
for(var i =; i < this.data.diceCount;i++){
var data = {};
newData.push(data);
}
}
for (var i =; i < newData.length; i++) {
this.animation.left("-rpx").top("123rpx").rotate(-180).step();
newData[i].anim = this.animation.export();
this.setData({ dicesData: newData });
}
var that = this;
this.timer = setTimeout(function(){
// 色子改变点数并移入屏幕
that.setDicesData(that.data.diceCount);
},)
},
// 减少色子数量
reduceDice: function () {
if (this.data.diceCount >) {
this.setData({
diceCount: this.data.diceCount -
})
}
},
// 增加色子数量
addDice: function () {
if (this.data.diceCount <) {
this.setData({
diceCount: this.data.diceCount +
})
}
}
})
三、效果图
具体的效果展示如下