Source: wheel/wheel.js

/**
 * Class Wheel
 * @class
 * @classdesc 大转盘游戏逻辑部分
 * @author pfan
 * @todo 注意:移动端真机,不支持requestAnimationFrame.
 * 
 * @example
 *  new Wheel(this,{
 *    areaNumber: 8,   //抽奖间隔
 *    speed: 16,       //转动速度
 *    awardNumer: 2,   //中奖区域从1开始
 *    mode: 1,         //1是指针旋转,2为转盘旋转
 *    callback: (idx, award) => {
 *      //结束回调, 参数对应宫格索引,对应奖项    
 *    }
 *  })
 */
class Wheel {
  /**
   * @constructs Wheel构造函数
   * @param  {Object} pageContext page路由指针
   * @param  {Object} opts      组件所需参数
   * @param  {Number} opts.areaNumber  抽奖间隔
   * @param  {Number} opts.speed       转动速度
   * @param  {Number} opts.awardNumer  中奖区域从1开始
   * @param  {Number} opts.mode     1是指针旋转,2为转盘旋转
   * @param  {Function} opts.callback    结束回调
   */  
  constructor (pageContext, opts) {
    this.page = pageContext
    this.deg = 0 
    this.areaNumber = opts.areaNumber  // 奖区数量
    this.speed = opts.speed || 16   // 每帧速度
    this.awardNumer = opts.awardNumer //中奖区域 从1开始
    this.mode = opts.mode || 2
    this.singleAngle = ''   //每片扇形的角度
    this.isStart = false
    this.endCallBack = opts.callback


    this.init()

    this.page.start = this.start.bind(this)
  }

  init () {
    let {areaNumber, singleAngle, mode} = this
    singleAngle = 360 / areaNumber
    this.singleAngle = singleAngle
    this.page.setData({
      wheel: {
        singleAngle: singleAngle,
        mode: mode
      }
    })
  }

  start () {
    let {deg, awardNumer, singleAngle, speed, isStart, mode} = this
    if(isStart)return
    this.isStart = true
    let endAddAngle = (awardNumer - 1) * singleAngle + singleAngle/2 + 360   //中奖角度
    let rangeAngle = (Math.floor(Math.random() * 4) + 4) * 360 // 随机旋转几圈再停止  
    let cAngle
    deg = 0
    this.timer = setInterval( () => {
      if( deg < rangeAngle ){
        deg += speed
      }else{
        cAngle = (endAddAngle + rangeAngle - deg) / speed
        cAngle = cAngle > speed ? speed : cAngle < 1 ? 1 : cAngle
        deg += cAngle

        if(deg >= ( endAddAngle + rangeAngle )){
          deg = endAddAngle + rangeAngle
          this.isStart = false
          clearInterval(this.timer)
          this.endCallBack()         
        }
      }
      
      this.page.setData({
        wheel: {
          singleAngle: singleAngle,
          deg: deg,
          mode: mode
        }
      })
    }, 1000/60)      
  }

  reset () {
    let {mode} = this
    this.deg = 0
    this.page.setData({
      wheel: {
        singleAngle: this.singleAngle,
        deg: 0,
        mode: mode
      }
    })    
  }

  switch (mode) {
    this.mode = mode
  }

}

export default Wheel