微信小程序 Utils丨抽奖转盘


JS

luckDrawStart 方法中可更改抽奖几率从服务端获取

// 上下文对象
var that;

Page({

  /**
   * 页面的初始数据
   */
  data: {
    is_play: false,// 是否在运动中,避免重复启动bug
    available_num: 0,// 可用抽奖的次数,可自定义设置或者接口返回
    start_angle: 0,// 转动开始时初始角度=0位置指向正上方,按顺时针设置,可自定义设置
    base_circle_num: 9,// 基本圈数,就是在转到(最后一圈)结束圈之前必须转够几圈 ,可自定义设置
    low_circle_num: 5,// 在第几圈开始进入减速圈(必须小于等于基本圈数),可自定义设置
    add_angle: 10,// 追加角度,此值越大转动越快,请保证360/add_angle=一个整数,比如1/2/3/4/5/6/8/9/10/12等
    use_speed: 1,// 当前速度,与正常转速值相等
    nor_speed: 1,// 正常转速,在减速圈之前的转速,可自定义设置
    low_speed: 10,// 减速转速,在减速圈的转速,可自定义设置
    end_speed: 20,// 最后转速,在结束圈的转速,可自定义设置
    random_angle: 0,// 中奖角度,也是随机数,也是结束圈停止的角度,这个值采用系统随机或者接口返回
    change_angle: 0,// 变化角度计数,0开始,一圈360度,基本是6圈,那么到结束这个值=6*360+random_angle;同样change_angle/360整除表示走过一整圈
    result_val: "未中奖",// 存放奖项容器,可自定义设置
    Jack_pots: [// 奖项区间 ,360度/奖项个数 ,一圈度数0-360,可自定义设置
     // random_angle是多少,在那个区间里面就是中哪个奖项
      {
        startAngle: 1,
        endAngle: 51,
        val: "1等奖"
      },
      {
        startAngle: 52,
        endAngle: 102,
        val: "2等奖"
      },
      {
        startAngle: 103,
        endAngle: 153,
        val: "3等奖"
      },
      {
        startAngle: 154,
        endAngle: 203,
        val: "4等奖"
      },
      {
        startAngle: 204,
        endAngle: 251,
        val: "5等奖"
      },
      {
        startAngle: 252,
        endAngle: 307,
        val: "6等奖"
      },
      {
        startAngle: 307,
        endAngle: 360,
        val: "未中奖"
      }
    ]
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    that = this;
    that.luckDrawStart();
  },

  /**
   * 启动抽奖
   */
  luckDrawStart: function () {
    // 阻止运动中重复点击
    if (!that.data.is_play) {
      // 设置标识在运动中
      that.setData({
        is_play: true
      });
      // 重置参数
      that.luckDrawReset();
      // 几率随机,也可从服务端获取几率
      that.setData({
        random_angle: Math.ceil(Math.random() * 360)
      });
     // 运动函数
      setTimeout(that.luckDrawChange, that.data.use_speed);
    };
  },

  /**
   * 转盘运动
   */
  luckDrawChange: function () {
   // 继续运动
    if (that.data.change_angle >= that.data.base_circle_num * 360 + that.data.random_angle) {// 已经到达结束位置
     // 提示中奖,
      that.getLuckDrawResult();
     // 运动结束设置可用抽奖的次数和激活状态设置可用
      that.luckDrawEndset();
    } else {// 运动
      if (that.data.change_angle < that.data.low_circle_num * 360) {// 正常转速
        // console.log("正常转速")
        that.data.use_speed = that.data.nor_speed
      } else if (that.data.change_angle >= that.data.low_circle_num * 360 && that.data.change_angle <= that.data.base_circle_num * 360) {// 减速圈
        // console.log("减速圈")
        that.data.use_speed = that.data.low_speed
      } else if (that.data.change_angle > that.data.base_circle_num * 360) {// 结束圈
       // console.log("结束圈")
        that.data.use_speed = that.data.end_speed
      }
     // 累加变化计数
      that.setData({
        change_angle: that.data.change_angle + that.data.add_angle >= that.data.base_circle_num * 360 + that.data.random_angle ? that.data.base_circle_num * 360 + that.data.random_angle : that.data.change_angle + that.data.add_angle
      });
      setTimeout(that.luckDrawChange, that.data.use_speed);
    }

  },

  /**
   * 重置参数
   */
  luckDrawReset: function () {
    // 转动开始时首次点亮的位置,可自定义设置
    that.setData({
      start_angle: 0
    });
    // 当前速度,与正常转速值相等
    that.setData({
      use_speed: that.data.nor_speed
    });
    // 中奖索引,也是随机数,也是结束圈停止的位置,这个值采用系统随机或者接口返回
    that.setData({
      random_angle: 0
    });
    // 变化计数,0开始,必须实例有12个奖项,基本是6圈,那么到结束这个值=6*12+random_number;同样change_num/12整除表示走过一整圈
    that.setData({
      change_angle: 0
    });
  },

  /**
   * 获取抽奖结果
   */
  getLuckDrawResult: function () {
    for (var j = 0; j < that.data.Jack_pots.length; j++) {
      if (that.data.random_angle >= that.data.Jack_pots[j].startAngle && that.data.random_angle <= that.data.Jack_pots[j].endAngle) {
        that.setData({
          result_val: that.data.Jack_pots[j].val
        });
        wx.showModal({
          title: '抽奖结果',
          content: that.data.Jack_pots[j].val,
        })
        break;
      };
    };
  },

  /**
   * 更新状态(运动结束设置可用抽奖的次数和激活状态设置可用)
   */
  luckDrawEndset: function () {
    // 是否在运动中,避免重复启动bug
    that.setData({
      is_play: false
    })
    // 可用抽奖的次数,可自定义设置
    that.setData({
      available_num: that.data.available_num - 1
    });
  },
})

WXML

  <view id="luckdraw_box">
    <view id="luckdraw_back">
      <image style='transform:rotate({{ change_angle}}deg)' mode="scaleToFill" src="/images/luckdraw_background.png"></image>
    </view>
    <view id="luckdraw_pointer" bindtap='luckDrawStart'>
      <image mode="scaleToFill" src="/images/luckdraw_pointer.png"></image>
    </view>
  </view>

WXSS

#luckdraw_box{ 
  width:531rpx;
   height:531rpx; 
   margin:0 auto;
   position:relative; 
}

#luckdraw_back{
  width: 100%;
  height: 100%;
}   

#luckdraw_back image{
  display: block;
  width: 100%;
  height: 100%;
  transform-origin:center center;
}

#luckdraw_pointer{ 
    width:174rpx;
    height:228rpx;
    position:absolute;
    left:178.5rpx;
    z-index:999; 
    top:132.5rpx;
}

#luckdraw_pointer image{
  display: block;
  width: 100%;
  height: 100%;
}

page{
  background: #060606;
}

两张背景图

luckdraw_background.png
luckdraw_pointer.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345