微信小程序中的转盘抽奖如何用代码实现

911 阅读2分钟

微信小程序中的转盘抽奖可以通过以下步骤用代码实现:

  1. 在 wxml 文件中添加一个 canvas 标签,设置宽高和 id,用于绘制转盘。

  2. 在 js 文件中获取 canvas 对象,设置 canvas 的宽高和绘制上下文。

  3. 绘制转盘,可以使用 arc 方法绘制圆弧,fill 方法填充颜色,stroke 方法描边。

  4. 绘制转盘上的奖品,可以使用 fillText 方法绘制文字,也可以使用 drawImage 方法绘制图片。

  5. 绑定点击事件,触发转盘抽奖功能,可以使用 Math.random 方法生成随机数来确定抽中的奖品。

  6. 在转盘旋转过程中,可以使用 setInterval 方法定时绘制转盘,同时更新转盘的角度。

  7. 当转盘停止旋转后,根据抽中的奖品显示相应的提示信息。

示例代码:

wxml 文件:

<canvas id="canvas" style="width: 300px; height: 300px;"></canvas>

js 文件:

Page({
data: {
prizeList: ['一等奖', '二等奖', '三等奖', '谢谢参与'],
colors: ['#ff0000', '#00ff00', '#0000ff', '#cccccc'],
canvasWidth: 300,
canvasHeight: 300,
radius: 100,
startAngle: 0,
endAngle: Math.PI * 2,
prizeAngle: Math.PI / 2,
speed: 0,
acceleration: 0.1,
maxSpeed: 6,
prizeIndex: -1,
isRunning: false
},
onLoad: function () {
this.ctx = wx.createCanvasContext('canvas');
this.draw();
},
draw: function () {
var ctx = this.ctx;
var data = this.data;
var prizeList = data.prizeList;
var colors = data.colors;
var canvasWidth = data.canvasWidth;
var canvasHeight = data.canvasHeight;
var radius = data.radius;
var startAngle = data.startAngle;
var endAngle = data.endAngle;
var prizeAngle = data.prizeAngle;
var prizeIndex = data.prizeIndex;
var isRunning = data.isRunning;
ctx.clearRect(0, 0, canvasWidth, canvasHeight);

    // 绘制转盘
    ctx.beginPath();
    ctx.arc(canvasWidth / 2, canvasHeight / 2, radius, startAngle, endAngle);
    colors.forEach(function (color, index) {
      ctx.fillStyle = color;
      ctx.moveTo(canvasWidth / 2, canvasHeight / 2);
      ctx.lineTo(canvasWidth / 2 + radius * Math.cos(startAngle + index * prizeAngle), canvasHeight / 2 + radius * Math.sin(startAngle + index * prizeAngle));
      ctx.arc(canvasWidth / 2, canvasHeight / 2, radius, startAngle + index * prizeAngle, startAngle + (index + 1) * prizeAngle);
      ctx.fill();
    });
    ctx.closePath();

    // 绘制奖品
    ctx.beginPath();
    ctx.font = 'bold 20px sans-serif';
    ctx.textAlign = 'center';
    ctx.textBaseline = 'middle';
    prizeList.forEach(function (prize, index) {
      ctx.fillStyle = '#ffffff';
      ctx.fillText(prize, canvasWidth / 2 + (radius - 30) * Math.cos(startAngle + index * prizeAngle + prizeAngle / 2), canvasHeight / 2 + (radius - 30) * Math.sin(startAngle + index * prizeAngle + prizeAngle / 2));
    });
    ctx.closePath();

    // 绘制指针
    ctx.beginPath();
    ctx.fillStyle = '#ff0000';
    ctx.moveTo(canvasWidth / 2 - 10, canvasHeight / 2 - radius - 10);
    ctx.lineTo(canvasWidth / 2 + 10, canvasHeight / 2 - radius - 10);
    ctx.lineTo(canvasWidth / 2, canvasHeight / 2 - radius);
    ctx.fill();
    ctx.closePath();

    // 如果正在运行,则继续旋转转盘
    if (isRunning) {
      data.speed += data.acceleration;
      if (data.speed > data.maxSpeed) {
        data.speed = data.maxSpeed;
      }
      data.startAngle += data.speed;
      if (data.startAngle >= data.endAngle) {
        data.startAngle -= data.endAngle;
      }
      this.setData({
        speed: data.speed,
        startAngle: data.startAngle
      });
      setTimeout(this.draw, 10);
    } else {
      // 如果停止旋转,则显示抽中的奖品
      if (prizeIndex >= 0) {
        wx.showModal({
          title: '恭喜您',
          content: '获得' + prizeList[prizeIndex],
          showCancel: false
        });
        this.setData({
          prizeIndex: -1
        });
      }
    }

    ctx.draw();


},
start: function () {
var data = this.data;
var prizeList = data.prizeList;
var colors = data.colors;
var prizeAngle = data.prizeAngle;
var speed = data.speed;
var maxSpeed = data.maxSpeed;
var prizeIndex = data.prizeIndex;
var isRunning = data.isRunning;



    if (isRunning) {
      return;
    }

    prizeIndex = Math.floor(Math.random() * prizeList.length);
    data.speed = 0;
    data.acceleration = 0.1;
    data.maxSpeed = 6 + prizeIndex;
    data.prizeIndex = prizeIndex;
    data.isRunning = true;

    this.draw();

}
})