From 47899ec619fae5231ac126dbbde5832fca2273a7 Mon Sep 17 00:00:00 2001 From: zpc Date: Thu, 15 May 2025 15:33:32 +0800 Subject: [PATCH] 22 --- common/config.js | 644 +++++++++------ components/.DS_Store | Bin 6148 -> 6148 bytes components/@lucky-canvas/.DS_Store | Bin 0 -> 6148 bytes components/@lucky-canvas/uni/LICENSE | 201 +++++ components/@lucky-canvas/uni/README.md | 138 ++++ components/@lucky-canvas/uni/lucky-grid.vue | 317 ++++++++ components/@lucky-canvas/uni/lucky-wheel.vue | 255 ++++++ components/@lucky-canvas/uni/package.json | 23 + components/@lucky-canvas/uni/slot-machine.vue | 214 +++++ components/@lucky-canvas/uni/utils.js | 82 ++ .../canvas-prize-wheel/canvas-prize-wheel.vue | 689 ++++++++++++++++ components/detail-lucky/detail-lucky.vue | 7 + components/lucky-canvas/LICENSE | 201 +++++ components/lucky-canvas/README.md | 42 + components/lucky-canvas/dist/index.cjs.js | 17 + components/lucky-canvas/dist/index.cjs.js.map | 1 + components/lucky-canvas/dist/index.esm.js | 16 + components/lucky-canvas/dist/index.esm.js.map | 1 + components/lucky-canvas/dist/index.umd.js | 15 + components/lucky-canvas/dist/index.umd.js.map | 1 + components/lucky-canvas/dist/lucky-canvas.js | 16 + components/lucky-canvas/index.js | 1 + components/lucky-canvas/package.json | 66 ++ components/lucky-canvas/types/index.d.ts | 752 ++++++++++++++++++ components/prize-wheel/prize-wheel.vue | 498 ++++++++++++ package-lock.json | 14 + package.json | 1 + pages.json | 12 + pages/shouye/canvas-prize-demo.vue | 223 ++++++ pages/shouye/index.vue | 2 +- pages/shouye/prize-wheel-demo.vue | 202 +++++ pages/shouye/slots.vue | 463 +++++++---- 32 files changed, 4702 insertions(+), 412 deletions(-) create mode 100644 components/@lucky-canvas/.DS_Store create mode 100644 components/@lucky-canvas/uni/LICENSE create mode 100644 components/@lucky-canvas/uni/README.md create mode 100644 components/@lucky-canvas/uni/lucky-grid.vue create mode 100644 components/@lucky-canvas/uni/lucky-wheel.vue create mode 100644 components/@lucky-canvas/uni/package.json create mode 100644 components/@lucky-canvas/uni/slot-machine.vue create mode 100644 components/@lucky-canvas/uni/utils.js create mode 100644 components/canvas-prize-wheel/canvas-prize-wheel.vue create mode 100644 components/detail-lucky/detail-lucky.vue create mode 100644 components/lucky-canvas/LICENSE create mode 100644 components/lucky-canvas/README.md create mode 100644 components/lucky-canvas/dist/index.cjs.js create mode 100644 components/lucky-canvas/dist/index.cjs.js.map create mode 100644 components/lucky-canvas/dist/index.esm.js create mode 100644 components/lucky-canvas/dist/index.esm.js.map create mode 100644 components/lucky-canvas/dist/index.umd.js create mode 100644 components/lucky-canvas/dist/index.umd.js.map create mode 100644 components/lucky-canvas/dist/lucky-canvas.js create mode 100644 components/lucky-canvas/index.js create mode 100644 components/lucky-canvas/package.json create mode 100644 components/lucky-canvas/types/index.d.ts create mode 100644 components/prize-wheel/prize-wheel.vue create mode 100644 pages/shouye/canvas-prize-demo.vue create mode 100644 pages/shouye/prize-wheel-demo.vue diff --git a/common/config.js b/common/config.js index fe28a57..a0119a0 100644 --- a/common/config.js +++ b/common/config.js @@ -12,283 +12,431 @@ const wx_version = "110"; // 白名单页面(不需要登录即可访问) export const whiteList = [ - "pages/shouye/index", // 首页 - "pages/shouye/detail", // 详情页 - "pages/shouye/huanxiang", // 换箱页面 - "pages/mall/index", // 商城首页 - "pages/shouye/detail_wuxian", // 无限详情页 - "pages/sangdai/sangdai", // 盒柜页面 - "pages/infinite/index", // 福利首页 - "pages/user/index", // 用户中心 - "pages/infinite/daily_check_in", // 每日签到 - "pages/infinite/bonus_house", // 福利屋 - "pages/other/prize_draw", // 每日奖品抽取 - "pages/shouye/danye", // 单页 - "pages/guize/guize", // 规则页面 - "pages/shouye/dada_ranking", // 达达排行榜 - "pages/shouye/yaoqing_ranking", // 邀请排行榜 - "pages/user/login" // 登录页面 + "pages/shouye/index", // 首页 + "pages/shouye/detail", // 详情页 + "pages/shouye/huanxiang", // 换箱页面 + "pages/mall/index", // 商城首页 + "pages/shouye/detail_wuxian", // 无限详情页 + "pages/sangdai/sangdai", // 盒柜页面 + "pages/infinite/index", // 福利首页 + "pages/user/index", // 用户中心 + "pages/infinite/daily_check_in", // 每日签到 + "pages/infinite/bonus_house", // 福利屋 + "pages/other/prize_draw", // 每日奖品抽取 + "pages/shouye/danye", // 单页 + "pages/guize/guize", // 规则页面 + "pages/shouye/dada_ranking", // 达达排行榜 + "pages/shouye/yaoqing_ranking", // 邀请排行榜 + "pages/user/login", // 登录页面 + "pages/shouye/slots" ]; // API白名单(不需要登录即可访问的API) export const apiWhiteList = [ - 'login_record', - 'api/warehouse_index', - 'api/user', - 'api/warehouse_send_record' + 'login_record', + 'api/warehouse_index', + 'api/user', + 'api/warehouse_send_record' ]; const defaultConfig = { - "good_type": [{ "value": 0, "sort_order": 0, "is_show": 1, "name": "全部", "pay_wechat": 1, "pay_balance": 1, "pay_currency": 1, "pay_currency2": 1, "pay_coupon": 1, "is_deduction": 1 }, { "value": 1, "sort_order": 1, "is_show": 0, "name": "一番赏", "pay_wechat": 1, "pay_balance": 1, "pay_currency": 1, "pay_currency2": 1, "pay_coupon": 1, "is_deduction": 1 }, { "value": 2, "sort_order": 2, "is_show": 1, "name": "无限赏", "pay_wechat": 1, "pay_balance": 1, "pay_currency": 1, "pay_currency2": 1, "pay_coupon": 1, "is_deduction": 1 }, { "value": 3, "sort_order": 3, "is_show": 0, "name": "擂台赏", "pay_wechat": 1, "pay_balance": 1, "pay_currency": 1, "pay_currency2": 1, "pay_coupon": 1, "is_deduction": 1 }, { "value": 5, "sort_order": 4, "is_show": 0, "name": "积分赏", "pay_wechat": 0, "pay_balance": 0, "pay_currency": 0, "pay_currency2": 1, "pay_coupon": 1, "is_deduction": 0 }, { "value": 6, "sort_order": 5, "is_show": 1, "name": "限时活动", "pay_wechat": 1, "pay_balance": 1, "pay_currency": 1, "pay_currency2": 1, "pay_coupon": 1, "is_deduction": 1 }, { "value": 8, "sort_order": 6, "is_show": 1, "name": "领主赏", "pay_wechat": 1, "pay_balance": 1, "pay_currency": 1, "pay_currency2": 1, "pay_coupon": 1, "is_deduction": 1 }, { "value": 9, "sort_order": 7, "is_show": 0, "name": "连击赏", "pay_wechat": 1, "pay_balance": 1, "pay_currency": 1, "pay_currency2": 1, "pay_coupon": 1, "is_deduction": 1 }, { "value": 10, "sort_order": 8, "is_show": 0, "name": "商城赏", "pay_wechat": 1, "pay_balance": 0, "pay_currency": 0, "pay_currency2": 1, "pay_coupon": 0, "is_deduction": 0 }, { "value": 11, "sort_order": 9, "is_show": 0, "name": "自制赏", "pay_wechat": 1, "pay_balance": 1, "pay_currency": 1, "pay_currency2": 1, "pay_coupon": 1, "is_deduction": 1 }, { "value": 15, "sort_order": 15, "is_show": 0, "name": "福利屋", "pay_wechat": 1, "pay_balance": 1, "pay_currency": 0, "pay_currency2": 0, "pay_coupon": 0, "is_deduction": 0 }, { "value": 16, "sort_order": 16, "is_show": 1, "name": "翻倍赏", "pay_wechat": 1, "pay_balance": 1, "pay_currency": 1, "pay_currency2": 1, "pay_coupon": 1, "is_deduction": 1 }, { "value": 17, "sort_order": 17, "is_show": 0, "name": "外卖盒子", "pay_wechat": 1, "pay_balance": 1, "pay_currency": 0, "pay_currency2": 0, "pay_coupon": 0, "is_deduction": 0 }], - "app_setting": { - "key": "app_setting", - "app_name": "友达赏", - "purchase_popup": "1", - "exchange_times": "2", - "balance_name": "钻石", - "balance_icon": "https://image.zfunbox.cn/app/icons/20250412/a482b527477e74f8a18ec02ebc7f0b4e.png", + "good_type": [{ + "value": 0, + "sort_order": 0, + "is_show": 1, + "name": "全部", + "pay_wechat": 1, + "pay_balance": 1, + "pay_currency": 1, + "pay_currency2": 1, + "pay_coupon": 1, + "is_deduction": 1 + }, { + "value": 1, + "sort_order": 1, + "is_show": 0, + "name": "一番赏", + "pay_wechat": 1, + "pay_balance": 1, + "pay_currency": 1, + "pay_currency2": 1, + "pay_coupon": 1, + "is_deduction": 1 + }, { + "value": 2, + "sort_order": 2, + "is_show": 1, + "name": "无限赏", + "pay_wechat": 1, + "pay_balance": 1, + "pay_currency": 1, + "pay_currency2": 1, + "pay_coupon": 1, + "is_deduction": 1 + }, { + "value": 3, + "sort_order": 3, + "is_show": 0, + "name": "擂台赏", + "pay_wechat": 1, + "pay_balance": 1, + "pay_currency": 1, + "pay_currency2": 1, + "pay_coupon": 1, + "is_deduction": 1 + }, { + "value": 5, + "sort_order": 4, + "is_show": 0, + "name": "积分赏", + "pay_wechat": 0, + "pay_balance": 0, + "pay_currency": 0, + "pay_currency2": 1, + "pay_coupon": 1, + "is_deduction": 0 + }, { + "value": 6, + "sort_order": 5, + "is_show": 1, + "name": "限时活动", + "pay_wechat": 1, + "pay_balance": 1, + "pay_currency": 1, + "pay_currency2": 1, + "pay_coupon": 1, + "is_deduction": 1 + }, { + "value": 8, + "sort_order": 6, + "is_show": 1, + "name": "领主赏", + "pay_wechat": 1, + "pay_balance": 1, + "pay_currency": 1, + "pay_currency2": 1, + "pay_coupon": 1, + "is_deduction": 1 + }, { + "value": 9, + "sort_order": 7, + "is_show": 0, + "name": "连击赏", + "pay_wechat": 1, + "pay_balance": 1, + "pay_currency": 1, + "pay_currency2": 1, + "pay_coupon": 1, + "is_deduction": 1 + }, { + "value": 10, + "sort_order": 8, + "is_show": 0, + "name": "商城赏", + "pay_wechat": 1, + "pay_balance": 0, + "pay_currency": 0, + "pay_currency2": 1, + "pay_coupon": 0, + "is_deduction": 0 + }, { + "value": 11, + "sort_order": 9, + "is_show": 0, + "name": "自制赏", + "pay_wechat": 1, + "pay_balance": 1, + "pay_currency": 1, + "pay_currency2": 1, + "pay_coupon": 1, + "is_deduction": 1 + }, { + "value": 15, + "sort_order": 15, + "is_show": 0, + "name": "福利屋", + "pay_wechat": 1, + "pay_balance": 1, + "pay_currency": 0, + "pay_currency2": 0, + "pay_coupon": 0, + "is_deduction": 0 + }, { + "value": 16, + "sort_order": 16, + "is_show": 1, + "name": "翻倍赏", + "pay_wechat": 1, + "pay_balance": 1, + "pay_currency": 1, + "pay_currency2": 1, + "pay_coupon": 1, + "is_deduction": 1 + }, { + "value": 17, + "sort_order": 17, + "is_show": 0, + "name": "外卖盒子", + "pay_wechat": 1, + "pay_balance": 1, + "pay_currency": 0, + "pay_currency2": 0, + "pay_coupon": 0, + "is_deduction": 0 + }], + "app_setting": { + "key": "app_setting", + "app_name": "友达赏", + "purchase_popup": "1", + "exchange_times": "2", + "balance_name": "钻石", + "balance_icon": "https://image.zfunbox.cn/app/icons/20250412/a482b527477e74f8a18ec02ebc7f0b4e.png", - "currency1_name": "UU币", - "currency1_icon": "https://image.zfunbox.cn/app/icons/20250412/3d1741965e9439372d1ce101bd110616.png", - "currency2_name": "达达券", - "currency2_icon": "https://image.zfunbox.cn/app/icons/20250412/19a9f69011fd82c85ab0df3a064a309c.png", - "win_audio": "https://image.zfunbox.cn/app/20250407/14ba53d367e1d131a344c6fd5cc0e28e.mp3", - "applet_version": "v1.0.3", - "sign_in_spend_limit": "1", - "show_dadajuan_limit": "0", - "waimai_box_id": "1049", - "daily_free_draw_id": "1050", - "cabinet_exchange_limit": "0", - "daily_coupon_limit": "0", - "update_time": 1745379501 - }, - version: wx_version + "currency1_name": "UU币", + "currency1_icon": "https://image.zfunbox.cn/app/icons/20250412/3d1741965e9439372d1ce101bd110616.png", + "currency2_name": "达达券", + "currency2_icon": "https://image.zfunbox.cn/app/icons/20250412/19a9f69011fd82c85ab0df3a064a309c.png", + "win_audio": "https://image.zfunbox.cn/app/20250407/14ba53d367e1d131a344c6fd5cc0e28e.mp3", + "applet_version": "v1.0.3", + "sign_in_spend_limit": "1", + "show_dadajuan_limit": "0", + "waimai_box_id": "1049", + "daily_free_draw_id": "1050", + "cabinet_exchange_limit": "0", + "daily_coupon_limit": "0", + "update_time": 1745379501 + }, + version: wx_version }; // 配置类 class ConfigManager { - static getShareImageUrl() { - return "https://image.zfunbox.cn/icon/fenxiang.jpg";//this.getAppSetting('share_image_url'); - } - /** - * 初始化并加载配置 - * 在应用启动时调用 - */ - static init() { - return this.loadConfig(); - } + static getShareImageUrl() { + return "https://image.zfunbox.cn/icon/fenxiang.jpg"; //this.getAppSetting('share_image_url'); + } + /** + * 初始化并加载配置 + * 在应用启动时调用 + */ + static init() { + return this.loadConfig(); + } - /** - * 加载配置数据 - * @returns {Promise} 返回加载完成的Promise - */ - static loadConfig() { - // 避免重复加载 - if (isLoading) { - return loadPromise; - } + /** + * 加载配置数据 + * @returns {Promise} 返回加载完成的Promise + */ + static loadConfig() { + // 避免重复加载 + if (isLoading) { + return loadPromise; + } - isLoading = true; - loadPromise = new Promise((resolve, reject) => { - RequestManager.get('config') - .then(res => { - if (res.status === 1 && res.data) { - configData = res.data; - console.log('全局配置数据加载成功'); - let _configData = uni.getStorageSync("configData"); - uni.setStorageSync('configData', configData); - if (_configData != null && _configData != '') { - if (_configData.app_setting.applet_version != configData.app_setting.applet_version) { - console.log('版本号不一致,需要更新'); - const updateManager = uni.getUpdateManager(); - uni.showModal({ - title: "更新提示", - content: "新版本已经准备好,是否重启应用?", - showCancel: false, - success(res) { - if (res.confirm) { - console.log('开始重启'); - wx.restartMiniProgram({ path: "/pages/shouye/index" }); - // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 - //updateManager.applyUpdate(); + isLoading = true; + loadPromise = new Promise((resolve, reject) => { + RequestManager.get('config') + .then(res => { + if (res.status === 1 && res.data) { + configData = res.data; + console.log('全局配置数据加载成功'); + let _configData = uni.getStorageSync("configData"); + uni.setStorageSync('configData', configData); + if (_configData != null && _configData != '') { + if (_configData.app_setting.applet_version != configData.app_setting + .applet_version) { + console.log('版本号不一致,需要更新'); + const updateManager = uni.getUpdateManager(); + uni.showModal({ + title: "更新提示", + content: "新版本已经准备好,是否重启应用?", + showCancel: false, + success(res) { + if (res.confirm) { + console.log('开始重启'); + wx.restartMiniProgram({ + path: "/pages/shouye/index" + }); + // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 + //updateManager.applyUpdate(); - //#ifdef MP-WEIXIN + //#ifdef MP-WEIXIN - //#endif - } - }, - }); - } - } - resolve(configData); - } else { - console.error('加载配置数据失败:', res.msg || '未知错误'); - reject(new Error(res.msg || '加载配置失败')); - } - }) - .catch(err => { - console.error('请求配置数据失败:', err); - isLoading = false; - reject(err); - }); - }); + //#endif + } + }, + }); + } + } + resolve(configData); + } else { + console.error('加载配置数据失败:', res.msg || '未知错误'); + reject(new Error(res.msg || '加载配置失败')); + } + }) + .catch(err => { + console.error('请求配置数据失败:', err); + isLoading = false; + reject(err); + }); + }); - return loadPromise; - } + return loadPromise; + } - /** - * 获取所有配置数据 - * @returns {Object} 配置数据对象 - */ - static getAll() { - if (configData) { - return configData; - } else { - console.warn('配置数据尚未加载,获取本地缓存中。。。'); - configData = uni.getStorageSync("configData"); - if (configData != null) { - return configData; - } - this.loadConfig(); - return {}; - } - } + /** + * 获取所有配置数据 + * @returns {Object} 配置数据对象 + */ + static getAll() { + if (configData) { + return configData; + } else { + console.warn('配置数据尚未加载,获取本地缓存中。。。'); + configData = uni.getStorageSync("configData"); + if (configData != null) { + return configData; + } + this.loadConfig(); + return {}; + } + } - /** - * 获取指定键的配置值 - * @param {String} key 配置键 - * @param {any} defaultValue 默认值,当键不存在时返回 - * @returns {any} 配置值 - */ - static get(key) { - if (!configData) { - console.warn('配置数据尚未加载,获取本地缓存中。。。'); - configData = uni.getStorageSync("configData"); - if (configData != null && configData != "") { - // 不直接返回configData,继续执行下面的代码 - } else { - configData = defaultConfig; - } + /** + * 获取指定键的配置值 + * @param {String} key 配置键 + * @param {any} defaultValue 默认值,当键不存在时返回 + * @returns {any} 配置值 + */ + static get(key) { + if (!configData) { + console.warn('配置数据尚未加载,获取本地缓存中。。。'); + configData = uni.getStorageSync("configData"); + if (configData != null && configData != "") { + // 不直接返回configData,继续执行下面的代码 + } else { + configData = defaultConfig; + } - } - return key in configData ? configData[key] : defaultConfig[key]; - } + } + return key in configData ? configData[key] : defaultConfig[key]; + } - /** - * 盒子类型 - * @returns {Object} 商品类型对象 - */ - static getGoodType() { - let goodType = this.get('good_type'); - if (goodType != null) { - if (this.GetVersion()) { - return goodType.filter(item => item.is_show === 1 && (item.value === 2 || item.value === 0)).map(item => { - return { - id: item.value, - title: item.name - } - }); - } - return goodType.filter(item => item.is_show === 1).map(item => { - // console.log(item); + /** + * 盒子类型 + * @returns {Object} 商品类型对象 + */ + static getGoodType() { + let goodType = this.get('good_type'); + if (goodType != null) { + if (this.GetVersion()) { + return goodType.filter(item => item.is_show === 1 && (item.value === 2 || item.value === 0)).map( + item => { + return { + id: item.value, + title: item.name + } + }); + } + return goodType.filter(item => item.is_show === 1).map(item => { + // console.log(item); - return { - id: item.value, - title: item.name - } - }); - } - return []; - } + return { + id: item.value, + title: item.name + } + }); + } + return []; + } - /** - * 获取指定盒子类型 - * @param {Number} type 盒子类型 - * @returns {Object} 盒子类型对象 - */ - static getGoodTypeFind(type) { - let goodType = this.get('good_type'); - if (goodType != null) { - return goodType.find(item => item.value == type); - } - } + /** + * 获取指定盒子类型 + * @param {Number} type 盒子类型 + * @returns {Object} 盒子类型对象 + */ + static getGoodTypeFind(type) { + let goodType = this.get('good_type'); + if (goodType != null) { + return goodType.find(item => item.value == type); + } + } - /** - * 刷新配置数据 - * @returns {Promise} 返回刷新完成的Promise - */ - static refresh() { - isLoading = false; - return this.loadConfig(); - } + /** + * 刷新配置数据 + * @returns {Promise} 返回刷新完成的Promise + */ + static refresh() { + isLoading = false; + return this.loadConfig(); + } - /** - * 检查配置是否已加载 - * @returns {Boolean} 是否已加载 - */ - static isLoaded() { - return configData !== null; - } + /** + * 检查配置是否已加载 + * @returns {Boolean} 是否已加载 + */ + static isLoaded() { + return configData !== null; + } - /** - * 获取应用设置 - * @param {String} key 设置键 - * @returns {Object|String|null} 设置值 - */ - static getAppSetting(key = null) { - let appSetting = this.get('app_setting'); - if (key == null) { - return appSetting; - } - return key in appSetting ? appSetting[key] : null; - } + /** + * 获取应用设置 + * @param {String} key 设置键 + * @returns {Object|String|null} 设置值 + */ + static getAppSetting(key = null) { + let appSetting = this.get('app_setting'); + if (key == null) { + return appSetting; + } + return key in appSetting ? appSetting[key] : null; + } - /** - * 获取指定键的配置值 - * @param {String} key 配置键 - * @param {any} defaultValue 默认值,当键不存在时返回 - * @returns {any} 配置值 - */ - static async getAsync(key, defaultValue = null) { - if (!configData) { - // console.warn('配置数据尚未加载,正在加载中...'); - await this.loadConfig(); - if (configData) { - return key in configData ? configData[key] : defaultValue;; - } - return defaultValue; - } + /** + * 获取指定键的配置值 + * @param {String} key 配置键 + * @param {any} defaultValue 默认值,当键不存在时返回 + * @returns {any} 配置值 + */ + static async getAsync(key, defaultValue = null) { + if (!configData) { + // console.warn('配置数据尚未加载,正在加载中...'); + await this.loadConfig(); + if (configData) { + return key in configData ? configData[key] : defaultValue;; + } + return defaultValue; + } - return key in configData ? configData[key] : defaultValue; - } + return key in configData ? configData[key] : defaultValue; + } - /** - * 获取应用设置 - * @param {String} key 设置键 - * @returns {Object|String|null} 设置值 - */ - static async getAppSettingAsync(key = null) { - let appSetting = await this.getAsync('app_setting'); - if (key == null) { - return appSetting; - } - return key in appSetting ? appSetting[key] : null; - } + /** + * 获取应用设置 + * @param {String} key 设置键 + * @returns {Object|String|null} 设置值 + */ + static async getAppSettingAsync(key = null) { + let appSetting = await this.getAsync('app_setting'); + if (key == null) { + return appSetting; + } + return key in appSetting ? appSetting[key] : null; + } - /** - * 获取版本号 - * @returns {Boolean} 是否为微信版本 - */ - static GetVersion() { - //#ifdef MP-WEIXIN - let version = this.get('version'); - if (version == wx_version) { - return true; - } - return false; - //#endif - return false; - } + /** + * 获取版本号 + * @returns {Boolean} 是否为微信版本 + */ + static GetVersion() { + //#ifdef MP-WEIXIN + let version = this.get('version'); + if (version == wx_version) { + return true; + } + return false; + //#endif + return false; + } } -export default ConfigManager; \ No newline at end of file +export default ConfigManager; \ No newline at end of file diff --git a/components/.DS_Store b/components/.DS_Store index 451cac961c2ab3330d279ef1130467092bf75c83..2177b3ab6848ef968cdb244bca8b30a700e3eb2b 100644 GIT binary patch delta 154 zcmZoMXfc=|#>CJ*u~2NHo}wrd0|Nsi1A_nqLpDPtgDyidLn1@o#6tDS1|lpTybKNu zISi#hK_p3rGN6*;l;Y%^r2PCGpmqixLW(wjWE5lD#3aSInVo~5186x=;5+kVei1`P PhRHTO(wk#MRxkqqBnc!V delta 301 zcmZoMXfc=|#>B`mu~2NHo}wr#0|Nsi1A_nqLq0<~LncEpLkUCX#D~l4K@vO+Sqw!C zx(qqUk_^cV#X0GQ!O8i#1wb`0fKzR5zKcszPJR+lA;;#GNpFW$O|NICY!MASL{qg zL^qFqEz*g|9BwKr3nNqPr}B`iocsIfa=hIxL&YRlRs-*3^n57ff&@r_1W14cNZ@A( z*trdxFG3kffCNZjAYlK80ynLxE!2M<2tEQpXGptY?Xv{5SOQv8TPQLxjaF#1s*fR- z_jYK>x|-TTqg^zI56w5LO))TycF}?jOsfk636Q{uz%=%qo&P)dr}=->!Yv7qz@HJ& z*>=C(;G^KmuPS@C4rS B5qAIp literal 0 HcmV?d00001 diff --git a/components/@lucky-canvas/uni/LICENSE b/components/@lucky-canvas/uni/LICENSE new file mode 100644 index 0000000..254bc4b --- /dev/null +++ b/components/@lucky-canvas/uni/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [2021] [Li Dong Qi] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/components/@lucky-canvas/uni/README.md b/components/@lucky-canvas/uni/README.md new file mode 100644 index 0000000..643a751 --- /dev/null +++ b/components/@lucky-canvas/uni/README.md @@ -0,0 +1,138 @@ +
+ +
+ logo +

lucky-canvas 抽奖插件

+

一个基于 JavaScript 的跨平台 ( 大转盘 / 九宫格 / 老虎机 ) 抽奖插件

+

+ + stars + + + forks + + + author + + + license + +

+
+ + +|适配框架|npm下载量|CDN使用量| +| :-: | :-: | :-: | +|[`JS` / `JQ` 中使用](https://100px.net/usage/js.html)|downloads|downloads| +|[`Vue` 中使用](https://100px.net/usage/vue.html)|downloads|downloads| +|[`React` 中使用](https://100px.net/usage/react.html)|downloads|-| +|[`UniApp` 中使用](https://100px.net/usage/uni.html)|downloads|-| +|[`Taro3.x` 中使用](https://100px.net/usage/taro.html)|downloads|-| +|[`微信小程序` 中使用](https://100px.net/usage/wx.html)|downloads|-| + +
+ +## 官方文档 & Demo演示 + +> **中文**:[https://100px.net](https://100px.net) + +> **English**:**If anyone can help translate the document, please contact me** `ldq404@qq.com` + +
+ +## 在 uni-app 中使用 + +### 1. 安装插件 + +- 你可以选择通过 `HBuilderX` 导入插件: [https://ext.dcloud.net.cn/plugin?id=3499](https://ext.dcloud.net.cn/plugin?id=3499) + +- 也可以选择通过 `npm` / `yarn` 安装 + +```shell +# npm 安装: +npm install @lucky-canvas/uni + +# yarn 安装: +yarn add @lucky-canvas/uni +``` + +
+ +### 2. 引入并使用 + +```html + + + + + + +``` + +```js +// npm 下载会默认到 node_modules 里面,直接引入包名即可 +import LuckyWheel from '@lucky-canvas/uni/lucky-wheel' // 大转盘 +import LuckyGrid from '@lucky-canvas/uni/lucky-grid' // 九宫格 + +// 如果你是通过 HBuilderX 导入插件,那你需要指定一下路径 +// import LuckyWheel from '@/components/@lucky-canvas/uni/lucky-wheel' // 大转盘 +// import LuckyGrid from '@/components/@lucky-canvas/uni/lucky-grid' // 九宫格 + +export default { + // 注册组件 + components: { LuckyWheel, LuckyGrid }, +} +``` + +
+ +### 3. 我提供了一个最基本的 demo 供你用于尝试 + +由于 uni-app 渲染 md 的时候会出问题,所以我把 demo 代码放到了文档里 + +- [https://100px.net/document/uni-app.html](https://100px.net/document/uni-app.html) + +
+ +### **4. 补充说明** + +- [**如果用着顺手, 可以在 Github 上面点个 支持一下(●'◡'●)**](https://github.com/buuing/lucky-canvas) + +- 另外: 如果你修复了某些bug或兼容, 欢迎提给我, 我会把你展示到官网的贡献者列表当中 + + +
+ +### 5. 常见问题 + +1. 转盘层级太高了, 我的弹窗盖不住怎么办? + +> 答: 因为小程序里canvas是原生组件顶层渲染, 我无法控制canvas的层级, 如果你想盖住它也肯简单, 你可以百度搜索``组件 + +2. 你这些素材, 图片组件从哪下载? + +> 答: 官网里的任何图片素材, 所使用到的图片资源均为学习交流使用, 请勿将其用于商业用途, 由此产生的任何商业纠纷我这边概不负责 + +3. xxx属性怎么使用? xxx方法怎么调用? + +> 答: 自己去看文档, 不然难道要我把代码给你写好吗? + +4. 这个属性的效果与官网的描述不一致? + +> 答: 可能有bug, 你可以去github上的issues去提问 (请认真填写模板) + +5. 为什么这个插件不支持app和其他小程序 + +> 答: 没时间, 但是希望志同道合的同学来一起参与uniapp的兼容开发 + +--- + +作者留言: 为了使我自己保持心情愉悦, 低于5星的提问我用浏览器插件都屏蔽了 diff --git a/components/@lucky-canvas/uni/lucky-grid.vue b/components/@lucky-canvas/uni/lucky-grid.vue new file mode 100644 index 0000000..0c5444f --- /dev/null +++ b/components/@lucky-canvas/uni/lucky-grid.vue @@ -0,0 +1,317 @@ + + + + + diff --git a/components/@lucky-canvas/uni/lucky-wheel.vue b/components/@lucky-canvas/uni/lucky-wheel.vue new file mode 100644 index 0000000..50bdb4d --- /dev/null +++ b/components/@lucky-canvas/uni/lucky-wheel.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/components/@lucky-canvas/uni/package.json b/components/@lucky-canvas/uni/package.json new file mode 100644 index 0000000..5ff3e1a --- /dev/null +++ b/components/@lucky-canvas/uni/package.json @@ -0,0 +1,23 @@ +{ + "name": "@lucky-canvas/uni", + "version": "0.0.10", + "description": "uni-app【大转盘 / 九宫格 / 老虎机】抽奖插件", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "uni-app抽奖" + ], + "files": [ + "lucky-wheel.vue", + "lucky-grid.vue", + "slot-machine.vue", + "utils.js", + "demo.vue" + ], + "author": "ldq ", + "license": "Apache-2.0", + "dependencies": { + "lucky-canvas": "~1.7.19" + } +} diff --git a/components/@lucky-canvas/uni/slot-machine.vue b/components/@lucky-canvas/uni/slot-machine.vue new file mode 100644 index 0000000..e40279b --- /dev/null +++ b/components/@lucky-canvas/uni/slot-machine.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/components/@lucky-canvas/uni/utils.js b/components/@lucky-canvas/uni/utils.js new file mode 100644 index 0000000..3b11952 --- /dev/null +++ b/components/@lucky-canvas/uni/utils.js @@ -0,0 +1,82 @@ +let windowWidth = uni.getSystemInfoSync().windowWidth +// uni-app@2.9起, 屏幕最多适配到960, 超出则按375计算 +if (windowWidth > 960) windowWidth = 375 + +export const rpx2px = (value) => { + if (typeof value === 'string') value = Number(value.replace(/[a-z]*/g, '')) + return windowWidth / 750 * value +} + +export const changeUnits = (value) => { + return Number(value.replace(/^(\-*[0-9.]*)([a-z%]*)$/, (value, num, unit) => { + switch (unit) { + case 'px': + num *= 1 + break + case 'rpx': + num = rpx2px(num) + break + default: + num *= 1 + break + } + return num + })) +} + +export const resolveImage = async (img, canvas, srcName = 'src', resolveName = '$resolve') => { + let imgObj + // 区分 H5 和小程序 + if (window) { + imgObj = new Image() + } else { + imgObj = canvas.createImage() + } + // 成功回调 + imgObj.onload = () => { + img[resolveName](imgObj) + } + // 失败回调 + imgObj.onerror = (err) => { + console.error(err) + // img['$reject']() + } + // 设置src + imgObj.src = img[srcName] +} + +// 旧版canvas引入图片的方法 +// export const resolveImage = async (res, img, imgName = 'src', resolveName = '$resolve') => { +// const src = img[imgName] +// const $resolve = img[resolveName] +// // #ifdef MP +// // 如果是base64就调用base64src()方法把图片写入本地, 然后渲染临时路径 +// if (/^data:image\/([a-z]+);base64,/.test(src)) { +// const path = await base64src(src) +// $resolve({ ...res.detail, path }) +// return +// } +// // #endif +// // 如果是本地图片, 直接返回 +// if (src.indexOf('http') !== 0) { +// $resolve({ ...res.detail, path:src }) +// return +// } +// // 如果是网络图片, 则通过getImageInfo()方法获取图片宽高 +// uni.getImageInfo({ +// src: src, +// success: (imgObj) => $resolve(imgObj), +// fail: () => console.error('API `uni.getImageInfo` 加载图片失败', src) +// }) +// } + +export function getImage(canvasId, canvas) { + return new Promise((resolve, reject) => { + uni.canvasToTempFilePath({ + canvas, + canvasId, + success: res => resolve(res), + fail: err => reject(err) + }, this) + }) +} diff --git a/components/canvas-prize-wheel/canvas-prize-wheel.vue b/components/canvas-prize-wheel/canvas-prize-wheel.vue new file mode 100644 index 0000000..a23b23d --- /dev/null +++ b/components/canvas-prize-wheel/canvas-prize-wheel.vue @@ -0,0 +1,689 @@ + + + + + \ No newline at end of file diff --git a/components/detail-lucky/detail-lucky.vue b/components/detail-lucky/detail-lucky.vue new file mode 100644 index 0000000..a61fc56 --- /dev/null +++ b/components/detail-lucky/detail-lucky.vue @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/components/lucky-canvas/LICENSE b/components/lucky-canvas/LICENSE new file mode 100644 index 0000000..254bc4b --- /dev/null +++ b/components/lucky-canvas/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [2021] [Li Dong Qi] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/components/lucky-canvas/README.md b/components/lucky-canvas/README.md new file mode 100644 index 0000000..c3840c3 --- /dev/null +++ b/components/lucky-canvas/README.md @@ -0,0 +1,42 @@ + + +
+ logo +

lucky-canvas 抽奖插件

+

一个基于 JavaScript 的跨平台 ( 大转盘 / 九宫格 / 老虎机 ) 抽奖插件

+

+ + stars + + + forks + + + author + + + license + +

+
+ +
+ +## 官方文档 & Demo演示 + +> **中文**:[https://100px.net/usage/js.html](https://100px.net/usage/js.html) + +> **English**:**If anyone can help translate the document, please contact me** `ldq404@qq.com` + + +
+ +## 在 JS / TS 中使用 + +- [跳转官网 查看详情](https://100px.net/usage/js.html) + +
+ +## 🙏🙏🙏 点个Star + +**如果您觉得这个项目还不错, 可以在 [Github](https://github.com/buuing/lucky-canvas) 上面帮我点个`star`, 支持一下作者 ☜(゚ヮ゚☜)** diff --git a/components/lucky-canvas/dist/index.cjs.js b/components/lucky-canvas/dist/index.cjs.js new file mode 100644 index 0000000..fc5cd11 --- /dev/null +++ b/components/lucky-canvas/dist/index.cjs.js @@ -0,0 +1,17 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}); +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +var t=function(e,i){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i])},t(e,i)};function e(e,i){if("function"!=typeof i&&null!==i)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");function n(){this.constructor=e}t(e,i),e.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}var i=function(){return i=Object.assign||function(t){for(var e,i=1,n=arguments.length;i0&&r[r.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!r||o[1]>r[0]&&o[1]>>0;if(0===n)return!1;var r,o,a=0|e,s=Math.max(a>=0?a:n-Math.abs(a),0);for(;sthis.length)&&-1!==this.indexOf(t,e)}),Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null==this)throw new TypeError('"this" is null or not defined');var e=Object(this),i=e.length>>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var n=arguments[1],r=0;r0){var n=t+i;return e.push(n),n}return e.push(NaN),t}),0),n=Math.random()*i;return e.findIndex((function(t){return n<=t}))},f=function(t,e,i,n){void 0===n&&(n=1/0),n<=0&&(n=1/0);for(var r="",o=[],a=t.measureText("...").width,s=0;sc&&(o.push(r.slice(0,-1)),r=e[s]),n===o.length)return o[o.length-1]+="...",o}return r&&o.push(r),o.length||o.push(e),o},d=function(){function t(){this.subs=[]}return t.prototype.addSub=function(t){this.subs.includes(t)||this.subs.push(t)},t.prototype.notify=function(){this.subs.forEach((function(t){t.update()}))},t}(),p="__proto__"in{};function g(t,e,i,n){Object.defineProperty(t,e,{value:i,enumerable:!!n,writable:!0,configurable:!0})}var v=Array.prototype,m=Object.create(v);["push","pop","shift","unshift","sort","splice","reverse"].forEach((function(t){m[t]=function(){for(var e=[],i=0;i '"+e.src+"' 不能为空或不合法"),"WEB"!==n.config.flag)return e[i]=r,void(e.$reject=o);var a=new Image;a.crossorigin="anonymous",a.onload=function(){return r(a)},a.onerror=function(){return o("=> '"+e.src+"' 图片加载失败")},a.src=t}))},t.prototype.drawImage=function(t,e){for(var i,n,r,a=[],s=2;sh/2&&(s=h/2),t.beginPath(),t.moveTo(n+s,r),t.lineTo(n+s,r),t.lineTo(n+o-s,r),t.arc(n+o-s,r+s,s,-c/2,0),t.lineTo(n+o,r+a-s),t.arc(n+o-s,r+a-s,s,0,c/2),t.lineTo(n+s,r+a),t.arc(n+s,r+a-s,s,c/2,c),t.lineTo(n,r+s),t.arc(n+s,r+s,s,c,-c/2),t.closePath()},A=function(t,e,i,n){return t>=n&&(t=n),i*(t/=n)*t+e},L=function(t,e,i,n){return t>=n&&(t=n),-i*(t/=n)*(t-2)+e},_=function(t){function o(e,i){var n,r=t.call(this,e,{width:i.width,height:i.height})||this;return r.blocks=[],r.prizes=[],r.buttons=[],r.defaultConfig={},r.defaultStyle={},r._defaultConfig={},r._defaultStyle={},r.Radius=0,r.prizeRadius=0,r.prizeDeg=0,r.prizeAng=0,r.rotateDeg=0,r.maxBtnRadius=0,r.startTime=0,r.endTime=0,r.stopDeg=0,r.endDeg=0,r.FPS=16.6,r.step=0,r.ImageCache=new Map,r.initData(i),r.initWatch(),r.initComputed(),null===(n=e.beforeCreate)||void 0===n||n.call(r),r.init(),r}return e(o,t),o.prototype.resize=function(){var e,i;t.prototype.resize.call(this),this.Radius=Math.min(this.boxWidth,this.boxHeight)/2,this.ctx.translate(this.Radius,this.Radius),this.draw(),null===(i=(e=this.config).afterResize)||void 0===i||i.call(e)},o.prototype.initLucky=function(){this.Radius=0,this.prizeRadius=0,this.prizeDeg=0,this.prizeAng=0,this.rotateDeg=0,this.maxBtnRadius=0,this.startTime=0,this.endTime=0,this.stopDeg=0,this.endDeg=0,this.FPS=16.6,this.prizeFlag=-1,this.step=0,t.prototype.initLucky.call(this)},o.prototype.initData=function(t){this.$set(this,"width",t.width),this.$set(this,"height",t.height),this.$set(this,"blocks",t.blocks||[]),this.$set(this,"prizes",t.prizes||[]),this.$set(this,"buttons",t.buttons||[]),this.$set(this,"defaultConfig",t.defaultConfig||{}),this.$set(this,"defaultStyle",t.defaultStyle||{}),this.$set(this,"startCallback",t.start),this.$set(this,"endCallback",t.end)},o.prototype.initComputed=function(){var t=this;this.$computed(this,"_defaultConfig",(function(){return i({gutter:"0px",offsetDegree:0,speed:20,speedFunction:"quad",accelerationTime:2500,decelerationTime:2500,stopRange:0},t.defaultConfig)})),this.$computed(this,"_defaultStyle",(function(){return i({fontSize:"18px",fontColor:"#000",fontStyle:"sans-serif",fontWeight:"400",background:"rgba(0,0,0,0)",wordWrap:!0,lengthLimit:"90%"},t.defaultStyle)}))},o.prototype.initWatch=function(){var t=this;this.$watch("width",(function(e){t.data.width=e,t.resize()})),this.$watch("height",(function(e){t.data.height=e,t.resize()})),this.$watch("blocks",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("prizes",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("buttons",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("defaultConfig",(function(){return t.draw()}),{deep:!0}),this.$watch("defaultStyle",(function(){return t.draw()}),{deep:!0}),this.$watch("startCallback",(function(){return t.init()})),this.$watch("endCallback",(function(){return t.init()}))},o.prototype.init=function(){var t,e;return n(this,void 0,void 0,(function(){var i;return r(this,(function(n){switch(n.label){case 0:return this.initLucky(),i=this.config,null===(t=i.beforeInit)||void 0===t||t.call(this),this.draw(),this.draw(),[4,this.initImageCache()];case 1:return n.sent(),null===(e=i.afterInit)||void 0===e||e.call(this),[2]}}))}))},o.prototype.initImageCache=function(){var t=this;return new Promise((function(e){var i={blocks:t.blocks.map((function(t){return t.imgs})),prizes:t.prizes.map((function(t){return t.imgs})),buttons:t.buttons.map((function(t){return t.imgs}))};Object.keys(i).forEach((function(n){var r=i[n],o=[];r&&r.forEach((function(e,i){e&&e.forEach((function(e,r){o.push(t.loadAndCacheImg(n,i,r))}))})),Promise.all(o).then((function(){t.draw(),e()}))}))}))},o.prototype.handleClick=function(t){var e,i=this.ctx;i.beginPath(),i.arc(0,0,this.maxBtnRadius,0,2*Math.PI,!1),i.isPointInPath(t.offsetX,t.offsetY)&&0===this.step&&(null===(e=this.startCallback)||void 0===e||e.call(this,t))},o.prototype.loadAndCacheImg=function(t,e,i){return n(this,void 0,void 0,(function(){var o=this;return r(this,(function(a){return[2,new Promise((function(a,s){var h=o[t][e];if(h&&h.imgs){var c=h.imgs[i];c&&o.loadImg(c.src,c).then((function(t){return n(o,void 0,void 0,(function(){return r(this,(function(e){switch(e.label){case 0:return"function"!=typeof c.formatter?[3,2]:[4,Promise.resolve(c.formatter.call(this,t))];case 1:t=e.sent(),e.label=2;case 2:return this.ImageCache.set(c.src,t),a(),[2]}}))}))})).catch((function(n){console.error(t+"["+e+"].imgs["+i+"] "+n),s()}))}}))]}))}))},o.prototype.drawBlock=function(t,e,i){var n=this,r=this.ctx;c(e.background)&&(r.beginPath(),r.fillStyle=e.background,r.arc(0,0,t,0,2*Math.PI,!1),r.fill()),e.imgs&&e.imgs.forEach((function(e,i){var o=n.ImageCache.get(e.src);if(o){var a=n.computedWidthAndHeight(o,e,2*t,2*t),s=a[0],h=a[1],c=[n.getOffsetX(s)+n.getLength(e.left,2*t),n.getLength(e.top,2*t)-t],l=c[0],u=c[1];r.save(),e.rotate&&r.rotate(x(n.rotateDeg)),n.drawImage(r,o,l,u,s,h),r.restore()}}))},o.prototype.draw=function(){var t,e,i=this,n=this,r=n.config,o=n.ctx,a=n._defaultConfig,l=n._defaultStyle;null===(t=r.beforeDraw)||void 0===t||t.call(this,o),o.clearRect(-this.Radius,-this.Radius,2*this.Radius,2*this.Radius),this.prizeRadius=this.blocks.reduce((function(t,e,n){return i.drawBlock(t,e,n),t-i.getLength(e.padding&&e.padding.split(" ")[0])}),this.Radius),this.prizeDeg=360/this.prizes.length,this.prizeAng=x(this.prizeDeg);var u=this.prizeRadius*Math.sin(this.prizeAng/2)*2,d=x(this.rotateDeg-90+this.prizeDeg/2+a.offsetDegree),p=function(t,e){return i.getOffsetX(o.measureText(e).width)+i.getLength(t.left,u)},g=function(t,e,n){var r=t.lineHeight||l.lineHeight||t.fontSize||l.fontSize;return i.getLength(t.top,e)+(n+1)*i.getLength(r)};o.save(),this.prizes.forEach((function(t,e){var n=d+e*i.prizeAng,r=i.prizeRadius-i.maxBtnRadius,v=t.background||l.background;c(v)&&(o.fillStyle=v,k(o,i.maxBtnRadius,i.prizeRadius,n-i.prizeAng/2,n+i.prizeAng/2,i.getLength(a.gutter)),o.fill());var m=Math.cos(n)*i.prizeRadius,w=Math.sin(n)*i.prizeRadius;o.translate(m,w),o.rotate(n+x(90)),t.imgs&&t.imgs.forEach((function(t,e){var n=i.ImageCache.get(t.src);if(n){var a=i.computedWidthAndHeight(n,t,i.prizeAng*i.prizeRadius,r),s=a[0],h=a[1],c=[i.getOffsetX(s)+i.getLength(t.left,u),i.getLength(t.top,r)],l=c[0],f=c[1];i.drawImage(o,n,l,f,s,h)}})),t.fonts&&t.fonts.forEach((function(t){var e=t.fontColor||l.fontColor,n=t.fontWeight||l.fontWeight,c=i.getLength(t.fontSize||l.fontSize),u=t.fontStyle||l.fontStyle,d=s(t,"wordWrap")?t.wordWrap:l.wordWrap,v=t.lengthLimit||l.lengthLimit,m=t.lineClamp||l.lineClamp;o.fillStyle=e,o.font=n+" "+(c>>0)+"px "+u;var w=String(t.text);(d?f(o,h(w),(function(e){var n=2*((i.prizeRadius-g(t,r,e.length))*Math.tan(i.prizeAng/2))-i.getLength(a.gutter);return i.getLength(v,n)}),m):w.split("\n")).filter((function(t){return!!t})).forEach((function(e,i){o.fillText(e,p(t,e),g(t,r,i))}))})),o.rotate(x(360)-n-x(90)),o.translate(-m,-w)})),o.restore(),this.buttons.forEach((function(t,e){var n=i.getLength(t.radius,i.prizeRadius);i.maxBtnRadius=Math.max(i.maxBtnRadius,n),c(t.background)&&(o.beginPath(),o.fillStyle=t.background,o.arc(0,0,n,0,2*Math.PI,!1),o.fill()),t.pointer&&c(t.background)&&(o.beginPath(),o.fillStyle=t.background,o.moveTo(-n,0),o.lineTo(n,0),o.lineTo(0,2*-n),o.closePath(),o.fill()),t.imgs&&t.imgs.forEach((function(t,e){var r=i.ImageCache.get(t.src);if(r){var a=i.computedWidthAndHeight(r,t,2*n,2*n),s=a[0],h=a[1],c=[i.getOffsetX(s)+i.getLength(t.left,n),i.getLength(t.top,n)],l=c[0],u=c[1];i.drawImage(o,r,l,u,s,h)}})),t.fonts&&t.fonts.forEach((function(t){var e=t.fontColor||l.fontColor,r=t.fontWeight||l.fontWeight,a=i.getLength(t.fontSize||l.fontSize),s=t.fontStyle||l.fontStyle;o.fillStyle=e,o.font=r+" "+(a>>0)+"px "+s,String(t.text).split("\n").forEach((function(e,i){o.fillText(e,p(t,e),g(t,n,i))}))}))})),null===(e=r.afterDraw)||void 0===e||e.call(this,o)},o.prototype.carveOnGunwaleOfAMovingBoat=function(){var t=this,e=t._defaultConfig,i=t.prizeFlag,n=t.prizeDeg,r=t.rotateDeg;this.endTime=Date.now();for(var o=this.stopDeg=r,a=e.speed,s=(Math.random()*n-n/2)*this.getLength(e.stopRange),h=0,c=0,l=0;++h;){var u=360*h-i*n-r-e.offsetDegree+s-n/2,f=L(this.FPS,o,u,e.decelerationTime)-o;if(f>a){this.endDeg=a-c>f-a?u:l;break}l=u,c=f}},o.prototype.play=function(){var t,e;0===this.step&&(this.startTime=Date.now(),this.prizeFlag=void 0,this.step=1,null===(e=(t=this.config).afterStart)||void 0===e||e.call(t),this.run())},o.prototype.stop=function(t){if(0!==this.step&&3!==this.step){if(!t&&0!==t){var e=this.prizes.map((function(t){return t.range}));t=u(e)}t<0?(this.step=0,this.prizeFlag=-1):(this.step=2,this.prizeFlag=t%this.prizes.length)}},o.prototype.run=function(t){var e;void 0===t&&(t=0);var i=this,n=i.rAF,r=i.step,o=i.prizeFlag,a=i._defaultConfig,s=a.accelerationTime,h=a.decelerationTime,c=a.speed;if(0!==r){if(-1!==o){3!==r||this.endDeg||this.carveOnGunwaleOfAMovingBoat();var l=Date.now()-this.startTime,u=Date.now()-this.endTime,f=this.rotateDeg;if(1===r||l=0&&(this.step=3,this.stopDeg=0,this.endDeg=0)):3===r?(f=L(u,this.stopDeg,this.endDeg,h),u>=h&&(this.step=0)):this.stop(-1);this.rotateDeg=f,this.draw(),n(this.run.bind(this,t+1))}}else null===(e=this.endCallback)||void 0===e||e.call(this,this.prizes.find((function(t,e){return e===o}))||{})},o.prototype.conversionAxis=function(t,e){var i=this.config;return[t/i.dpr-this.Radius,e/i.dpr-this.Radius]},o}(z),T=function(t){function a(e,i){var n,r=t.call(this,e,{width:i.width,height:i.height})||this;return r.rows=3,r.cols=3,r.blocks=[],r.prizes=[],r.buttons=[],r.defaultConfig={},r.defaultStyle={},r.activeStyle={},r._defaultConfig={},r._defaultStyle={},r._activeStyle={},r.cellWidth=0,r.cellHeight=0,r.startTime=0,r.endTime=0,r.currIndex=0,r.stopIndex=0,r.endIndex=0,r.demo=!1,r.timer=0,r.FPS=16.6,r.step=0,r.prizeFlag=-1,r.cells=[],r.ImageCache=new Map,r.initData(i),r.initWatch(),r.initComputed(),null===(n=e.beforeCreate)||void 0===n||n.call(r),r.init(),r}return e(a,t),a.prototype.resize=function(){var e,i;t.prototype.resize.call(this),this.draw(),null===(i=(e=this.config).afterResize)||void 0===i||i.call(e)},a.prototype.initLucky=function(){this.cellWidth=0,this.cellHeight=0,this.startTime=0,this.endTime=0,this.currIndex=0,this.stopIndex=0,this.endIndex=0,this.demo=!1,this.timer=0,this.FPS=16.6,this.prizeFlag=-1,this.step=0,t.prototype.initLucky.call(this)},a.prototype.initData=function(t){this.$set(this,"width",t.width),this.$set(this,"height",t.height),this.$set(this,"rows",Number(t.rows)||3),this.$set(this,"cols",Number(t.cols)||3),this.$set(this,"blocks",t.blocks||[]),this.$set(this,"prizes",t.prizes||[]),this.$set(this,"buttons",t.buttons||[]),this.$set(this,"button",t.button),this.$set(this,"defaultConfig",t.defaultConfig||{}),this.$set(this,"defaultStyle",t.defaultStyle||{}),this.$set(this,"activeStyle",t.activeStyle||{}),this.$set(this,"startCallback",t.start),this.$set(this,"endCallback",t.end)},a.prototype.initComputed=function(){var t=this;this.$computed(this,"_defaultConfig",(function(){var e=i({gutter:5,speed:20,accelerationTime:2500,decelerationTime:2500},t.defaultConfig);return e.gutter=t.getLength(e.gutter),e.speed=e.speed/40,e})),this.$computed(this,"_defaultStyle",(function(){return i({borderRadius:20,fontColor:"#000",fontSize:"18px",fontStyle:"sans-serif",fontWeight:"400",background:"rgba(0,0,0,0)",shadow:"",wordWrap:!0,lengthLimit:"90%"},t.defaultStyle)})),this.$computed(this,"_activeStyle",(function(){return i({background:"#ffce98",shadow:""},t.activeStyle)}))},a.prototype.initWatch=function(){var t=this;this.$watch("width",(function(e){t.data.width=e,t.resize()})),this.$watch("height",(function(e){t.data.height=e,t.resize()})),this.$watch("blocks",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("prizes",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("buttons",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("rows",(function(){return t.init()})),this.$watch("cols",(function(){return t.init()})),this.$watch("defaultConfig",(function(){return t.draw()}),{deep:!0}),this.$watch("defaultStyle",(function(){return t.draw()}),{deep:!0}),this.$watch("activeStyle",(function(){return t.draw()}),{deep:!0}),this.$watch("startCallback",(function(){return t.init()})),this.$watch("endCallback",(function(){return t.init()}))},a.prototype.init=function(){var t,e;return n(this,void 0,void 0,(function(){var i;return r(this,(function(n){switch(n.label){case 0:return this.initLucky(),i=this.config,null===(t=i.beforeInit)||void 0===t||t.call(this),this.draw(),[4,this.initImageCache()];case 1:return n.sent(),null===(e=i.afterInit)||void 0===e||e.call(this),[2]}}))}))},a.prototype.initImageCache=function(){var t=this;return new Promise((function(e){var i=t.buttons.map((function(t){return t.imgs}));t.button&&i.push(t.button.imgs);var n={blocks:t.blocks.map((function(t){return t.imgs})),prizes:t.prizes.map((function(t){return t.imgs})),buttons:i};Object.keys(n).forEach((function(i){var r=n[i],o=[];r&&r.forEach((function(e,n){e&&e.forEach((function(e,r){o.push(t.loadAndCacheImg(i,n,r))}))})),Promise.all(o).then((function(){t.draw(),e()}))}))}))},a.prototype.handleClick=function(t){var e=this,i=this.ctx;o(o([],this.buttons),[this.button]).forEach((function(n){var r;if(n){var o=e.getGeometricProperty([n.x,n.y,n.col||1,n.row||1]),a=o[0],s=o[1],h=o[2],c=o[3];i.beginPath(),i.rect(a,s,h,c),i.isPointInPath(t.offsetX,t.offsetY)&&0===e.step&&("function"==typeof n.callback&&n.callback.call(e,n),null===(r=e.startCallback)||void 0===r||r.call(e,t,n))}}))},a.prototype.loadAndCacheImg=function(t,e,i){return n(this,void 0,void 0,(function(){var o=this;return r(this,(function(a){return[2,new Promise((function(a,s){var h=o[t][e];if("buttons"===t&&!o.buttons.length&&o.button&&(h=o.button),h&&h.imgs){var c=h.imgs[i];if(c){var l=[o.loadImg(c.src,c),c.activeSrc&&o.loadImg(c.activeSrc,c,"$activeResolve")];Promise.all(l).then((function(t){var e=t[0],i=t[1];return n(o,void 0,void 0,(function(){var t;return r(this,(function(n){switch(n.label){case 0:return"function"!=typeof(t=c.formatter)?[3,3]:[4,Promise.resolve(t.call(this,e))];case 1:return e=n.sent(),i?[4,Promise.resolve(t.call(this,i))]:[3,3];case 2:i=n.sent(),n.label=3;case 3:return this.ImageCache.set(c.src,e),i&&this.ImageCache.set(c.activeSrc,i),a(),[2]}}))}))})).catch((function(n){console.error(t+"["+e+"].imgs["+i+"] "+n),s()}))}}}))]}))}))},a.prototype.draw=function(){var t,e,i=this,n=this,r=n.config,a=n.ctx,u=n._defaultConfig,d=n._defaultStyle,p=n._activeStyle;null===(t=r.beforeDraw)||void 0===t||t.call(this,a),a.clearRect(0,0,this.boxWidth,this.boxHeight),this.cells=o(o([],this.prizes),this.buttons),this.button&&this.cells.push(this.button),this.cells.forEach((function(t){t.col=t.col||1,t.row=t.row||1})),this.prizeArea=this.blocks.reduce((function(t,e,n){var r=t.x,o=t.y,s=t.w,h=t.h,u=l(e,i.getLength.bind(i)),f=u[0],d=u[1],p=u[2],g=u[3],v=e.borderRadius?i.getLength(e.borderRadius):0,m=e.background;return c(m)&&(a.fillStyle=i.handleBackground(r,o,s,h,m),I(a,r,o,s,h,v),a.fill()),e.imgs&&e.imgs.forEach((function(t,e){var n=i.ImageCache.get(t.src);if(n){var c=i.computedWidthAndHeight(n,t,s,h),l=c[0],u=c[1],f=[i.getOffsetX(l,s)+i.getLength(t.left,s),i.getLength(t.top,h)],d=f[0],p=f[1];i.drawImage(a,n,r+d,o+p,l,u)}})),{x:r+p,y:o+f,w:s-p-g,h:h-f-d}}),{x:0,y:0,w:this.boxWidth,h:this.boxHeight}),this.cellWidth=(this.prizeArea.w-u.gutter*(this.cols-1))/this.cols,this.cellHeight=(this.prizeArea.h-u.gutter*(this.rows-1))/this.rows,this.cells.forEach((function(t,e){var n=i.getGeometricProperty([t.x,t.y,t.col,t.row]),o=n[0],l=n[1],u=n[2],g=n[3],v=!1;(void 0===i.prizeFlag||i.prizeFlag>-1)&&(v=e===i.currIndex%i.prizes.length>>0);var m=v?p.background:t.background||d.background;if(c(m)){var w=(v?p.shadow:t.shadow||d.shadow).replace(/px/g,"").split(",")[0].split(" ").map((function(t,e){return e<3?Number(t):t}));4===w.length&&(a.shadowColor=w[3],a.shadowOffsetX=w[0]*r.dpr,a.shadowOffsetY=w[1]*r.dpr,a.shadowBlur=w[2],w[0]>0?u-=w[0]:(u+=w[0],o-=w[0]),w[1]>0?g-=w[1]:(g+=w[1],l-=w[1])),a.fillStyle=i.handleBackground(o,l,u,g,m);var y=i.getLength(t.borderRadius?t.borderRadius:d.borderRadius);I(a,o,l,u,g,y),a.fill(),a.shadowColor="rgba(0, 0, 0, 0)",a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0}e>=i.prizes.length&&(e-=i.prizes.length),t.imgs&&t.imgs.forEach((function(t,e){var n=i.ImageCache.get(t.src),r=i.ImageCache.get(t.activeSrc);if(n){var s=v&&r||n;if(s){var h=i.computedWidthAndHeight(s,t,u,g),c=h[0],f=h[1],d=[o+i.getOffsetX(c,u)+i.getLength(t.left,u),l+i.getLength(t.top,g)],p=d[0],m=d[1];i.drawImage(a,s,p,m,c,f)}}})),t.fonts&&t.fonts.forEach((function(t){var e=v&&p.fontStyle?p.fontStyle:t.fontStyle||d.fontStyle,n=v&&p.fontWeight?p.fontWeight:t.fontWeight||d.fontWeight,r=v&&p.fontSize?i.getLength(p.fontSize):i.getLength(t.fontSize||d.fontSize),c=v&&p.lineHeight?p.lineHeight:t.lineHeight||d.lineHeight||t.fontSize||d.fontSize,m=s(t,"wordWrap")?t.wordWrap:d.wordWrap,w=t.lengthLimit||d.lengthLimit,y=t.lineClamp||d.lineClamp;a.font=n+" "+(r>>0)+"px "+e,a.fillStyle=v&&p.fontColor?p.fontColor:t.fontColor||d.fontColor;var b=[],S=String(t.text);if(m){var C=i.getLength(w,u);b=f(a,h(S),(function(){return C}),y)}else b=S.split("\n");b.forEach((function(e,n){a.fillText(e,o+i.getOffsetX(a.measureText(e).width,u)+i.getLength(t.left,u),l+i.getLength(t.top,g)+(n+1)*i.getLength(c))}))}))})),null===(e=r.afterDraw)||void 0===e||e.call(this,a)},a.prototype.handleBackground=function(t,e,i,n,r){var o=this.ctx;return r.includes("linear-gradient")&&(r=function(t,e,i,n,r,o){var a=/linear-gradient\((.+)\)/.exec(o)[1].split(",").map((function(t){return t.trim()})),s=a.shift(),h=[0,0,0,0];if(s.includes("deg")){var c=function(t){return Math.tan(t/180*Math.PI)};(s=s.slice(0,-3)%360)>=0&&s<45?h=[e,i+r,e+n,i+r-n*c(s-0)]:s>=45&&s<90?h=[e,i+r,e+n-r*c(s-45),i]:s>=90&&s<135?h=[e+n,i+r,e+n-r*c(s-90),i]:s>=135&&s<180?h=[e+n,i+r,e,i+n*c(s-135)]:s>=180&&s<225?h=[e+n,i,e,i+n*c(s-180)]:s>=225&&s<270?h=[e+n,i,e+r*c(s-225),i+r]:s>=270&&s<315?h=[e,i,e+r*c(s-270),i+r]:s>=315&&s<360&&(h=[e,i,e+n,i+r-n*c(s-315)])}else s.includes("top")?h=[e,i+r,e,i]:s.includes("bottom")?h=[e,i,e,i+r]:s.includes("left")?h=[e+n,i,e,i]:s.includes("right")&&(h=[e,i,e+n,i]);var l=t.createLinearGradient.apply(t,h.map((function(t){return t>>0})));return a.reduce((function(t,e,i){var n=e.split(" ");return 1===n.length?t.addColorStop(i,n[0]):2===n.length&&t.addColorStop.apply(t,n),t}),l)}(o,t,e,i,n,r)),r},a.prototype.carveOnGunwaleOfAMovingBoat=function(){var t=this,e=t._defaultConfig,i=t.prizeFlag,n=t.currIndex;this.endTime=Date.now();for(var r=this.stopIndex=n,o=e.speed,a=0,s=0,h=0;++a;){var c=this.prizes.length*a+i-r,l=L(this.FPS,r,c,e.decelerationTime)-r;if(l>o){this.endIndex=o-s>l-o?c:h;break}h=c,s=l}},a.prototype.play=function(){var t,e;0===this.step&&(this.startTime=Date.now(),this.prizeFlag=void 0,this.step=1,null===(e=(t=this.config).afterStart)||void 0===e||e.call(t),this.run())},a.prototype.stop=function(t){if(0!==this.step&&3!==this.step){if(!t&&0!==t){var e=this.prizes.map((function(t){return t.range}));t=u(e)}t<0?(this.step=0,this.prizeFlag=-1):(this.step=2,this.prizeFlag=t%this.prizes.length)}},a.prototype.run=function(t){var e;void 0===t&&(t=0);var i=this,n=i.rAF,r=i.step,o=i.prizes,a=i.prizeFlag,s=i._defaultConfig,h=s.accelerationTime,c=s.decelerationTime,l=s.speed;if(0!==r){if(-1!==a){3!==r||this.endIndex||this.carveOnGunwaleOfAMovingBoat();var u=Date.now()-this.startTime,f=Date.now()-this.endTime,d=this.currIndex;if(1===r||u=0&&(this.step=3,this.stopIndex=0,this.endIndex=0)):3===r?(d=L(f,this.stopIndex,this.endIndex,c),f>=c&&(this.step=0)):this.stop(-1);this.currIndex=d,this.draw(),n(this.run.bind(this,t+1))}}else null===(e=this.endCallback)||void 0===e||e.call(this,this.prizes.find((function(t,e){return e===a}))||{})},a.prototype.getGeometricProperty=function(t){var e=t[0],i=t[1],n=t[2],r=void 0===n?1:n,o=t[3],a=void 0===o?1:o,s=this.cellWidth,h=this.cellHeight,c=this._defaultConfig.gutter,l=[this.prizeArea.x+(s+c)*e,this.prizeArea.y+(h+c)*i];return r&&a&&l.push(s*r+c*(r-1),h*a+c*(a-1)),l},a.prototype.conversionAxis=function(t,e){var i=this.config;return[t/i.dpr,e/i.dpr]},a}(z),W=function(t){function o(e,i){var n,r=t.call(this,e,{width:i.width,height:i.height})||this;return r.blocks=[],r.prizes=[],r.slots=[],r.defaultConfig={},r._defaultConfig={},r.defaultStyle={},r._defaultStyle={},r.endCallback=function(){},r.cellWidth=0,r.cellHeight=0,r.cellAndSpacing=0,r.widthAndSpacing=0,r.heightAndSpacing=0,r.FPS=16.6,r.scroll=[],r.stopScroll=[],r.endScroll=[],r.startTime=0,r.endTime=0,r.step=0,r.prizeFlag=void 0,r.ImageCache=new Map,r.initData(i),r.initWatch(),r.initComputed(),null===(n=e.beforeCreate)||void 0===n||n.call(r),r.init(),r}return e(o,t),o.prototype.resize=function(){var e,i;t.prototype.resize.call(this),this.draw(),null===(i=(e=this.config).afterResize)||void 0===i||i.call(e)},o.prototype.initLucky=function(){this.cellWidth=0,this.cellHeight=0,this.cellAndSpacing=0,this.widthAndSpacing=0,this.heightAndSpacing=0,this.FPS=16.6,this.scroll=[],this.stopScroll=[],this.endScroll=[],this.startTime=0,this.endTime=0,this.prizeFlag=void 0,this.step=0,t.prototype.initLucky.call(this)},o.prototype.initData=function(t){this.$set(this,"width",t.width),this.$set(this,"height",t.height),this.$set(this,"blocks",t.blocks||[]),this.$set(this,"prizes",t.prizes||[]),this.$set(this,"slots",t.slots||[]),this.$set(this,"defaultConfig",t.defaultConfig||{}),this.$set(this,"defaultStyle",t.defaultStyle||{}),this.$set(this,"endCallback",t.end)},o.prototype.initComputed=function(){var t=this;this.$computed(this,"_defaultConfig",(function(){var e=i({mode:"vertical",rowSpacing:0,colSpacing:5,speed:20,direction:1,accelerationTime:2500,decelerationTime:2500},t.defaultConfig);return e.rowSpacing=t.getLength(e.rowSpacing),e.colSpacing=t.getLength(e.colSpacing),e})),this.$computed(this,"_defaultStyle",(function(){return i({borderRadius:0,fontColor:"#000",fontSize:"18px",fontStyle:"sans-serif",fontWeight:"400",background:"rgba(0,0,0,0)",wordWrap:!0,lengthLimit:"90%"},t.defaultStyle)}))},o.prototype.initWatch=function(){var t=this;this.$watch("width",(function(e){t.data.width=e,t.resize()})),this.$watch("height",(function(e){t.data.height=e,t.resize()})),this.$watch("blocks",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("prizes",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("slots",(function(e){t.drawOffscreenCanvas(),t.draw()}),{deep:!0}),this.$watch("defaultConfig",(function(){return t.draw()}),{deep:!0}),this.$watch("defaultStyle",(function(){return t.draw()}),{deep:!0}),this.$watch("endCallback",(function(){return t.init()}))},o.prototype.init=function(){var t,e;return n(this,void 0,void 0,(function(){var i;return r(this,(function(n){switch(n.label){case 0:return this.initLucky(),i=this.config,null===(t=i.beforeInit)||void 0===t||t.call(this),this.drawOffscreenCanvas(),this.draw(),[4,this.initImageCache()];case 1:return n.sent(),null===(e=i.afterInit)||void 0===e||e.call(this),[2]}}))}))},o.prototype.initImageCache=function(){var t=this;return new Promise((function(e){var i={blocks:t.blocks.map((function(t){return t.imgs})),prizes:t.prizes.map((function(t){return t.imgs}))};Object.keys(i).forEach((function(n){var r=i[n],o=[];r&&r.forEach((function(e,i){e&&e.forEach((function(e,r){o.push(t.loadAndCacheImg(n,i,r))}))})),Promise.all(o).then((function(){t.drawOffscreenCanvas(),t.draw(),e()}))}))}))},o.prototype.loadAndCacheImg=function(t,e,i){return n(this,void 0,void 0,(function(){var o=this;return r(this,(function(a){return[2,new Promise((function(a,s){var h=o[t][e];if(h&&h.imgs){var c=h.imgs[i];c&&o.loadImg(c.src,c).then((function(t){return n(o,void 0,void 0,(function(){return r(this,(function(e){switch(e.label){case 0:return"function"!=typeof c.formatter?[3,2]:[4,Promise.resolve(c.formatter.call(this,t))];case 1:t=e.sent(),e.label=2;case 2:return this.ImageCache.set(c.src,t),a(),[2]}}))}))})).catch((function(n){console.error(t+"["+e+"].imgs["+i+"] "+n),s()}))}}))]}))}))},o.prototype.drawOffscreenCanvas=function(){var t=this,e=this._defaultConfig,i=this._defaultStyle,n=this.drawBlocks(),r=n.w,o=n.h,a=this.prizes.length,l=this.displacementWidthOrHeight(),u=l.cellWidth,d=l.cellHeight,p=l.widthAndSpacing,g=l.heightAndSpacing,v=new Array(a).fill(void 0).map((function(t,e){return e})),m=0,w=0;this.slots.forEach((function(e,i){void 0===t.scroll[i]&&(t.scroll[i]=0),e.order=e.order||v;var n=e.order.length;m=Math.max(m,r+p*n),w=Math.max(w,o+g*n)}));var y=this.getOffscreenCanvas(m,w),b=y._offscreenCanvas,S=y._ctx;this._offscreenCanvas=b,this.slots.forEach((function(n,r){var o=u*r,a=d*r,l=0,v=function(t,e){for(var i={},n=[],r=0;r>0)+"px "+n,S.fillStyle=e.fontColor||i.fontColor;var g=[],v=String(e.text);if(c){var m=t.getLength(l,u);g=f(S,h(v),(function(){return m}),p)}else g=v.split("\n");g.forEach((function(i,n){S.fillText(i,b+t.getOffsetX(S.measureText(i).width,u)+t.getLength(e.left,u),C+t.getLength(e.top,d)+(n+1)*t.getLength(a))}))}))}}));for(var m=t.displacement([o,0,u,l],[0,a,l,d]),y=m[0],C=m[1],z=m[2],x=m[3],k=l;kn&&(l%=n);var v=e.displacement([u*i,l,u,c],[l,f*i,h,f]),m=v[0],w=v[1],y=v[2],b=v[3],S=e.displacement([a+p*i,s,u,c],[a,s+g*i,h,f]),C=S[0],z=S[1],x=S[2],k=S[3];e.drawImage(r,e._offscreenCanvas,m,w,y,b,C,z,x,k)}))}},o.prototype.carveOnGunwaleOfAMovingBoat=function(){var t=this,e=this,i=e._defaultConfig,n=e.prizeFlag,r=e.cellAndSpacing;this.endTime=Date.now(),this.slots.forEach((function(e,o){var a=e.order;if(a.length)for(var s=e.speed||i.speed,h=e.direction||i.direction,c=a.findIndex((function(t){return t===n[o]})),l=r*a.length,u=t.stopScroll[o]=t.scroll[o],f=0;++f;){var d=r*c+l*f*h-u,p=L(t.FPS,u,d,i.decelerationTime)-u;if(Math.abs(p)>s){t.endScroll[o]=d;break}}}))},o.prototype.play=function(){var t,e;0===this.step&&(this.startTime=Date.now(),this.prizeFlag=void 0,this.step=1,null===(e=(t=this.config).afterStart)||void 0===e||e.call(t),this.run())},o.prototype.stop=function(t){var e;if(0!==this.step&&3!==this.step){if("number"==typeof t)this.prizeFlag=new Array(this.slots.length).fill(t);else{if(!a(t,"array"))return this.stop(-1),console.error("stop() 无法识别的参数类型 "+typeof t);if(t.length!==this.slots.length)return this.stop(-1),console.error("stop(["+t+"]) 参数长度的不正确");this.prizeFlag=t}(null===(e=this.prizeFlag)||void 0===e?void 0:e.includes(-1))?(this.prizeFlag=[],this.step=0):this.step=2}},o.prototype.run=function(t){var e,i,n=this;void 0===t&&(t=0);var r=this,o=r.rAF,a=r.step,s=r.prizeFlag,h=r._defaultConfig,c=r.cellAndSpacing,l=r.slots,u=h.accelerationTime,f=h.decelerationTime;if(0!==this.step||(null==s?void 0:s.length)!==l.length){if(void 0===s||s.length){3!==this.step||this.endScroll.length||this.carveOnGunwaleOfAMovingBoat();var d=Date.now()-this.startTime,p=Date.now()-this.endTime;l.forEach((function(e,i){var r=e.order;if(r&&r.length){var o=c*r.length,g=Math.abs(e.speed||h.speed),v=e.direction||h.direction,m=0,w=n.scroll[i];if(1===a||d=f&&(n.step=0)}n.scroll[i]=m}})),this.draw(),o(this.run.bind(this,t+1))}}else{for(var g=s[0],v=0;v>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x, y) {\n return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(valueToFind, elementK) is true, return true.\n if (sameValueZero(o[k], valueToFind)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n }\n });\n}\n\n// vivo x7 下网易云游戏 app 缺少 includes 方法\nif (!String.prototype.includes) {\n String.prototype.includes = function(search, start) {\n 'use strict';\n if (typeof start !== 'number') {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n } else {\n return this.indexOf(search, start) !== -1;\n }\n };\n}\n\n// vivo x7 下网易云游戏 app 缺少 find 方法\nif (!Array.prototype.find) {\n Object.defineProperty(Array.prototype, 'find', {\n value: function(predicate) {\n // 1. Let O be ? ToObject(this value).\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n var o = Object(this);\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n var thisArg = arguments[1];\n // 5. Let k be 0.\n var k = 0;\n // 6. Repeat, while k < len\n while (k < len) {\n // a. Let Pk be ! ToString(k).\n // b. Let kValue be ? Get(O, Pk).\n // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).\n // d. If testResult is true, return kValue.\n var kValue = o[k];\n if (predicate.call(thisArg, kValue, k, o)) {\n return kValue;\n }\n // e. Increase k by 1.\n k++;\n }\n // 7. Return undefined.\n return void 0;\n }\n });\n}\n","/**\n * 判断是否是期望的类型\n * @param { unknown } param 将要判断的变量\n * @param { ...string } types 期望的类型\n * @return { boolean } 返回期望是否正确\n */\nexport const isExpectType = (param: unknown, ...types: string[]): boolean => {\n return types.some(type => Object.prototype.toString.call(param).slice(8, -1).toLowerCase() === type)\n}\n\nexport const get = (data: object, strKeys: string) => {\n const keys = strKeys.split('.')\n for (let key of keys) {\n const res = data[key]\n if (!isExpectType(res, 'object', 'array')) return res\n data = res\n }\n return data\n}\n\nexport const has = (data: object, key: string | number): boolean => {\n return Object.prototype.hasOwnProperty.call(data, key)\n}\n\n/**\n * 移除\\n\n * @param { string } str 将要处理的字符串\n * @return { string } 返回新的字符串\n */\nexport const removeEnter = (str: string): string => {\n return [].filter.call(str, s => s !== '\\n').join('')\n}\n\n/**\n * 把任何数据类型转成数字\n * @param num \n */\nexport const getNumber = (num: unknown): number => {\n if (num === null) return 0\n if (typeof num === 'object') return NaN\n if (typeof num === 'number') return num\n if (typeof num === 'string') {\n if (num[num.length - 1] === '%') {\n return Number(num.slice(0, -1)) / 100\n }\n return Number(num)\n }\n return NaN\n}\n\n/**\n * 判断颜色是否有效 (透明色 === 无效)\n * @param color 颜色\n */\nexport const hasBackground = (color: string | undefined | null): boolean => {\n if (typeof color !== 'string') return false\n color = color.toLocaleLowerCase().trim()\n if (color === 'transparent') return false\n if (/^rgba/.test(color)) {\n const alpha = /([^\\s,]+)\\)$/.exec(color)\n if (getNumber(alpha) === 0) return false\n }\n return true\n}\n\n/**\n * 通过padding计算\n * @return { object } block 边框信息\n */\nexport const computePadding = (\n block: { padding?: string },\n getLength: Function\n): [number, number, number, number] => {\n let padding = block.padding?.split(' ').map(n => getLength(n)) || [0],\n paddingTop = 0,\n paddingBottom = 0,\n paddingLeft = 0,\n paddingRight = 0\n switch (padding.length) {\n case 1:\n paddingTop = paddingBottom = paddingLeft = paddingRight = padding[0]\n break\n case 2:\n paddingTop = paddingBottom = padding[0]\n paddingLeft = paddingRight = padding[1]\n break\n case 3:\n paddingTop = padding[0]\n paddingLeft = paddingRight = padding[1]\n paddingBottom = padding[2]\n break\n default:\n paddingTop = padding[0]\n paddingBottom = padding[1]\n paddingLeft = padding[2]\n paddingRight = padding[3]\n }\n // 检查是否单独传入值, 并且不是0\n const res = { paddingTop, paddingBottom, paddingLeft, paddingRight }\n for (let key in res) {\n // 是否含有这个属性, 并且是数字或字符串\n res[key] = has(block, key) && isExpectType(block[key], 'string', 'number')\n ? getLength(block[key])\n : res[key]\n }\n return [paddingTop, paddingBottom, paddingLeft, paddingRight]\n}\n\n/**\n * 节流函数\n * @param fn 将要处理的函数\n * @param wait 时间, 单位为毫秒\n * @returns 包装好的节流函数\n */\nexport const throttle = (fn: Function, wait = 300) => {\n let timeId = null as any\n return function (this: any, ...args: any[]) {\n if (timeId) return\n timeId = setTimeout(() => {\n fn.apply(this, args)\n clearTimeout(timeId)\n timeId = null\n }, wait)\n }\n}\n\n/**\n * 通过概率计算出一个奖品索引\n * @param { Array } rangeArr 概率\n * @returns { number } 中奖索引\n */\nexport const computeRange = (rangeArr: Array): number => {\n const ascendingArr: number[] = []\n // 额外增加 map 来优化 ts 的类型推断\n const sum = rangeArr.map(num => Number(num)).reduce((prev, curr) => {\n if (curr > 0) { // 大于0\n const res = prev + curr\n ascendingArr.push(res)\n return res\n } else { // 小于等于0或NaN\n ascendingArr.push(NaN)\n return prev\n }\n }, 0)\n const random = Math.random() * sum\n return ascendingArr.findIndex(num => random <= num)\n}\n\n/**\n * 根据宽度分割字符串, 来达到换行的效果\n * @param text \n * @param maxWidth \n * @returns \n */\nexport const splitText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n getWidth: (lines: string[]) => number,\n lineClamp: number = Infinity\n): string[] => {\n // 如果 lineClamp 设置不正确, 则忽略该属性\n if (lineClamp <= 0) lineClamp = Infinity\n let str = ''\n const lines = []\n const EndWidth = ctx.measureText('...').width\n for (let i = 0; i < text.length; i++) {\n str += text[i]\n let currWidth = ctx.measureText(str).width\n const maxWidth = getWidth(lines)\n // 如果正在计算最后一行, 则加上三个小点的宽度\n if (lineClamp === lines.length + 1) currWidth += EndWidth\n // 如果已经没有宽度了, 就没有必要再计算了\n if (maxWidth < 0) return lines\n // 如果当前一行的宽度不够了, 则处理下一行\n if (currWidth > maxWidth) {\n lines.push(str.slice(0, -1))\n str = text[i]\n }\n // 如果现在是最后一行, 则加上三个小点并跳出\n if (lineClamp === lines.length) {\n lines[lines.length - 1] += '...'\n return lines\n }\n }\n if (str) lines.push(str)\n if (!lines.length) lines.push(text)\n return lines\n}\n\n// 获取一个重新排序的数组\nexport const getSortedArrayByIndex = (arr: T[], order: number[]): T[] => {\n const map: { [key: number]: T } = {}, res = []\n for (let i = 0; i < arr.length; i++) {\n map[i] = arr[i]\n }\n for (let i = 0; i < order.length; i++) {\n const curr = map[order[i]]\n if (curr) (res[i] = curr)\n }\n return res\n}\n","import Watcher from './watcher'\n\nexport default class Dep {\n static target: Watcher | null\n private subs: Array\n\n /**\n * 订阅中心构造器\n */\n constructor () {\n this.subs = []\n }\n\n /**\n * 收集依赖\n * @param {*} sub \n */\n public addSub (sub: Watcher) {\n // 此处临时使用includes防重复添加\n if (!this.subs.includes(sub)) {\n this.subs.push(sub)\n }\n }\n\n /**\n * 派发更新\n */\n public notify () {\n this.subs.forEach(sub => {\n sub.update()\n })\n }\n}\n","\nimport { isExpectType } from '../utils'\n\nexport const hasProto = '__proto__' in {}\n\nexport function def (obj: object, key: string | number, val: any, enumerable?: boolean) {\n Object.defineProperty(obj, key, {\n value: val,\n enumerable: !!enumerable,\n writable: true,\n configurable: true\n })\n}\n\nexport function parsePath (path: string) {\n path += '.'\n let segments: string[] = [], segment = ''\n for (let i = 0; i < path.length; i++) {\n let curr = path[i]\n if (/\\[|\\./.test(curr)) {\n segments.push(segment)\n segment = ''\n } else if (/\\W/.test(curr)) {\n continue\n } else {\n segment += curr\n }\n }\n return function (data: object | any[]) {\n return segments.reduce((data, key) => {\n return data[key]\n }, data)\n }\n}\n\nexport function traverse (value: any) {\n // const seenObjects = new Set()\n const dfs = (data: any) => {\n if (!isExpectType(data, 'array', 'object')) return\n Object.keys(data).forEach(key => {\n const value = data[key]\n dfs(value)\n })\n }\n dfs(value)\n // seenObjects.clear()\n}","/**\n * 重写数组的原型方法\n */\nconst oldArrayProto = Array.prototype\nconst newArrayProto = Object.create(oldArrayProto)\nconst methods = ['push', 'pop', 'shift', 'unshift', 'sort', 'splice', 'reverse']\nmethods.forEach(method => {\n newArrayProto[method] = function (...args: any[]) {\n const res = oldArrayProto[method].apply(this, args)\n const luckyOb = this['__luckyOb__']\n if (['push', 'unshift', 'splice'].includes(method)) luckyOb.walk(this)\n luckyOb.dep.notify()\n return res\n }\n})\n\nexport { newArrayProto }\n","import Dep from './dep'\nimport { hasProto, def } from './utils'\nimport { newArrayProto } from './array'\n\nexport default class Observer {\n value: any\n dep: Dep\n\n /**\n * 观察者构造器\n * @param value \n */\n constructor (value: any) {\n // this.value = value\n this.dep = new Dep()\n // 将响应式对象代理到当前value上面, 并且将当前的enumerable设置为false\n def(value, '__luckyOb__', this)\n if (Array.isArray(value)) { // 如果是数组, 则重写原型方法\n if (hasProto) {\n value['__proto__'] = newArrayProto\n } else {\n Object.getOwnPropertyNames(newArrayProto).forEach(key => {\n def(value, key, newArrayProto[key])\n })\n }\n }\n this.walk(value)\n }\n\n walk (data: object | any[]) {\n Object.keys(data).forEach(key => {\n defineReactive(data, key, data[key])\n })\n }\n}\n\n/**\n * 处理响应式\n * @param { Object | Array } data\n */\nexport function observe (data: any): Observer | void {\n if (!data || typeof data !== 'object') return\n let luckyOb: Observer | void\n if ('__luckyOb__' in data) {\n luckyOb = data['__luckyOb__']\n } else {\n luckyOb = new Observer(data)\n }\n return luckyOb\n}\n\n/**\n * 重写 setter / getter\n * @param {*} data \n * @param {*} key \n * @param {*} val \n */\nexport function defineReactive (data: any, key: string | number, val: any) {\n const dep = new Dep()\n const property = Object.getOwnPropertyDescriptor(data, key)\n if (property && property.configurable === false) {\n return\n }\n const getter = property && property.get\n const setter = property && property.set\n if ((!getter || setter) && arguments.length === 2) {\n val = data[key]\n }\n let childOb = observe(val)\n Object.defineProperty(data, key, {\n get: () => {\n const value = getter ? getter.call(data) : val\n if (Dep.target) {\n dep.addSub(Dep.target)\n if (childOb) {\n childOb.dep.addSub(Dep.target)\n }\n }\n return value\n },\n set: (newVal) => {\n if (newVal === val) return\n val = newVal\n if (getter && !setter) return\n if (setter) {\n setter.call(data, newVal)\n } else {\n val = newVal\n }\n childOb = observe(newVal)\n dep.notify()\n }\n })\n}\n","import Lucky from '../lib/lucky'\nimport Dep from './dep'\nimport { parsePath, traverse } from './utils'\n\nexport interface WatchOptType {\n handler?: () => Function\n immediate?: boolean\n deep?: boolean\n}\n\nlet uid = 0\nexport default class Watcher {\n id: number\n $lucky: Lucky\n expr: string | Function\n cb: Function\n deep: boolean\n getter: Function\n value: any\n\n /**\n * 观察者构造器\n * @param {*} $lucky \n * @param {*} expr \n * @param {*} cb \n */\n constructor ($lucky: Lucky, expr: string | Function, cb: Function, options: WatchOptType = {}) {\n this.id = uid++\n this.$lucky = $lucky\n this.expr = expr\n this.deep = !!options.deep\n if (typeof expr === 'function') {\n this.getter = expr\n } else {\n this.getter = parsePath(expr)\n }\n this.cb = cb\n this.value = this.get()\n }\n\n /**\n * 根据表达式获取新值\n */\n get () {\n Dep.target = this\n const value = this.getter.call(this.$lucky, this.$lucky)\n // 处理深度监听\n if (this.deep) {\n traverse(value)\n }\n Dep.target = null\n return value\n }\n\n /**\n * 触发 watcher 更新\n */\n update () {\n // get获取新值\n const newVal = this.get()\n // 读取之前存储的旧值\n const oldVal = this.value\n this.value = newVal\n // 触发 watch 回调\n this.cb.call(this.$lucky, newVal, oldVal)\n }\n}\n","import '../utils/polyfill'\nimport { has, isExpectType, throttle } from '../utils/index'\nimport { name, version } from '../../package.json'\nimport { ConfigType, UserConfigType, ImgItemType, ImgType, Tuple } from '../types/index'\nimport { defineReactive } from '../observer'\nimport Watcher, { WatchOptType } from '../observer/watcher'\n\nexport default class Lucky {\n static version: string = version\n protected readonly version: string = version\n protected readonly config: ConfigType\n protected readonly ctx: CanvasRenderingContext2D\n protected htmlFontSize: number = 16\n protected rAF: Function = function () {}\n protected boxWidth: number = 0\n protected boxHeight: number = 0\n protected data: {\n width: string | number,\n height: string | number\n }\n\n /**\n * 公共构造器\n * @param config\n */\n constructor (\n config: string | HTMLDivElement | UserConfigType,\n data: {\n width: string | number,\n height: string | number\n }\n ) {\n // 兼容代码开始: 为了处理 v1.0.6 版本在这里传入了一个 dom\n if (typeof config === 'string') config = { el: config } as UserConfigType\n else if (config.nodeType === 1) config = { el: '', divElement: config } as UserConfigType\n // 这里先野蛮的处理, 等待后续优化, 对外暴露的类型是UserConfigType, 但内部期望是ConfigType\n config = config as UserConfigType\n this.config = config as ConfigType\n this.data = data\n // 开始初始化\n if (!config.flag) config.flag = 'WEB'\n if (config.el) config.divElement = document.querySelector(config.el) as HTMLDivElement\n // 如果存在父盒子, 就创建canvas标签\n if (config.divElement) {\n // 无论盒子内有没有canvas都执行覆盖逻辑\n config.canvasElement = document.createElement('canvas')\n config.divElement.appendChild(config.canvasElement)\n }\n // 获取 canvas 上下文\n if (config.canvasElement) {\n config.ctx = config.canvasElement.getContext('2d')!\n // 添加版本信息到标签上, 方便定位版本问题\n config.canvasElement.setAttribute('package', `${name}@${version}`)\n config.canvasElement.addEventListener('click', e => this.handleClick(e))\n }\n this.ctx = config.ctx as CanvasRenderingContext2D\n // 初始化 window 方法\n this.initWindowFunction()\n // 如果最后得不到 canvas 上下文那就无法进行绘制\n if (!this.config.ctx) {\n console.error('无法获取到 CanvasContext2D')\n }\n // 监听 window 触发 resize 时重置\n if (window && typeof window.addEventListener === 'function') {\n window.addEventListener('resize', throttle(() => this.resize(), 300))\n }\n // 监听异步设置 html 的 fontSize 并重新绘制\n if (window && typeof window.MutationObserver === 'function') {\n new window.MutationObserver(() => {\n this.resize()\n }).observe(document.documentElement, { attributes: true })\n }\n }\n\n /**\n * 初始化组件大小/单位\n */\n protected resize(): void {\n this.config.beforeResize?.()\n // 先初始化 fontSize 以防后面有 rem 单位\n this.setHTMLFontSize()\n // 拿到 config 即可设置 dpr\n this.setDpr()\n // 初始化宽高\n this.resetWidthAndHeight()\n // 根据 dpr 来缩放 canvas\n this.zoomCanvas()\n }\n\n /**\n * 初始化方法\n */\n protected initLucky () {\n this.resize()\n if (!this.boxWidth || !this.boxHeight) {\n return console.error('无法获取到宽度或高度')\n }\n }\n\n /**\n * 鼠标点击事件\n * @param e 事件参数\n */\n protected handleClick (e: MouseEvent): void {}\n\n /**\n * 根标签的字体大小\n */\n protected setHTMLFontSize (): void {\n if (!window) return\n this.htmlFontSize = +window.getComputedStyle(document.documentElement).fontSize.slice(0, -2)\n }\n\n // 清空画布\n public clearCanvas (): void {\n const [width, height] = [this.boxWidth, this.boxHeight]\n this.ctx.clearRect(-width, -height, width * 2, height * 2)\n }\n\n /**\n * 设备像素比\n * window 环境下自动获取, 其余环境手动传入\n */\n protected setDpr (): void {\n const { config } = this\n if (config.dpr) {\n // 优先使用 config 传入的 dpr\n } else if (window) {\n window['dpr'] = config.dpr = window.devicePixelRatio || 1\n } else if (!config.dpr) {\n console.error(config, '未传入 dpr 可能会导致绘制异常')\n }\n }\n\n /**\n * 重置盒子和canvas的宽高\n */\n private resetWidthAndHeight (): void {\n const { config, data } = this\n // 如果是浏览器环境并且存在盒子\n let boxWidth = 0, boxHeight = 0\n if (config.divElement) {\n boxWidth = config.divElement.offsetWidth\n boxHeight = config.divElement.offsetHeight\n }\n // 先从 data 里取宽高, 如果 config 上面没有, 就从 style 上面取\n this.boxWidth = this.getLength(data.width || config['width']) || boxWidth\n this.boxHeight = this.getLength(data.height || config['height']) || boxHeight\n // 重新把宽高赋给盒子\n if (config.divElement) {\n config.divElement.style.overflow = 'hidden'\n config.divElement.style.width = this.boxWidth + 'px'\n config.divElement.style.height = this.boxHeight + 'px'\n }\n }\n\n /**\n * 根据 dpr 缩放 canvas 并处理位移\n */\n protected zoomCanvas (): void {\n const { config, ctx } = this\n const { canvasElement, dpr } = config\n const [width, height] = [this.boxWidth * dpr, this.boxHeight * dpr]\n if (!canvasElement) return\n canvasElement.width = width\n canvasElement.height = height\n canvasElement.style.width = `${width}px`\n canvasElement.style.height = `${height}px`\n canvasElement.style['transform-origin'] = 'left top'\n canvasElement.style.transform = `scale(${1 / dpr})`\n ctx.scale(dpr, dpr)\n }\n\n /**\n * 从 window 对象上获取一些方法\n */\n private initWindowFunction (): void {\n const { config } = this\n if (window) {\n this.rAF = window.requestAnimationFrame ||\n window['webkitRequestAnimationFrame'] ||\n window['mozRequestAnimationFrame'] ||\n function (callback: Function) {\n window.setTimeout(callback, 1000 / 60)\n }\n config.setTimeout = window.setTimeout\n config.setInterval = window.setInterval\n config.clearTimeout = window.clearTimeout\n config.clearInterval = window.clearInterval\n return\n }\n if (config.rAF) {\n // 优先使用帧动画\n this.rAF = config.rAF\n } else if (config.setTimeout) {\n // 其次使用定时器\n const timeout = config.setTimeout\n this.rAF = (callback: Function): number => timeout(callback, 16.7)\n } else {\n // 如果config里面没有提供, 那就假设全局方法存在setTimeout\n this.rAF = (callback: Function): number => setTimeout(callback, 16.7)\n }\n }\n\n public isWeb () {\n return ['WEB', 'UNI-H5', 'TARO-H5'].includes(this.config.flag)\n }\n\n /**\n * 异步加载图片并返回图片的几何信息\n * @param src 图片路径\n * @param info 图片信息\n */\n protected loadImg (\n src: string,\n info: ImgItemType,\n resolveName = '$resolve'\n ): Promise {\n return new Promise((resolve, reject) => {\n if (!src) reject(`=> '${info.src}' 不能为空或不合法`)\n if (this.config.flag === 'WEB') {\n let imgObj = new Image()\n imgObj['crossorigin'] = 'anonymous'\n imgObj.onload = () => resolve(imgObj)\n imgObj.onerror = () => reject(`=> '${info.src}' 图片加载失败`)\n imgObj.src = src\n } else {\n // 其余平台向外暴露, 交给外部自行处理\n info[resolveName] = resolve\n info['$reject'] = reject\n return\n }\n })\n }\n\n /**\n * 公共绘制图片的方法\n * @param imgObj 图片对象\n * @param rectInfo: [x轴位置, y轴位置, 渲染宽度, 渲染高度] \n */\n protected drawImage(\n ctx: CanvasRenderingContext2D,\n imgObj: ImgType,\n ...rectInfo: [...Tuple, ...Partial>]\n ): void {\n let drawImg\n const { flag, dpr } = this.config\n if (['WEB', 'MP-WX'].includes(flag)) {\n // 浏览器和新版小程序中直接绘制即可\n drawImg = imgObj\n } else if (['UNI-H5', 'UNI-MP', 'TARO-H5', 'TARO-MP'].includes(flag)) {\n // 旧版本的小程序需要绘制 path, 这里特殊处理一下\n type OldImageType = ImgType & { path: CanvasImageSource }\n drawImg = (imgObj as OldImageType).path\n } else {\n // 如果传入了未知的标识\n return console.error('意料之外的 flag, 该平台尚未兼容!')\n }\n const miniProgramOffCtx = (drawImg['canvas'] || drawImg).getContext?.('2d')\n if (miniProgramOffCtx && !this.isWeb()) {\n rectInfo = rectInfo.map(val => val! * dpr) as Tuple\n const temp = miniProgramOffCtx.getImageData(...rectInfo.slice(0, 4))\n ctx.putImageData(temp, ...(rectInfo.slice(4, 6) as Tuple))\n } else {\n if (rectInfo.length === 8) {\n rectInfo = rectInfo.map((val, index) => index < 4 ? val! * dpr : val) as Tuple\n }\n // 尝试捕获错误\n try {\n ctx.drawImage(drawImg, ...rectInfo as Tuple)\n } catch (err) {\n /**\n * TODO: safari浏览器下, init() 会出现奇怪的报错\n * IndexSizeError: The index is not in the allowed range\n * 但是这个报错并不影响实际的绘制, 目前先放一放, 等待有缘人\n */\n // console.log(err)\n }\n }\n }\n\n /**\n * 计算图片的渲染宽高\n * @param imgObj 图片标签元素\n * @param imgInfo 图片信息\n * @param maxWidth 最大宽度\n * @param maxHeight 最大高度\n * @return [渲染宽度, 渲染高度]\n */\n protected computedWidthAndHeight (\n imgObj: ImgType,\n imgInfo: ImgItemType,\n maxWidth: number,\n maxHeight: number\n ): [number, number] {\n // 根据配置的样式计算图片的真实宽高\n if (!imgInfo.width && !imgInfo.height) {\n // 如果没有配置宽高, 则使用图片本身的宽高\n return [imgObj.width, imgObj.height]\n } else if (imgInfo.width && !imgInfo.height) {\n // 如果只填写了宽度, 没填写高度\n let trueWidth = this.getLength(imgInfo.width, maxWidth)\n // 那高度就随着宽度进行等比缩放\n return [trueWidth, imgObj.height * (trueWidth / imgObj.width)]\n } else if (!imgInfo.width && imgInfo.height) {\n // 如果只填写了宽度, 没填写高度\n let trueHeight = this.getLength(imgInfo.height, maxHeight)\n // 那宽度就随着高度进行等比缩放\n return [imgObj.width * (trueHeight / imgObj.height), trueHeight]\n }\n // 如果宽度和高度都填写了, 就如实计算\n return [\n this.getLength(imgInfo.width, maxWidth),\n this.getLength(imgInfo.height, maxHeight)\n ]\n }\n\n /**\n * 转换单位\n * @param { string } value 将要转换的值\n * @param { number } denominator 分子\n * @return { number } 返回新的字符串\n */\n protected changeUnits (value: string, denominator = 1): number {\n const { config } = this\n return Number(value.replace(/^([-]*[0-9.]*)([a-z%]*)$/, (val, num, unit) => {\n const handleCssUnit = {\n '%': (n: number) => n * (denominator / 100),\n 'px': (n: number) => n * 1,\n 'rem': (n: number) => n * this.htmlFontSize,\n 'vw': (n: number) => n / 100 * window.innerWidth,\n }[unit]\n if (handleCssUnit) return handleCssUnit(num)\n // 如果找不到默认单位, 就交给外面处理\n const otherHandleCssUnit = config.handleCssUnit || config['unitFunc']\n return otherHandleCssUnit ? otherHandleCssUnit(num, unit) : num\n }))\n }\n\n /**\n * 获取长度\n * @param length 将要转换的长度\n * @param maxLength 最大长度\n * @return 返回长度\n */\n protected getLength (length: string | number | undefined, maxLength?: number): number {\n if (isExpectType(length, 'number')) return length as number\n if (isExpectType(length, 'string')) return this.changeUnits(length as string, maxLength)\n return 0\n }\n\n /**\n * 获取相对(居中)X坐标\n * @param width\n * @param col\n */\n protected getOffsetX (width: number, maxWidth: number = 0): number {\n return (maxWidth - width) / 2\n }\n\n protected getOffscreenCanvas (width: number, height: number): {\n _offscreenCanvas: HTMLCanvasElement,\n _ctx: CanvasRenderingContext2D\n } | void {\n if (!has(this, '_offscreenCanvas')) {\n if (window && window.document && this.config.flag === 'WEB') {\n this['_offscreenCanvas'] = document.createElement('canvas')\n } else {\n this['_offscreenCanvas'] = this.config['offscreenCanvas']\n }\n if (!this['_offscreenCanvas']) return console.error('离屏 Canvas 无法渲染!')\n }\n const dpr = this.config.dpr\n const _offscreenCanvas = this['_offscreenCanvas'] as HTMLCanvasElement\n _offscreenCanvas.width = (width || 300) * dpr\n _offscreenCanvas.height = (height || 150) * dpr\n const _ctx = _offscreenCanvas.getContext('2d')!\n _ctx.clearRect(0, 0, width, height)\n _ctx.scale(dpr, dpr)\n _ctx['dpr'] = dpr\n return { _offscreenCanvas, _ctx }\n }\n\n /**\n * 添加一个新的响应式数据 (临时)\n * @param data 数据\n * @param key 属性\n * @param value 新值\n */\n public $set (data: object, key: string | number, value: any) {\n if (!data || typeof data !== 'object') return\n defineReactive(data, key, value)\n }\n\n /**\n * 添加一个属性计算 (临时)\n * @param data 源数据\n * @param key 属性名\n * @param callback 回调函数\n */\n protected $computed (data: object, key: string, callback: Function) {\n Object.defineProperty(data, key, {\n get: () => {\n return callback.call(this)\n }\n })\n }\n\n /**\n * 添加一个观察者 create user watcher\n * @param expr 表达式\n * @param handler 回调函数\n * @param watchOpt 配置参数\n * @return 卸载当前观察者的函数 (暂未返回)\n */\n protected $watch (\n expr: string | Function,\n handler: Function | WatchOptType,\n watchOpt: WatchOptType = {}\n ): Function {\n if (typeof handler === 'object') {\n watchOpt = handler\n handler = watchOpt.handler!\n }\n // 创建 user watcher\n const watcher = new Watcher(this, expr, handler, watchOpt)\n // 判断是否需要初始化时触发回调\n if (watchOpt.immediate) {\n handler.call(this, watcher.value)\n }\n // 返回一个卸载当前观察者的函数\n return function unWatchFn () {}\n }\n}\n","/**\n * 转换为运算角度\n * @param { number } deg 数学角度\n * @return { number } 运算角度\n */\nexport const getAngle = (deg: number): number => {\n return Math.PI / 180 * deg\n}\n\n/**\n * 根据角度计算圆上的点\n * @param { number } deg 运算角度\n * @param { number } r 半径\n * @return { Array } 坐标[x, y]\n */\nexport const getArcPointerByDeg = (deg: number, r: number): [number, number] => {\n return [+(Math.cos(deg) * r).toFixed(8), +(Math.sin(deg) * r).toFixed(8)]\n}\n\n/**\n * 根据点计算切线方程\n * @param { number } x 横坐标\n * @param { number } y 纵坐标\n * @return { Array } [斜率, 常数]\n */\nexport const getTangentByPointer = (x: number, y: number): Array => {\n let k = - x / y\n let b = -k * x + y\n return [k, b]\n}\n\n// 使用 arc 绘制扇形\nexport const fanShapedByArc = (\n ctx: CanvasRenderingContext2D,\n minRadius: number,\n maxRadius: number,\n start: number,\n end: number,\n gutter: number,\n): void => {\n ctx.beginPath()\n let maxGutter = getAngle(90 / Math.PI / maxRadius * gutter)\n let minGutter = getAngle(90 / Math.PI / minRadius * gutter)\n let maxStart = start + maxGutter\n let maxEnd = end - maxGutter\n let minStart = start + minGutter\n let minEnd = end - minGutter\n ctx.arc(0, 0, maxRadius, maxStart, maxEnd, false)\n // 如果 getter 比按钮短就绘制圆弧, 反之计算新的坐标点\n // if (minEnd > minStart) {\n // ctx.arc(0, 0, minRadius, minEnd, minStart, true)\n // } else {\n ctx.lineTo(\n ...getArcPointerByDeg(\n (start + end) / 2,\n gutter / 2 / Math.abs(Math.sin((start - end) / 2))\n )\n )\n // }\n ctx.closePath()\n}\n\n// 使用 arc 绘制圆角矩形\nexport const roundRectByArc = (\n ctx: CanvasRenderingContext2D,\n ...[x, y, w, h, r]: number[]\n) => {\n const min = Math.min(w, h), PI = Math.PI\n if (r > min / 2) r = min / 2\n ctx.beginPath()\n ctx.moveTo(x + r, y)\n ctx.lineTo(x + r, y)\n ctx.lineTo(x + w - r, y)\n ctx.arc(x + w - r, y + r, r, -PI / 2, 0)\n ctx.lineTo(x + w, y + h - r)\n ctx.arc(x + w - r, y + h - r, r, 0, PI / 2)\n ctx.lineTo(x + r, y + h)\n ctx.arc(x + r, y + h - r, r, PI / 2, PI)\n ctx.lineTo(x, y + r)\n ctx.arc(x + r, y + r, r, PI, -PI / 2)\n ctx.closePath()\n}\n\n/**\n * 创建线性渐变色\n */\nexport const getLinearGradient = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n background: string\n) => {\n const context = (/linear-gradient\\((.+)\\)/.exec(background) as Array)[1]\n .split(',') // 根据逗号分割\n .map((text: string) => text.trim()) // 去除两边空格\n let deg = context.shift(), direction: [number, number, number, number] = [0, 0, 0, 0]\n // 通过起始点和角度计算渐变终点的坐标点, 这里感谢泽宇大神提醒我使用勾股定理....\n if (deg.includes('deg')) {\n deg = deg.slice(0, -3) % 360\n // 根据4个象限定义起点坐标, 根据45度划分8个区域计算终点坐标\n const getLenOfTanDeg = (deg: number) => Math.tan(deg / 180 * Math.PI)\n if (deg >= 0 && deg < 45) direction = [x, y + h, x + w, y + h - w * getLenOfTanDeg(deg - 0)]\n else if (deg >= 45 && deg < 90) direction = [x, y + h, (x + w) - h * getLenOfTanDeg(deg - 45), y]\n else if (deg >= 90 && deg < 135) direction = [x + w, y + h, (x + w) - h * getLenOfTanDeg(deg - 90), y]\n else if (deg >= 135 && deg < 180) direction = [x + w, y + h, x, y + w * getLenOfTanDeg(deg - 135)]\n else if (deg >= 180 && deg < 225) direction = [x + w, y, x, y + w * getLenOfTanDeg(deg - 180)]\n else if (deg >= 225 && deg < 270) direction = [x + w, y, x + h * getLenOfTanDeg(deg - 225), y + h]\n else if (deg >= 270 && deg < 315) direction = [x, y, x + h * getLenOfTanDeg(deg - 270), y + h]\n else if (deg >= 315 && deg < 360) direction = [x, y, x + w, y + h - w * getLenOfTanDeg(deg - 315)]\n }\n // 创建四个简单的方向坐标\n else if (deg.includes('top')) direction = [x, y + h, x, y]\n else if (deg.includes('bottom')) direction = [x, y, x, y + h]\n else if (deg.includes('left')) direction = [x + w, y, x, y]\n else if (deg.includes('right')) direction = [x, y, x + w, y]\n // 创建线性渐变必须使用整数坐标\n const gradient = ctx.createLinearGradient(...(direction.map(n => n >> 0) as typeof direction))\n // 这里后期重构, 先用any代替\n return context.reduce((gradient: any, item: any, index: any) => {\n const info = item.split(' ')\n if (info.length === 1) gradient.addColorStop(index, info[0])\n else if (info.length === 2) gradient.addColorStop(...info)\n return gradient\n }, gradient)\n}\n\n// // 根据三点画圆弧\n// export const drawRadian = (\n// ctx: CanvasRenderingContext2D,\n// r: number,\n// start: number,\n// end: number,\n// direction: boolean = true\n// ) => {\n// // 如果角度大于等于180度, 则分两次绘制, 因为 arcTo 无法绘制180度的圆弧\n// if (Math.abs(end - start).toFixed(8) >= getAngle(180).toFixed(8)) {\n// let middle = (end + start) / 2\n// if (direction) {\n// drawRadian(ctx, r, start, middle, direction)\n// drawRadian(ctx, r, middle, end, direction)\n// } else {\n// drawRadian(ctx, r, middle, end, direction)\n// drawRadian(ctx, r, start, middle, direction)\n// }\n// return false\n// }\n// // 如果方法相反, 则交换起点和终点\n// if (!direction) [start, end] = [end, start]\n// const [x1, y1] = getArcPointerByDeg(start, r)\n// const [x2, y2] = getArcPointerByDeg(end, r)\n// const [k1, b1] = getTangentByPointer(x1, y1)\n// const [k2, b2] = getTangentByPointer(x2, y2)\n// // 计算两条切线的交点\n// let x0 = (b2 - b1) / (k1 - k2)\n// let y0 = (k2 * b1 - k1 * b2) / (k2 - k1)\n// // 如果有任何一条切线垂直于x轴, 则斜率不存在\n// if (isNaN(x0)) {\n// Math.abs(x1) === +r.toFixed(8) && (x0 = x1)\n// Math.abs(x2) === +r.toFixed(8) && (x0 = x2)\n// }\n// if (k1 === Infinity || k1 === -Infinity) {\n// y0 = k2 * x0 + b2\n// }\n// else if (k2 === Infinity || k2 === -Infinity) {\n// y0 = k1 * x0 + b1\n// }\n// ctx.lineTo(x1, y1)\n// // 微信小程序下 arcTo 在安卓真机下绘制有 bug\n// ctx.arcTo(x0, y0, x2, y2, r)\n// }\n\n// // 使用 arcTo 绘制扇形 (弃用)\n// export const drawSectorByArcTo = (\n// ctx: CanvasRenderingContext2D,\n// minRadius: number,\n// maxRadius: number,\n// start: number,\n// end: number,\n// gutter: number,\n// ) => {\n// if (!minRadius) minRadius = gutter\n// // 内外圆弧分别进行等边缩放\n// let maxGutter = getAngle(90 / Math.PI / maxRadius * gutter)\n// let minGutter = getAngle(90 / Math.PI / minRadius * gutter)\n// let maxStart = start + maxGutter\n// let maxEnd = end - maxGutter\n// let minStart = start + minGutter\n// let minEnd = end - minGutter\n// ctx.beginPath()\n// ctx.moveTo(...getArcPointerByDeg(maxStart, maxRadius))\n// drawRadian(ctx, maxRadius, maxStart, maxEnd, true)\n// // 如果 getter 比按钮短就绘制圆弧, 反之计算新的坐标点\n// if (minEnd > minStart) {\n// drawRadian(ctx, minRadius, minStart, minEnd, false)\n// } else {\n// ctx.lineTo(\n// ...getArcPointerByDeg(\n// (start + end) / 2,\n// gutter / 2 / Math.abs(Math.sin((start - end) / 2))\n// )\n// )\n// }\n// ctx.closePath()\n// }\n\n// // 使用 arcTo 绘制圆角矩形 (弃用)\n// export const roundRectByArcTo = (\n// ctx: CanvasRenderingContext2D,\n// ...[x, y, w, h, r]: number[]\n// ) => {\n// let min = Math.min(w, h)\n// if (r > min / 2) r = min / 2\n// ctx.beginPath()\n// ctx.moveTo(x + r, y)\n// ctx.lineTo(x + r, y)\n// ctx.lineTo(x + w - r, y)\n// ctx.arcTo(x + w, y, x + w, y + r, r)\n// ctx.lineTo(x + w, y + h - r)\n// ctx.arcTo(x + w, y + h, x + w - r, y + h, r)\n// ctx.lineTo(x + r, y + h)\n// ctx.arcTo(x, y + h, x, y + h - r, r)\n// ctx.lineTo(x, y + r)\n// ctx.arcTo(x, y, x + r, y, r)\n// }\n","/**\n * 缓动函数\n * t: current time(当前时间)\n * b: beginning value(初始值)\n * c: change in value(变化量)\n * d: duration(持续时间)\n * \n * 感谢张鑫旭大佬 https://github.com/zhangxinxu/Tween\n */\n\ninterface SpeedType {\n easeIn: (...arr: number[]) => number\n easeOut: (...arr: number[]) => number\n}\n\n// 二次方的缓动\nexport const quad: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return c * (t /= d) * t + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return -c * (t /= d) * (t - 2) + b\n }\n}\n\n// 三次方的缓动\nexport const cubic: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return c * (t /= d) * t * t + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return c * ((t = t / d - 1) * t * t + 1) + b\n }\n}\n\n// 四次方的缓动\nexport const quart: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return c * (t /= d) * t * t * t + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return -c * ((t = t / d - 1) * t * t * t - 1) + b\n }\n}\n\n// 五次方的缓动\nexport const quint: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return c * (t /= d) * t * t * t * t + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b\n }\n}\n\n// 正弦曲线的缓动\nexport const sine: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return c * Math.sin(t / d * (Math.PI / 2)) + b\n }\n}\n\n// 指数曲线的缓动\nexport const expo: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b\n }\n}\n\n// 圆形曲线的缓动\nexport const circ: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b\n }\n}\n","import Lucky from './lucky'\nimport { UserConfigType, FontItemType, ImgType } from '../types/index'\nimport LuckyWheelConfig, {\n BlockType,\n PrizeType,\n ButtonType,\n DefaultConfigType,\n DefaultStyleType,\n StartCallbackType,\n EndCallbackType\n} from '../types/wheel'\nimport {\n removeEnter,\n hasBackground,\n computeRange,\n splitText,\n has,\n} from '../utils/index'\nimport { getAngle, fanShapedByArc } from '../utils/math'\nimport { quad } from '../utils/tween'\n\nexport default class LuckyWheel extends Lucky {\n private blocks: Array = []\n private prizes: Array = []\n private buttons: Array = []\n private defaultConfig: DefaultConfigType = {}\n private defaultStyle: DefaultStyleType = {}\n private _defaultConfig: Required = {} as Required\n private _defaultStyle: Required = {} as Required\n private startCallback?: StartCallbackType\n private endCallback?: EndCallbackType\n private Radius = 0 // 大转盘半径\n private prizeRadius = 0 // 奖品区域半径\n private prizeDeg = 0 // 奖品数学角度\n private prizeAng = 0 // 奖品运算角度\n private rotateDeg = 0 // 转盘旋转角度\n private maxBtnRadius = 0 // 最大按钮半径\n private startTime = 0 // 开始时间戳\n private endTime = 0 // 停止时间戳\n private stopDeg = 0 // 刻舟求剑\n private endDeg = 0 // 停止角度\n private FPS = 16.6 // 屏幕刷新率\n /**\n * 游戏当前的阶段\n * step = 0 时, 游戏尚未开始\n * step = 1 时, 此时处于加速阶段\n * step = 2 时, 此时处于匀速阶段\n * step = 3 时, 此时处于减速阶段\n */\n private step: 0 | 1 | 2 | 3 = 0\n /**\n * 中奖索引\n * prizeFlag = undefined 时, 处于开始抽奖阶段, 正常旋转\n * prizeFlag >= 0 时, 说明stop方法被调用, 并且传入了中奖索引\n * prizeFlag === -1 时, 说明stop方法被调用, 并且传入了负值, 本次抽奖无效\n */\n private prizeFlag: number | undefined\n private ImageCache = new Map()\n\n /**\n * 大转盘构造器\n * @param config 配置项\n * @param data 抽奖数据\n */\n constructor (config: UserConfigType, data: LuckyWheelConfig) {\n super(config, {\n width: data.width,\n height: data.height\n })\n this.initData(data)\n this.initWatch()\n this.initComputed()\n // 创建前回调函数\n config.beforeCreate?.call(this)\n // 首次初始化\n this.init()\n }\n\n protected resize(): void {\n super.resize()\n this.Radius = Math.min(this.boxWidth, this.boxHeight) / 2\n this.ctx.translate(this.Radius, this.Radius)\n this.draw()\n this.config.afterResize?.()\n }\n\n protected initLucky (): void {\n this.Radius = 0\n this.prizeRadius = 0\n this.prizeDeg = 0\n this.prizeAng = 0\n this.rotateDeg = 0\n this.maxBtnRadius = 0\n this.startTime = 0\n this.endTime = 0\n this.stopDeg = 0\n this.endDeg = 0\n this.FPS = 16.6\n this.prizeFlag = -1\n this.step = 0\n super.initLucky()\n }\n\n /**\n * 初始化数据\n * @param data\n */\n private initData (data: LuckyWheelConfig): void {\n this.$set(this, 'width', data.width)\n this.$set(this, 'height', data.height)\n this.$set(this, 'blocks', data.blocks || [])\n this.$set(this, 'prizes', data.prizes || [])\n this.$set(this, 'buttons', data.buttons || [])\n this.$set(this, 'defaultConfig', data.defaultConfig || {})\n this.$set(this, 'defaultStyle', data.defaultStyle || {})\n this.$set(this, 'startCallback', data.start)\n this.$set(this, 'endCallback', data.end)\n }\n\n /**\n * 初始化属性计算\n */\n private initComputed () {\n // 默认配置\n this.$computed(this, '_defaultConfig', () => {\n const config = {\n gutter: '0px',\n offsetDegree: 0,\n speed: 20,\n speedFunction: 'quad',\n accelerationTime: 2500,\n decelerationTime: 2500,\n stopRange: 0,\n ...this.defaultConfig\n }\n return config\n })\n // 默认样式\n this.$computed(this, '_defaultStyle', () => {\n const style = {\n fontSize: '18px',\n fontColor: '#000',\n fontStyle: 'sans-serif',\n fontWeight: '400',\n background: 'rgba(0,0,0,0)',\n wordWrap: true,\n lengthLimit: '90%',\n ...this.defaultStyle\n }\n return style\n })\n }\n\n /**\n * 初始化观察者\n */\n private initWatch () {\n // 重置宽度\n this.$watch('width', (newVal: string | number) => {\n this.data.width = newVal\n this.resize()\n })\n // 重置高度\n this.$watch('height', (newVal: string | number) => {\n this.data.height = newVal\n this.resize()\n })\n // 观察 blocks 变化收集图片\n this.$watch('blocks', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 观察 prizes 变化收集图片\n this.$watch('prizes', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 观察 buttons 变化收集图片\n this.$watch('buttons', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n this.$watch('defaultConfig', () => this.draw(), { deep: true })\n this.$watch('defaultStyle', () => this.draw(), { deep: true })\n this.$watch('startCallback', () => this.init())\n this.$watch('endCallback', () => this.init())\n }\n\n /**\n * 初始化 canvas 抽奖\n */\n public async init (): Promise {\n this.initLucky()\n const { config } = this\n // 初始化前回调函数\n config.beforeInit?.call(this)\n this.draw() // 先画一次, 防止闪烁\n this.draw() // 再画一次, 拿到正确的按钮轮廓\n // 异步加载图片\n await this.initImageCache()\n // 初始化后回调函数\n config.afterInit?.call(this)\n }\n\n private initImageCache (): Promise {\n return new Promise((resolve) => {\n const willUpdateImgs = {\n blocks: this.blocks.map(block => block.imgs),\n prizes: this.prizes.map(prize => prize.imgs),\n buttons: this.buttons.map(btn => btn.imgs),\n }\n ;(<(keyof typeof willUpdateImgs)[]>Object.keys(willUpdateImgs)).forEach(imgName => {\n const willUpdate = willUpdateImgs[imgName]\n // 循环遍历所有图片\n const allPromise: Promise[] = []\n willUpdate && willUpdate.forEach((imgs, cellIndex) => {\n imgs && imgs.forEach((imgInfo, imgIndex) => {\n allPromise.push(this.loadAndCacheImg(imgName, cellIndex, imgIndex))\n })\n })\n Promise.all(allPromise).then(() => {\n this.draw()\n resolve()\n })\n })\n })\n }\n\n /**\n * canvas点击事件\n * @param e 事件参数\n */\n protected handleClick (e: MouseEvent): void {\n const { ctx } = this\n ctx.beginPath()\n ctx.arc(0, 0, this.maxBtnRadius, 0, Math.PI * 2, false)\n if (!ctx.isPointInPath(e.offsetX, e.offsetY)) return\n if (this.step !== 0) return\n this.startCallback?.(e)\n }\n\n /**\n * 根据索引单独加载指定图片并缓存\n * @param cellName 模块名称\n * @param cellIndex 模块索引\n * @param imgName 模块对应的图片缓存\n * @param imgIndex 图片索引\n */\n private async loadAndCacheImg (\n cellName: 'blocks' | 'prizes' | 'buttons',\n cellIndex: number,\n imgIndex: number,\n ): Promise {\n return new Promise((resolve, reject) => {\n // 获取图片信息\n const cell: BlockType | PrizeType | ButtonType = this[cellName][cellIndex]\n if (!cell || !cell.imgs) return\n const imgInfo = cell.imgs[imgIndex]\n if (!imgInfo) return\n // 异步加载图片\n this.loadImg(imgInfo.src, imgInfo).then(async currImg => {\n if (typeof imgInfo.formatter === 'function') {\n currImg = await Promise.resolve(imgInfo.formatter.call(this, currImg))\n }\n this.ImageCache.set(imgInfo['src'], currImg)\n resolve()\n }).catch(err => {\n console.error(`${cellName}[${cellIndex}].imgs[${imgIndex}] ${err}`)\n reject()\n })\n })\n }\n\n private drawBlock (radius: number, block: BlockType, blockIndex: number): void {\n const { ctx } = this\n if (hasBackground(block.background)) {\n ctx.beginPath()\n ctx.fillStyle = block.background!\n ctx.arc(0, 0, radius, 0, Math.PI * 2, false)\n ctx.fill()\n }\n block.imgs && block.imgs.forEach((imgInfo, imgIndex) => {\n const blockImg = this.ImageCache.get(imgInfo.src)\n if (!blockImg) return\n // 绘制图片\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(blockImg, imgInfo, radius * 2, radius * 2)\n const [xAxis, yAxis] = [this.getOffsetX(trueWidth) + this.getLength(imgInfo.left, radius * 2), this.getLength(imgInfo.top, radius * 2) - radius]\n ctx.save()\n imgInfo.rotate && ctx.rotate(getAngle(this.rotateDeg))\n this.drawImage(ctx, blockImg, xAxis, yAxis, trueWidth, trueHeight)\n ctx.restore()\n })\n }\n\n /**\n * 开始绘制\n */\n protected draw (): void {\n const { config, ctx, _defaultConfig, _defaultStyle } = this\n // 触发绘制前回调\n config.beforeDraw?.call(this, ctx)\n // 清空画布\n ctx.clearRect(-this.Radius, -this.Radius, this.Radius * 2, this.Radius * 2)\n // 计算 padding 并绘制 blocks 边框\n this.prizeRadius = this.blocks.reduce((radius, block, blockIndex) => {\n this.drawBlock(radius, block, blockIndex)\n return radius - this.getLength(block.padding && block.padding.split(' ')[0])\n }, this.Radius)\n // 计算起始弧度\n this.prizeDeg = 360 / this.prizes.length\n this.prizeAng = getAngle(this.prizeDeg)\n const shortSide = this.prizeRadius * Math.sin(this.prizeAng / 2) * 2\n // 起始角度调整到正上方, 并且减去半个扇形角度\n let start = getAngle(this.rotateDeg - 90 + this.prizeDeg / 2 + _defaultConfig.offsetDegree)\n // 计算文字横坐标\n const getFontX = (font: FontItemType, line: string) => {\n return this.getOffsetX(ctx.measureText(line).width) + this.getLength(font.left, shortSide)\n }\n // 计算文字纵坐标\n const getFontY = (font: FontItemType, height: number, lineIndex: number) => {\n // 优先使用字体行高, 要么使用默认行高, 其次使用字体大小, 否则使用默认字体大小\n const lineHeight = font.lineHeight || _defaultStyle.lineHeight || font.fontSize || _defaultStyle.fontSize\n return this.getLength(font.top, height) + (lineIndex + 1) * this.getLength(lineHeight)\n }\n ctx.save()\n // 绘制prizes奖品区域\n this.prizes.forEach((prize, prizeIndex) => {\n // 计算当前奖品区域中间坐标点\n let currMiddleDeg = start + prizeIndex * this.prizeAng\n // 奖品区域可见高度\n let prizeHeight = this.prizeRadius - this.maxBtnRadius\n // 绘制背景\n const background = prize.background || _defaultStyle.background\n if (hasBackground(background)) {\n ctx.fillStyle = background\n fanShapedByArc(\n ctx, this.maxBtnRadius, this.prizeRadius,\n currMiddleDeg - this.prizeAng / 2,\n currMiddleDeg + this.prizeAng / 2,\n this.getLength(_defaultConfig.gutter),\n )\n ctx.fill()\n }\n // 计算临时坐标并旋转文字\n let x = Math.cos(currMiddleDeg) * this.prizeRadius\n let y = Math.sin(currMiddleDeg) * this.prizeRadius\n ctx.translate(x, y)\n ctx.rotate(currMiddleDeg + getAngle(90))\n // 绘制图片\n prize.imgs && prize.imgs.forEach((imgInfo, imgIndex) => {\n const prizeImg = this.ImageCache.get(imgInfo.src)\n if (!prizeImg) return\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(\n prizeImg,\n imgInfo,\n this.prizeAng * this.prizeRadius,\n prizeHeight\n )\n const [xAxis, yAxis] = [\n this.getOffsetX(trueWidth) + this.getLength(imgInfo.left, shortSide),\n this.getLength(imgInfo.top, prizeHeight)\n ]\n this.drawImage(ctx, prizeImg, xAxis, yAxis, trueWidth, trueHeight)\n })\n // 逐行绘制文字\n prize.fonts && prize.fonts.forEach(font => {\n const fontColor = font.fontColor || _defaultStyle.fontColor\n const fontWeight = font.fontWeight || _defaultStyle.fontWeight\n const fontSize = this.getLength(font.fontSize || _defaultStyle.fontSize)\n const fontStyle = font.fontStyle || _defaultStyle.fontStyle\n const wordWrap = has(font, 'wordWrap') ? font.wordWrap : _defaultStyle.wordWrap\n const lengthLimit = font.lengthLimit || _defaultStyle.lengthLimit\n const lineClamp = font.lineClamp || _defaultStyle.lineClamp\n ctx.fillStyle = fontColor\n ctx.font = `${fontWeight} ${fontSize >> 0}px ${fontStyle}`\n let lines = [], text = String(font.text)\n if (wordWrap) {\n lines = splitText(ctx, removeEnter(text), (lines) => {\n // 三角形临边\n const adjacentSide = this.prizeRadius - getFontY(font, prizeHeight, lines.length)\n // 三角形短边\n const shortSide = adjacentSide * Math.tan(this.prizeAng / 2)\n // 最大宽度\n let maxWidth = shortSide * 2 - this.getLength(_defaultConfig.gutter)\n return this.getLength(lengthLimit, maxWidth)\n }, lineClamp)\n } else {\n lines = text.split('\\n')\n }\n lines.filter(line => !!line).forEach((line, lineIndex) => {\n ctx.fillText(line, getFontX(font, line), getFontY(font, prizeHeight, lineIndex))\n })\n })\n // 修正旋转角度和原点坐标\n ctx.rotate(getAngle(360) - currMiddleDeg - getAngle(90))\n ctx.translate(-x, -y)\n })\n ctx.restore()\n // 绘制按钮\n this.buttons.forEach((btn, btnIndex) => {\n let radius = this.getLength(btn.radius, this.prizeRadius)\n // 绘制背景颜色\n this.maxBtnRadius = Math.max(this.maxBtnRadius, radius)\n if (hasBackground(btn.background)) {\n ctx.beginPath()\n ctx.fillStyle = btn.background as string\n ctx.arc(0, 0, radius, 0, Math.PI * 2, false)\n ctx.fill()\n }\n // 绘制指针\n if (btn.pointer && hasBackground(btn.background)) {\n ctx.beginPath()\n ctx.fillStyle = btn.background as string\n ctx.moveTo(-radius, 0)\n ctx.lineTo(radius, 0)\n ctx.lineTo(0, -radius * 2)\n ctx.closePath()\n ctx.fill()\n }\n // 绘制按钮图片\n btn.imgs && btn.imgs.forEach((imgInfo, imgIndex) => {\n const btnImg = this.ImageCache.get(imgInfo.src)\n if (!btnImg) return\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(btnImg, imgInfo, radius * 2, radius * 2)\n const [xAxis, yAxis] = [this.getOffsetX(trueWidth) + this.getLength(imgInfo.left, radius), this.getLength(imgInfo.top, radius)]\n this.drawImage(ctx, btnImg, xAxis, yAxis, trueWidth, trueHeight)\n })\n // 绘制按钮文字\n btn.fonts && btn.fonts.forEach(font => {\n let fontColor = font.fontColor || _defaultStyle.fontColor\n let fontWeight = font.fontWeight || _defaultStyle.fontWeight\n let fontSize = this.getLength(font.fontSize || _defaultStyle.fontSize)\n let fontStyle = font.fontStyle || _defaultStyle.fontStyle\n ctx.fillStyle = fontColor\n ctx.font = `${fontWeight} ${fontSize >> 0}px ${fontStyle}`\n String(font.text).split('\\n').forEach((line, lineIndex) => {\n ctx.fillText(line, getFontX(font, line), getFontY(font, radius, lineIndex))\n })\n })\n })\n // 触发绘制后回调\n config.afterDraw?.call(this, ctx)\n }\n\n /**\n * 刻舟求剑\n */\n private carveOnGunwaleOfAMovingBoat (): void {\n const { _defaultConfig, prizeFlag, prizeDeg, rotateDeg } = this\n this.endTime = Date.now()\n const stopDeg = this.stopDeg = rotateDeg\n const speed = _defaultConfig.speed\n const stopRange = (Math.random() * prizeDeg - prizeDeg / 2) * this.getLength(_defaultConfig.stopRange)\n let i = 0, prevSpeed = 0, prevDeg = 0\n while (++i) {\n const endDeg = 360 * i - prizeFlag! * prizeDeg - rotateDeg - _defaultConfig.offsetDegree + stopRange - prizeDeg / 2\n let currSpeed = quad.easeOut(this.FPS, stopDeg, endDeg, _defaultConfig.decelerationTime) - stopDeg\n if (currSpeed > speed) {\n this.endDeg = (speed - prevSpeed > currSpeed - speed) ? endDeg : prevDeg\n break\n }\n prevDeg = endDeg\n prevSpeed = currSpeed\n }\n }\n\n /**\n * 对外暴露: 开始抽奖方法\n */\n public play (): void {\n if (this.step !== 0) return\n // 记录游戏开始时间\n this.startTime = Date.now()\n // 重置中奖索引\n this.prizeFlag = void 0\n // 加速阶段\n this.step = 1\n // 触发回调\n this.config.afterStart?.()\n // 开始游戏\n this.run()\n }\n\n /**\n * 对外暴露: 缓慢停止方法\n * @param index 中奖索引\n */\n public stop (index?: number): void {\n if (this.step === 0 || this.step === 3) return\n // 如果没有传递中奖索引, 则通过range属性计算一个\n if (!index && index !== 0) {\n const rangeArr = this.prizes.map(item => item.range)\n index = computeRange(rangeArr)\n }\n // 如果index是负数则停止游戏, 反之则传递中奖索引\n if (index < 0) {\n this.step = 0\n this.prizeFlag = -1\n } else {\n this.step = 2\n this.prizeFlag = index % this.prizes.length\n }\n }\n\n /**\n * 实际开始执行方法\n * @param num 记录帧动画执行多少次\n */\n private run (num: number = 0): void {\n const { rAF, step, prizeFlag, _defaultConfig } = this\n const { accelerationTime, decelerationTime, speed } = _defaultConfig\n // 游戏结束\n if (step === 0) {\n this.endCallback?.(this.prizes.find((prize, index) => index === prizeFlag) || {})\n return\n }\n // 如果等于 -1 就直接停止游戏\n if (prizeFlag === -1) return\n // 计算结束位置\n if (step === 3 && !this.endDeg) this.carveOnGunwaleOfAMovingBoat()\n // 计算时间间隔\n const startInterval = Date.now() - this.startTime\n const endInterval = Date.now() - this.endTime\n let rotateDeg = this.rotateDeg\n // \n if (step === 1 || startInterval < accelerationTime) { // 加速阶段\n // 记录帧率\n this.FPS = startInterval / num\n const currSpeed = quad.easeIn(startInterval, 0, speed, accelerationTime)\n // 加速到峰值后, 进入匀速阶段\n if (currSpeed === speed) {\n this.step = 2\n }\n rotateDeg = rotateDeg + currSpeed % 360\n } else if (step === 2) { // 匀速阶段\n // 速度保持不变\n rotateDeg = rotateDeg + speed % 360\n // 如果 prizeFlag 有值, 则进入减速阶段\n if (prizeFlag !== void 0 && prizeFlag >= 0) {\n this.step = 3\n // 清空上一次的位置信息\n this.stopDeg = 0\n this.endDeg = 0\n }\n } else if (step === 3) { // 减速阶段\n // 开始缓慢停止\n rotateDeg = quad.easeOut(endInterval, this.stopDeg, this.endDeg, decelerationTime)\n if (endInterval >= decelerationTime) {\n this.step = 0\n }\n } else {\n // 出现异常\n this.stop(-1)\n }\n this.rotateDeg = rotateDeg\n this.draw()\n rAF(this.run.bind(this, num + 1))\n }\n\n /**\n * 换算渲染坐标\n * @param x\n * @param y\n */\n protected conversionAxis (x: number, y: number): [number, number] {\n const { config } = this\n return [x / config.dpr - this.Radius, y / config.dpr - this.Radius]\n }\n}\n","import Lucky from './lucky'\nimport { UserConfigType, ImgType } from '../types/index'\nimport LuckyGridConfig, {\n BlockType,\n PrizeType,\n ButtonType,\n CellFontType,\n CellImgType,\n RowsType,\n ColsType,\n CellType,\n DefaultConfigType,\n DefaultStyleType,\n ActiveStyleType,\n StartCallbackType,\n EndCallbackType,\n} from '../types/grid'\nimport {\n has,\n isExpectType,\n removeEnter,\n computePadding,\n hasBackground,\n computeRange,\n splitText\n} from '../utils/index'\nimport { roundRectByArc, getLinearGradient } from '../utils/math'\nimport { quad } from '../utils/tween'\n\nexport default class LuckyGrid extends Lucky {\n private rows: RowsType = 3\n private cols: ColsType = 3\n private blocks: Array = []\n private prizes: Array = []\n private buttons: Array = []\n private button?: ButtonType\n private defaultConfig: DefaultConfigType = {}\n private defaultStyle: DefaultStyleType = {}\n private activeStyle: ActiveStyleType = {}\n private _defaultConfig: Required = {} as Required\n private _defaultStyle: Required = {} as Required\n private _activeStyle: Required = {} as Required\n private startCallback?: StartCallbackType\n private endCallback?: EndCallbackType\n private cellWidth = 0 // 格子宽度\n private cellHeight = 0 // 格子高度\n private startTime = 0 // 开始时间戳\n private endTime = 0 // 结束时间戳\n private currIndex = 0 // 当前index累加\n private stopIndex = 0 // 刻舟求剑\n private endIndex = 0 // 停止索引\n private demo = false // 是否自动游走\n private timer = 0 // 游走定时器\n private FPS = 16.6 // 屏幕刷新率\n /**\n * 游戏当前的阶段\n * step = 0 时, 游戏尚未开始\n * step = 1 时, 此时处于加速阶段\n * step = 2 时, 此时处于匀速阶段\n * step = 3 时, 此时处于减速阶段\n */\n private step: 0 | 1 | 2 | 3 = 0\n /**\n * 中奖索引\n * prizeFlag = undefined 时, 处于开始抽奖阶段, 正常旋转\n * prizeFlag >= 0 时, 说明stop方法被调用, 并且传入了中奖索引\n * prizeFlag === -1 时, 说明stop方法被调用, 并且传入了负值, 本次抽奖无效\n */\n private prizeFlag: number | undefined = -1\n // 所有格子\n private cells: CellType[] = []\n // 奖品区域几何信息\n private prizeArea: { x: number, y: number, w: number, h: number } | undefined\n // 图片缓存\n private ImageCache = new Map()\n\n /**\n * 九宫格构造器\n * @param config 配置项\n * @param data 抽奖数据\n */\n constructor (config: UserConfigType, data: LuckyGridConfig) {\n super(config, {\n width: data.width,\n height: data.height\n })\n this.initData(data)\n this.initWatch()\n this.initComputed()\n // 创建前回调函数\n config.beforeCreate?.call(this)\n // 首次初始化\n this.init()\n }\n\n protected resize(): void {\n super.resize()\n this.draw()\n this.config.afterResize?.()\n }\n\n protected initLucky (): void {\n this.cellWidth = 0\n this.cellHeight = 0\n this.startTime = 0\n this.endTime = 0\n this.currIndex = 0\n this.stopIndex = 0\n this.endIndex = 0\n this.demo = false\n this.timer = 0\n this.FPS = 16.6\n this.prizeFlag = -1\n this.step = 0\n super.initLucky()\n }\n\n /**\n * 初始化数据\n * @param data\n */\n private initData (data: LuckyGridConfig): void {\n this.$set(this, 'width', data.width)\n this.$set(this, 'height', data.height)\n this.$set(this, 'rows', Number(data.rows) || 3)\n this.$set(this, 'cols', Number(data.cols) || 3)\n this.$set(this, 'blocks', data.blocks || [])\n this.$set(this, 'prizes', data.prizes || [])\n this.$set(this, 'buttons', data.buttons || [])\n // 临时过渡代码, 升级到2.x即可删除\n this.$set(this, 'button', data.button)\n this.$set(this, 'defaultConfig', data.defaultConfig || {})\n this.$set(this, 'defaultStyle', data.defaultStyle || {})\n this.$set(this, 'activeStyle', data.activeStyle || {})\n this.$set(this, 'startCallback', data.start)\n this.$set(this, 'endCallback', data.end)\n }\n\n /**\n * 初始化属性计算\n */\n private initComputed (): void {\n // 默认配置\n this.$computed(this, '_defaultConfig', () => {\n const config = {\n gutter: 5,\n speed: 20,\n accelerationTime: 2500,\n decelerationTime: 2500,\n ...this.defaultConfig\n }\n config.gutter = this.getLength(config.gutter)\n config.speed = config.speed / 40\n return config\n })\n // 默认样式\n this.$computed(this, '_defaultStyle', () => {\n return {\n borderRadius: 20,\n fontColor: '#000',\n fontSize: '18px',\n fontStyle: 'sans-serif',\n fontWeight: '400',\n background: 'rgba(0,0,0,0)',\n shadow: '',\n wordWrap: true,\n lengthLimit: '90%',\n ...this.defaultStyle\n }\n })\n // 中奖样式\n this.$computed(this, '_activeStyle', () => {\n return {\n background: '#ffce98',\n shadow: '',\n ...this.activeStyle\n }\n })\n }\n\n /**\n * 初始化观察者\n */\n private initWatch (): void {\n // 重置宽度\n this.$watch('width', (newVal: string | number) => {\n this.data.width = newVal\n this.resize()\n })\n // 重置高度\n this.$watch('height', (newVal: string | number) => {\n this.data.height = newVal\n this.resize()\n })\n // 监听 blocks 数据的变化\n this.$watch('blocks', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 监听 prizes 数据的变化\n this.$watch('prizes', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 监听 button 数据的变化\n this.$watch('buttons', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n this.$watch('rows', () => this.init())\n this.$watch('cols', () => this.init())\n this.$watch('defaultConfig', () => this.draw(), { deep: true })\n this.$watch('defaultStyle', () => this.draw(), { deep: true })\n this.$watch('activeStyle', () => this.draw(), { deep: true })\n this.$watch('startCallback', () => this.init())\n this.$watch('endCallback', () => this.init())\n }\n\n /**\n * 初始化 canvas 抽奖\n */\n public async init (): Promise {\n this.initLucky()\n const { config } = this\n // 初始化前回调函数\n config.beforeInit?.call(this)\n // 先画一次防止闪烁\n this.draw()\n // 异步加载图片\n await this.initImageCache()\n // 初始化后回调函数\n config.afterInit?.call(this)\n }\n\n private initImageCache (): Promise {\n return new Promise((resolve) => {\n const btnImgs = this.buttons.map(btn => btn.imgs)\n if (this.button) btnImgs.push(this.button.imgs)\n const willUpdateImgs = {\n blocks: this.blocks.map(block => block.imgs),\n prizes: this.prizes.map(prize => prize.imgs),\n buttons: btnImgs,\n }\n ;(<(keyof typeof willUpdateImgs)[]>Object.keys(willUpdateImgs)).forEach(imgName => {\n const willUpdate = willUpdateImgs[imgName]\n // 循环遍历所有图片\n const allPromise: Promise[] = []\n willUpdate && willUpdate.forEach((imgs, cellIndex) => {\n imgs && imgs.forEach((imgInfo, imgIndex) => {\n allPromise.push(this.loadAndCacheImg(imgName, cellIndex, imgIndex))\n })\n })\n Promise.all(allPromise).then(() => {\n this.draw()\n resolve()\n })\n })\n })\n }\n\n /**\n * canvas点击事件\n * @param e 事件参数\n */\n protected handleClick (e: MouseEvent): void {\n const { ctx } = this\n ;[\n ...this.buttons,\n this.button\n ].forEach(btn => {\n if (!btn) return\n const [x, y, width, height] = this.getGeometricProperty([\n btn.x, btn.y, btn.col || 1, btn.row || 1\n ])\n ctx.beginPath()\n ctx.rect(x, y, width, height)\n if (!ctx.isPointInPath(e.offsetX, e.offsetY)) return\n if (this.step !== 0) return\n // 如果btn里有单独的回调方法, 优先触发\n if (typeof btn.callback === 'function') btn.callback.call(this, btn)\n // 最后触发公共回调\n this.startCallback?.(e, btn)\n })\n }\n\n /**\n * 根据索引单独加载指定图片并缓存\n * @param cellName 模块名称\n * @param cellIndex 模块索引\n * @param imgName 模块对应的图片缓存\n * @param imgIndex 图片索引\n */\n private async loadAndCacheImg (\n cellName: 'blocks' | 'prizes' | 'buttons',\n cellIndex: number,\n imgIndex: number\n ): Promise {\n return new Promise((resolve, reject) => {\n let cell: BlockType | PrizeType | ButtonType = this[cellName][cellIndex]\n // 临时过渡代码, 升级到2.x即可删除\n if (cellName === 'buttons' && !this.buttons.length && this.button) {\n cell = this.button\n }\n if (!cell || !cell.imgs) return\n const imgInfo = cell.imgs[imgIndex]\n if (!imgInfo) return\n // 异步加载图片\n const request = [\n this.loadImg(imgInfo.src, imgInfo),\n imgInfo['activeSrc'] && this.loadImg(imgInfo['activeSrc'], imgInfo, '$activeResolve')\n ]\n Promise.all(request).then(async ([defaultImg, activeImg]) => {\n const formatter = imgInfo.formatter\n // 对图片进行处理\n if (typeof formatter === 'function') {\n defaultImg = await Promise.resolve(formatter.call(this, defaultImg))\n if (activeImg) {\n activeImg = await Promise.resolve(formatter.call(this, activeImg))\n }\n }\n this.ImageCache.set(imgInfo['src'], defaultImg)\n activeImg && this.ImageCache.set(imgInfo['activeSrc'], activeImg)\n resolve()\n }).catch(err => {\n console.error(`${cellName}[${cellIndex}].imgs[${imgIndex}] ${err}`)\n reject()\n })\n })\n }\n\n /**\n * 绘制九宫格抽奖\n */\n protected draw (): void {\n const { config, ctx, _defaultConfig, _defaultStyle, _activeStyle } = this\n // 触发绘制前回调\n config.beforeDraw?.call(this, ctx)\n // 清空画布\n ctx.clearRect(0, 0, this.boxWidth, this.boxHeight)\n // 合并奖品和按钮\n this.cells = [\n ...this.prizes,\n ...this.buttons\n ]\n if (this.button) this.cells.push(this.button)\n this.cells.forEach(cell => {\n cell.col = cell.col || 1\n cell.row = cell.row || 1\n })\n // 计算获取奖品区域的几何信息\n this.prizeArea = this.blocks.reduce(({x, y, w, h}, block, blockIndex) => {\n const [paddingTop, paddingBottom, paddingLeft, paddingRight] = computePadding(block, this.getLength.bind(this))\n const r = block.borderRadius ? this.getLength(block.borderRadius) : 0\n // 绘制边框\n const background = block.background\n if (hasBackground(background)) {\n ctx.fillStyle = this.handleBackground(x, y, w, h, background!)\n roundRectByArc(ctx, x, y, w, h, r)\n ctx.fill()\n }\n // 绘制图片\n block.imgs && block.imgs.forEach((imgInfo, imgIndex) => {\n const blockImg = this.ImageCache.get(imgInfo.src)\n if (!blockImg) return\n // 绘制图片\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(blockImg, imgInfo, w, h)\n const [xAxis, yAxis] = [\n this.getOffsetX(trueWidth, w) + this.getLength(imgInfo.left, w),\n this.getLength(imgInfo.top, h)\n ]\n this.drawImage(ctx, blockImg, x + xAxis, y + yAxis, trueWidth, trueHeight)\n })\n return {\n x: x + paddingLeft,\n y: y + paddingTop,\n w: w - paddingLeft - paddingRight,\n h: h - paddingTop - paddingBottom\n }\n }, { x: 0, y: 0, w: this.boxWidth, h: this.boxHeight })\n // 计算单一奖品格子的宽度和高度\n this.cellWidth = (this.prizeArea.w - _defaultConfig.gutter * (this.cols - 1)) / this.cols\n this.cellHeight = (this.prizeArea.h - _defaultConfig.gutter * (this.rows - 1)) / this.rows\n // 绘制所有格子\n this.cells.forEach((cell, cellIndex) => {\n let [x, y, width, height] = this.getGeometricProperty([cell.x, cell.y, cell.col!, cell.row!])\n // 默认不显示中奖标识\n let isActive = false\n // 只要 prizeFlag 不是负数, 就显示中奖标识\n if (this.prizeFlag === void 0 || this.prizeFlag > -1) {\n isActive = cellIndex === this.currIndex % this.prizes.length >> 0\n }\n // 绘制背景色\n const background = isActive ? _activeStyle.background : (cell.background || _defaultStyle.background)\n if (hasBackground(background)) {\n // 处理阴影 (暂时先用any, 这里后续要优化)\n const shadow: any = (\n isActive ? _activeStyle.shadow : (cell.shadow || _defaultStyle.shadow)\n )\n .replace(/px/g, '') // 清空px字符串\n .split(',')[0].split(' ') // 防止有人声明多个阴影, 截取第一个阴影\n .map((n, i) => i < 3 ? Number(n) : n) // 把数组的前三个值*像素比\n // 绘制阴影\n if (shadow.length === 4) {\n ctx.shadowColor = shadow[3]\n ctx.shadowOffsetX = shadow[0] * config.dpr\n ctx.shadowOffsetY = shadow[1] * config.dpr\n ctx.shadowBlur = shadow[2]\n // 修正(格子+阴影)的位置, 这里使用逗号运算符\n shadow[0] > 0 ? (width -= shadow[0]) : (width += shadow[0], x -= shadow[0])\n shadow[1] > 0 ? (height -= shadow[1]) : (height += shadow[1], y -= shadow[1])\n }\n // 绘制背景\n ctx.fillStyle = this.handleBackground(x, y, width, height, background)\n const borderRadius = this.getLength(cell.borderRadius ? cell.borderRadius : _defaultStyle.borderRadius)\n roundRectByArc(ctx, x, y, width, height, borderRadius)\n ctx.fill()\n // 清空阴影\n ctx.shadowColor = 'rgba(0, 0, 0, 0)'\n ctx.shadowOffsetX = 0\n ctx.shadowOffsetY = 0\n ctx.shadowBlur = 0\n }\n // 修正图片缓存\n let cellName = 'prizes'\n if (cellIndex >= this.prizes.length) {\n cellName = 'buttons'\n cellIndex -= this.prizes.length\n }\n // 绘制图片\n cell.imgs && cell.imgs.forEach((imgInfo, imgIndex) => {\n const cellImg = this.ImageCache.get(imgInfo.src)\n const activeImg = this.ImageCache.get(imgInfo['activeSrc'])\n if (!cellImg) return\n const renderImg = (isActive && activeImg) || cellImg\n if (!renderImg) return\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(renderImg, imgInfo, width, height)\n const [xAxis, yAxis] = [\n x + this.getOffsetX(trueWidth, width) + this.getLength(imgInfo.left, width),\n y + this.getLength(imgInfo.top, height)\n ]\n this.drawImage(ctx, renderImg, xAxis, yAxis, trueWidth, trueHeight)\n })\n // 绘制文字\n cell.fonts && cell.fonts.forEach(font => {\n // 字体样式\n const style = isActive && _activeStyle.fontStyle\n ? _activeStyle.fontStyle\n : (font.fontStyle || _defaultStyle.fontStyle)\n // 字体加粗\n const fontWeight = isActive && _activeStyle.fontWeight\n ? _activeStyle.fontWeight\n : (font.fontWeight || _defaultStyle.fontWeight)\n // 字体大小\n const size = isActive && _activeStyle.fontSize\n ? this.getLength(_activeStyle.fontSize)\n : this.getLength(font.fontSize || _defaultStyle.fontSize)\n // 字体行高\n const lineHeight = isActive && _activeStyle.lineHeight\n ? _activeStyle.lineHeight\n : font.lineHeight || _defaultStyle.lineHeight || font.fontSize || _defaultStyle.fontSize\n const wordWrap = has(font, 'wordWrap') ? font.wordWrap : _defaultStyle.wordWrap\n const lengthLimit = font.lengthLimit || _defaultStyle.lengthLimit\n const lineClamp = font.lineClamp || _defaultStyle.lineClamp\n ctx.font = `${fontWeight} ${size >> 0}px ${style}`\n ctx.fillStyle = (isActive && _activeStyle.fontColor) ? _activeStyle.fontColor : (font.fontColor || _defaultStyle.fontColor)\n let lines = [], text = String(font.text)\n // 计算文字换行\n if (wordWrap) {\n // 最大宽度\n let maxWidth = this.getLength(lengthLimit, width)\n lines = splitText(ctx, removeEnter(text), () => maxWidth, lineClamp)\n } else {\n lines = text.split('\\n')\n }\n lines.forEach((line, lineIndex) => {\n ctx.fillText(\n line,\n x + this.getOffsetX(ctx.measureText(line).width, width) + this.getLength(font.left, width),\n y + this.getLength(font.top, height) + (lineIndex + 1) * this.getLength(lineHeight)\n )\n })\n })\n })\n // 触发绘制后回调\n config.afterDraw?.call(this, ctx)\n }\n\n /**\n * 处理背景色\n * @param x\n * @param y\n * @param width\n * @param height\n * @param background\n * @param isActive\n */\n private handleBackground (\n x: number,\n y: number,\n width: number,\n height: number,\n background: string,\n ) {\n const { ctx } = this\n // 处理线性渐变\n if (background.includes('linear-gradient')) {\n background = getLinearGradient(ctx, x, y, width, height, background)\n }\n return background\n }\n\n /**\n * 刻舟求剑\n */\n private carveOnGunwaleOfAMovingBoat (): void {\n const { _defaultConfig, prizeFlag, currIndex } = this\n this.endTime = Date.now()\n const stopIndex = this.stopIndex = currIndex\n const speed = _defaultConfig.speed\n let i = 0, prevSpeed = 0, prevIndex = 0\n while (++i) {\n const endIndex = this.prizes.length * i + prizeFlag! - (stopIndex)\n const currSpeed = quad.easeOut(this.FPS, stopIndex, endIndex, _defaultConfig.decelerationTime) - stopIndex\n if (currSpeed > speed) {\n this.endIndex = (speed - prevSpeed > currSpeed - speed) ? endIndex : prevIndex\n break\n }\n prevIndex = endIndex\n prevSpeed = currSpeed\n }\n }\n\n /**\n * 对外暴露: 开始抽奖方法\n */\n public play (): void {\n if (this.step !== 0) return\n // 记录游戏开始的时间\n this.startTime = Date.now()\n // 重置中奖索引\n this.prizeFlag = void 0\n // 开始加速\n this.step = 1\n // 触发回调\n this.config.afterStart?.()\n // 开始运行\n this.run()\n }\n\n /**\n * 对外暴露: 缓慢停止方法\n * @param index 中奖索引\n */\n public stop (index?: number): void {\n if (this.step === 0 || this.step === 3) return\n // 如果没有传递中奖索引, 则通过range属性计算一个\n if (!index && index !== 0) {\n const rangeArr = this.prizes.map(item => item.range)\n index = computeRange(rangeArr)\n }\n // 如果index是负数则停止游戏, 反之则传递中奖索引\n if (index < 0) {\n this.step = 0\n this.prizeFlag = -1\n } else {\n this.step = 2\n this.prizeFlag = index % this.prizes.length\n }\n }\n\n /**\n * 实际开始执行方法\n * @param num 记录帧动画执行多少次\n */\n private run (num: number = 0): void {\n const { rAF, step, prizes, prizeFlag, _defaultConfig } = this\n const { accelerationTime, decelerationTime, speed } = _defaultConfig\n // 结束游戏\n if (step === 0) {\n this.endCallback?.(this.prizes.find((prize, index) => index === prizeFlag) || {})\n return\n }\n // 如果等于 -1 就直接停止游戏\n if (prizeFlag === -1) return\n // 计算结束位置\n if (step === 3 && !this.endIndex) this.carveOnGunwaleOfAMovingBoat()\n // 计算时间间隔\n const startInterval = Date.now() - this.startTime\n const endInterval = Date.now() - this.endTime\n let currIndex = this.currIndex\n // \n if (step === 1 || startInterval < accelerationTime) { // 加速阶段\n // 记录帧率\n this.FPS = startInterval / num\n const currSpeed = quad.easeIn(startInterval, 0.1, speed - 0.1, accelerationTime)\n // 加速到峰值后, 进入匀速阶段\n if (currSpeed === speed) {\n this.step = 2\n }\n currIndex = currIndex + currSpeed % prizes.length\n } else if (step === 2) { // 匀速阶段\n // 速度保持不变\n currIndex = currIndex + speed % prizes.length\n // 如果 prizeFlag 有值, 则进入减速阶段\n if (prizeFlag !== void 0 && prizeFlag >= 0) {\n this.step = 3\n // 清空上一次的位置信息\n this.stopIndex = 0\n this.endIndex = 0\n }\n } else if (step === 3) { // 减速阶段\n // 开始缓慢停止\n currIndex = quad.easeOut(endInterval, this.stopIndex, this.endIndex, decelerationTime)\n if (endInterval >= decelerationTime) {\n this.step = 0\n }\n } else {\n // 出现异常\n this.stop(-1)\n }\n this.currIndex = currIndex\n this.draw()\n rAF(this.run.bind(this, num + 1))\n }\n\n /**\n * 计算奖品格子的几何属性\n * @param { array } [...矩阵坐标, col, row]\n * @return { array } [...真实坐标, width, height]\n */\n private getGeometricProperty ([x, y, col = 1, row = 1]: number[]) {\n const { cellWidth, cellHeight } = this\n const gutter = this._defaultConfig.gutter\n let res = [\n this.prizeArea!.x + (cellWidth + gutter) * x,\n this.prizeArea!.y + (cellHeight + gutter) * y\n ]\n col && row && res.push(\n cellWidth * col + gutter * (col - 1),\n cellHeight * row + gutter * (row - 1),\n )\n return res\n }\n\n /**\n * 换算渲染坐标\n * @param x\n * @param y\n */\n protected conversionAxis (x: number, y: number): [number, number] {\n const { config } = this\n return [x / config.dpr, y / config.dpr]\n }\n}\n","import Lucky from './lucky'\nimport { UserConfigType, ImgType, ImgItemType, Tuple } from '../types/index'\nimport SlotMachineConfig, {\n BlockType,\n PrizeType,\n SlotType,\n DefaultConfigType,\n DefaultStyleType,\n EndCallbackType,\n} from '../types/slot'\nimport {\n get, has,\n isExpectType,\n removeEnter,\n computePadding,\n hasBackground,\n computeRange,\n splitText,\n getSortedArrayByIndex\n} from '../utils/index'\nimport { roundRectByArc } from '../utils/math'\nimport { quad } from '../utils/tween'\n\nexport default class SlotMachine extends Lucky {\n // 背景\n private blocks: Array = []\n // 奖品列表\n private prizes: Array = []\n // 插槽列表\n private slots: Array = []\n // 默认配置\n private defaultConfig: DefaultConfigType = {}\n private _defaultConfig: Required = {} as Required\n // 默认样式\n private defaultStyle: DefaultStyleType = {}\n private _defaultStyle: Required = {} as Required\n private endCallback: EndCallbackType = () => {}\n // 离屏canvas\n private _offscreenCanvas?: HTMLCanvasElement\n private cellWidth = 0 // 格子宽度\n private cellHeight = 0 // 格子高度\n private cellAndSpacing = 0 // 格子+间距\n private widthAndSpacing = 0 // 格子宽度+列间距\n private heightAndSpacing = 0 // 格子高度+行间距\n private FPS = 16.6 // 屏幕刷新率\n private scroll: number[] = [] // 滚动的长度\n private stopScroll: number[] = [] // 刻舟求剑\n private endScroll: number[] = [] // 最终停止的长度\n private startTime = 0 // 开始游戏的时间\n private endTime = 0 // 开始停止的时间\n /**\n * 游戏当前的阶段\n * step = 0 时, 游戏尚未开始\n * step = 1 时, 此时处于加速阶段\n * step = 2 时, 此时处于匀速阶段\n * step = 3 时, 此时处于减速阶段\n */\n private step: 0 | 1 | 2 | 3 = 0\n /**\n * 中奖索引\n * prizeFlag = undefined 时, 处于开始抽奖阶段, 正常旋转\n * prizeFlag >= 0 时, 说明stop方法被调用, 并且传入了中奖索引\n * prizeFlag === -1 时, 说明stop方法被调用, 并且传入了负值, 本次抽奖无效\n */\n private prizeFlag: number[] | undefined = void 0\n // 奖品区域几何信息\n private prizeArea?: { x: number, y: number, w: number, h: number }\n // 图片缓存\n private ImageCache = new Map()\n\n /**\n * 老虎机构造器\n * @param config 配置项\n * @param data 抽奖数据\n */\n constructor (config: UserConfigType, data: SlotMachineConfig) {\n super(config, {\n width: data.width,\n height: data.height\n })\n this.initData(data)\n this.initWatch()\n this.initComputed()\n // 创建前回调函数\n config.beforeCreate?.call(this)\n // 首次初始化\n this.init()\n }\n\n protected resize(): void {\n super.resize()\n this.draw()\n this.config.afterResize?.()\n }\n\n protected initLucky (): void {\n this.cellWidth = 0\n this.cellHeight = 0\n this.cellAndSpacing = 0\n this.widthAndSpacing = 0\n this.heightAndSpacing = 0\n this.FPS = 16.6\n this.scroll = []\n this.stopScroll = []\n this.endScroll = []\n this.startTime = 0\n this.endTime = 0\n this.prizeFlag = void 0\n this.step = 0\n super.initLucky()\n }\n\n /**\n * 初始化数据\n * @param data\n */\n private initData (data: SlotMachineConfig): void {\n this.$set(this, 'width', data.width)\n this.$set(this, 'height', data.height)\n this.$set(this, 'blocks', data.blocks || [])\n this.$set(this, 'prizes', data.prizes || [])\n this.$set(this, 'slots', data.slots || [])\n this.$set(this, 'defaultConfig', data.defaultConfig || {})\n this.$set(this, 'defaultStyle', data.defaultStyle || {})\n this.$set(this, 'endCallback', data.end)\n }\n\n /**\n * 初始化属性计算\n */\n private initComputed (): void {\n // 默认配置\n this.$computed(this, '_defaultConfig', () => {\n const config = {\n mode: 'vertical',\n rowSpacing: 0,\n colSpacing: 5,\n speed: 20,\n direction: 1,\n accelerationTime: 2500,\n decelerationTime: 2500,\n ...this.defaultConfig\n }\n config.rowSpacing = this.getLength(config.rowSpacing)\n config.colSpacing = this.getLength(config.colSpacing)\n return config\n })\n // 默认样式\n this.$computed(this, '_defaultStyle', () => {\n return {\n borderRadius: 0,\n fontColor: '#000',\n fontSize: '18px',\n fontStyle: 'sans-serif',\n fontWeight: '400',\n background: 'rgba(0,0,0,0)',\n wordWrap: true,\n lengthLimit: '90%',\n ...this.defaultStyle\n }\n })\n }\n\n /**\n * 初始化观察者\n */\n private initWatch (): void {\n // 重置宽度\n this.$watch('width', (newVal: string | number) => {\n this.data.width = newVal\n this.resize()\n })\n // 重置高度\n this.$watch('height', (newVal: string | number) => {\n this.data.height = newVal\n this.resize()\n })\n // 监听 blocks 数据的变化\n this.$watch('blocks', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 监听 prizes 数据的变化\n this.$watch('prizes', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 监听 prizes 数据的变化\n this.$watch('slots', (newData: Array) => {\n this.drawOffscreenCanvas()\n this.draw()\n }, { deep: true })\n this.$watch('defaultConfig', () => this.draw(), { deep: true })\n this.$watch('defaultStyle', () => this.draw(), { deep: true })\n this.$watch('endCallback', () => this.init())\n }\n\n /**\n * 初始化 canvas 抽奖\n */\n public async init (): Promise {\n this.initLucky()\n const { config } = this\n // 初始化前回调函数\n config.beforeInit?.call(this)\n // 先绘制一次\n this.drawOffscreenCanvas()\n this.draw()\n // 异步加载图片\n await this.initImageCache()\n // 初始化后回调函数\n config.afterInit?.call(this)\n }\n\n private initImageCache (): Promise {\n return new Promise((resolve) => {\n const willUpdateImgs = {\n blocks: this.blocks.map(block => block.imgs),\n prizes: this.prizes.map(prize => prize.imgs),\n }\n ;(<(keyof typeof willUpdateImgs)[]>Object.keys(willUpdateImgs)).forEach(imgName => {\n const willUpdate = willUpdateImgs[imgName]\n // 循环遍历所有图片\n const allPromise: Promise[] = []\n willUpdate && willUpdate.forEach((imgs, cellIndex) => {\n imgs && imgs.forEach((imgInfo, imgIndex) => {\n allPromise.push(this.loadAndCacheImg(imgName, cellIndex, imgIndex))\n })\n })\n Promise.all(allPromise).then(() => {\n this.drawOffscreenCanvas()\n this.draw()\n resolve()\n })\n })\n })\n }\n\n /**\n * 根据索引单独加载指定图片并缓存\n * @param cellName 模块名称\n * @param cellIndex 模块索引\n * @param imgName 模块对应的图片缓存\n * @param imgIndex 图片索引\n */\n private async loadAndCacheImg (\n cellName: 'blocks' | 'prizes',\n cellIndex: number,\n imgIndex: number\n ): Promise {\n return new Promise((resolve, reject) => {\n let cell: BlockType | PrizeType = this[cellName][cellIndex]\n if (!cell || !cell.imgs) return\n const imgInfo = cell.imgs[imgIndex]\n if (!imgInfo) return\n // 异步加载图片\n this.loadImg(imgInfo.src, imgInfo).then(async currImg => {\n if (typeof imgInfo.formatter === 'function') {\n currImg = await Promise.resolve(imgInfo.formatter.call(this, currImg))\n }\n this.ImageCache.set(imgInfo['src'], currImg)\n resolve()\n }).catch(err => {\n console.error(`${cellName}[${cellIndex}].imgs[${imgIndex}] ${err}`)\n reject()\n })\n })\n }\n\n /**\n * 绘制离屏canvas\n */\n protected drawOffscreenCanvas (): void {\n const { _defaultConfig, _defaultStyle } = this\n const { w, h } = this.drawBlocks()!\n // 计算单一奖品格子的宽度和高度\n const prizesLen = this.prizes.length\n const { cellWidth, cellHeight, widthAndSpacing, heightAndSpacing } = this.displacementWidthOrHeight()\n const defaultOrder = new Array(prizesLen).fill(void 0).map((v, i) => i)\n let maxOrderLen = 0, maxOffWidth = 0, maxOffHeight = 0\n this.slots.forEach((slot, slotIndex) => {\n // 初始化 scroll 的值\n if (this.scroll[slotIndex] === void 0) this.scroll[slotIndex] = 0\n // 如果没有order属性, 就填充prizes\n slot.order = slot.order || defaultOrder\n // 计算最大值\n const currLen = slot.order.length\n maxOrderLen = Math.max(maxOrderLen, currLen)\n maxOffWidth = Math.max(maxOffWidth, w + widthAndSpacing * currLen)\n maxOffHeight = Math.max(maxOffHeight, h + heightAndSpacing * currLen)\n })\n // 创建一个离屏Canvas来存储画布的内容\n const { _offscreenCanvas, _ctx } = this.getOffscreenCanvas(maxOffWidth, maxOffHeight)!\n this._offscreenCanvas = _offscreenCanvas\n // 绘制插槽\n this.slots.forEach((slot, slotIndex) => {\n const cellX = cellWidth * slotIndex\n const cellY = cellHeight * slotIndex\n let lengthOfCopy = 0\n // 绘制奖品\n const newPrizes = getSortedArrayByIndex(this.prizes, slot.order!)\n // 如果没有奖品则打断逻辑\n if (!newPrizes.length) return\n newPrizes.forEach((cell, cellIndex) => {\n if (!cell) return\n const orderIndex = slot.order![cellIndex]\n const prizesX = widthAndSpacing * cellIndex + _defaultConfig.colSpacing / 2\n const prizesY = heightAndSpacing * cellIndex + _defaultConfig.rowSpacing / 2\n const [_x, _y, spacing] = this.displacement(\n [cellX, prizesY, heightAndSpacing],\n [prizesX, cellY, widthAndSpacing]\n )\n lengthOfCopy += spacing\n // 绘制背景\n const background = cell.background || _defaultStyle.background\n if (hasBackground(background)) {\n const borderRadius = this.getLength(has(cell, 'borderRadius') ? cell.borderRadius : _defaultStyle.borderRadius)\n roundRectByArc(_ctx, _x, _y, cellWidth, cellWidth, borderRadius)\n _ctx.fillStyle = background\n _ctx.fill()\n }\n // 绘制图片\n cell.imgs && cell.imgs.forEach((imgInfo, imgIndex) => {\n const cellImg = this.ImageCache.get(imgInfo.src)\n if (!cellImg) return\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(cellImg, imgInfo, cellWidth, cellHeight)\n const [xAxis, yAxis] = [\n _x + this.getOffsetX(trueWidth, cellWidth) + this.getLength(imgInfo.left, cellWidth),\n _y + this.getLength(imgInfo.top, cellHeight)\n ]\n this.drawImage(_ctx, cellImg, xAxis, yAxis, trueWidth, trueHeight)\n })\n // 绘制文字\n cell.fonts && cell.fonts.forEach(font => {\n // 字体样式\n const style = font.fontStyle || _defaultStyle.fontStyle\n // 字体加粗\n const fontWeight = font.fontWeight || _defaultStyle.fontWeight\n // 字体大小\n const size = this.getLength(font.fontSize || _defaultStyle.fontSize)\n // 字体行高\n const lineHeight = font.lineHeight || _defaultStyle.lineHeight || font.fontSize || _defaultStyle.fontSize\n const wordWrap = has(font, 'wordWrap') ? font.wordWrap : _defaultStyle.wordWrap\n const lengthLimit = font.lengthLimit || _defaultStyle.lengthLimit\n const lineClamp = font.lineClamp || _defaultStyle.lineClamp\n _ctx.font = `${fontWeight} ${size >> 0}px ${style}`\n _ctx.fillStyle = font.fontColor || _defaultStyle.fontColor\n let lines = [], text = String(font.text)\n // 计算文字换行\n if (wordWrap) {\n // 最大宽度\n let maxWidth = this.getLength(lengthLimit, cellWidth)\n lines = splitText(_ctx, removeEnter(text), () => maxWidth, lineClamp)\n } else {\n lines = text.split('\\n')\n }\n lines.forEach((line, lineIndex) => {\n _ctx.fillText(\n line,\n _x + this.getOffsetX(_ctx.measureText(line).width, cellWidth) + this.getLength(font.left, cellWidth),\n _y + this.getLength(font.top, cellHeight) + (lineIndex + 1) * this.getLength(lineHeight)\n )\n })\n })\n })\n const [_x, _y, _w, _h] = this.displacement(\n [cellX, 0, cellWidth, lengthOfCopy],\n [0, cellY, lengthOfCopy, cellHeight]\n )\n let drawLen = lengthOfCopy\n while (drawLen < maxOffHeight + lengthOfCopy) {\n const [drawX, drawY] = this.displacement([_x, drawLen], [drawLen, _y])\n this.drawImage(\n _ctx, _offscreenCanvas,\n _x, _y, _w, _h,\n drawX, drawY, _w, _h\n )\n drawLen += lengthOfCopy\n }\n })\n }\n\n /**\n * 绘制背景区域\n */\n protected drawBlocks (): SlotMachine['prizeArea'] {\n const { config, ctx, _defaultConfig, _defaultStyle } = this\n // 绘制背景区域, 并计算奖品区域\n return this.prizeArea = this.blocks.reduce(({x, y, w, h}, block, blockIndex) => {\n const [paddingTop, paddingBottom, paddingLeft, paddingRight] = computePadding(block, this.getLength.bind(this))\n const r = block.borderRadius ? this.getLength(block.borderRadius) : 0\n // 绘制边框\n const background = block.background || _defaultStyle.background\n if (hasBackground(background)) {\n roundRectByArc(ctx, x, y, w, h, r)\n ctx.fillStyle = background\n ctx.fill()\n }\n // 绘制图片\n block.imgs && block.imgs.forEach((imgInfo, imgIndex) => {\n const blockImg = this.ImageCache.get(imgInfo.src)\n if (!blockImg) return\n // 绘制图片\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(blockImg, imgInfo, w, h)\n const [xAxis, yAxis] = [this.getOffsetX(trueWidth, w) + this.getLength(imgInfo.left, w), this.getLength(imgInfo.top, h)]\n this.drawImage(ctx, blockImg, x + xAxis, y + yAxis, trueWidth, trueHeight)\n })\n return {\n x: x + paddingLeft,\n y: y + paddingTop,\n w: w - paddingLeft - paddingRight,\n h: h - paddingTop - paddingBottom\n }\n }, { x: 0, y: 0, w: this.boxWidth, h: this.boxHeight })\n }\n\n /**\n * 绘制老虎机抽奖\n */\n protected draw (): void {\n const { config, ctx, _defaultConfig, _defaultStyle } = this\n // 触发绘制前回调\n config.beforeDraw?.call(this, ctx)\n // 清空画布\n ctx.clearRect(0, 0, this.boxWidth, this.boxHeight)\n // 绘制背景\n const { x, y, w, h } = this.drawBlocks()!\n // 绘制插槽\n if (!this._offscreenCanvas) return\n const { cellWidth, cellHeight, cellAndSpacing, widthAndSpacing, heightAndSpacing } = this\n this.slots.forEach((slot, slotIndex) => {\n // 绘制临界点\n const _p = cellAndSpacing * slot.order!.length\n // 调整奖品垂直居中\n const start = this.displacement(-(h - heightAndSpacing) / 2, -(w - widthAndSpacing) / 2)\n let scroll = this.scroll[slotIndex] + start\n // scroll 会无限累加 1 / -1\n if (scroll < 0) {\n scroll = scroll % _p + _p\n }\n if (scroll > _p) {\n scroll = scroll % _p\n }\n const [sx, sy, sw, sh] = this.displacement(\n [cellWidth * slotIndex, scroll, cellWidth, h],\n [scroll, cellHeight * slotIndex, w, cellHeight]\n )\n const [dx, dy, dw, dh] = this.displacement(\n [x + widthAndSpacing * slotIndex, y, cellWidth, h],\n [x, y + heightAndSpacing * slotIndex, w, cellHeight]\n )\n this.drawImage(ctx, this._offscreenCanvas!, sx, sy, sw, sh, dx, dy, dw, dh)\n })\n }\n\n /**\n * 刻舟求剑\n */\n private carveOnGunwaleOfAMovingBoat (): void {\n const { _defaultConfig, prizeFlag, cellAndSpacing } = this\n // 记录开始停止的时间戳\n this.endTime = Date.now()\n this.slots.forEach((slot, slotIndex) => {\n const order = slot.order!\n if (!order.length) return\n const speed = slot.speed || _defaultConfig.speed\n const direction = slot.direction || _defaultConfig.direction\n const orderIndex = order.findIndex(prizeIndex => prizeIndex === prizeFlag![slotIndex])\n const _p = cellAndSpacing * order.length\n const stopScroll = this.stopScroll[slotIndex] = this.scroll[slotIndex]\n let i = 0\n while (++i) {\n const endScroll = cellAndSpacing * orderIndex + (_p * i * direction) - stopScroll\n const currSpeed = quad.easeOut(this.FPS, stopScroll, endScroll, _defaultConfig.decelerationTime) - stopScroll\n if (Math.abs(currSpeed) > speed) {\n this.endScroll[slotIndex] = endScroll\n break\n }\n }\n })\n }\n\n /**\n * 对外暴露: 开始抽奖方法\n */\n public play (): void {\n if (this.step !== 0) return\n // 记录开始游戏的时间\n this.startTime = Date.now()\n // 清空中奖索引\n this.prizeFlag = void 0\n // 开始加速\n this.step = 1\n // 触发回调\n this.config.afterStart?.()\n // 开始渲染\n this.run()\n }\n\n public stop (index: number | number[]): void {\n if (this.step === 0 || this.step === 3) return\n // 设置中奖索引\n if (typeof index === 'number') {\n this.prizeFlag = new Array(this.slots.length).fill(index)\n } else if (isExpectType(index, 'array')) {\n if (index.length === this.slots.length) {\n this.prizeFlag = index\n } else {\n this.stop(-1)\n return console.error(`stop([${index}]) 参数长度的不正确`)\n }\n } else {\n this.stop(-1)\n return console.error(`stop() 无法识别的参数类型 ${typeof index}`)\n }\n // 如果包含负数则停止游戏, 反之则继续游戏\n if (this.prizeFlag?.includes(-1)) {\n this.prizeFlag = []\n // 停止游戏\n this.step = 0\n } else {\n // 进入匀速\n this.step = 2\n }\n }\n\n /**\n * 让游戏动起来\n * @param num 记录帧动画执行多少次\n */\n private run (num: number = 0): void {\n const { rAF, step, prizeFlag, _defaultConfig, cellAndSpacing, slots } = this\n const { accelerationTime, decelerationTime } = _defaultConfig\n // 游戏结束\n if (this.step === 0 && prizeFlag?.length === slots.length) {\n let flag = prizeFlag[0]\n for (let i = 0; i < slots.length; i++) {\n const slot = slots[i], currFlag = prizeFlag[i]\n if (!slot.order?.includes(currFlag) || flag !== currFlag) {\n flag = -1\n break\n }\n }\n this.endCallback?.(this.prizes.find((prize, index) => index === flag) || void 0)\n return\n }\n // 如果长度为 0 就直接停止游戏\n if (prizeFlag !== void 0 && !prizeFlag.length) return\n // 计算最终停止的位置\n if (this.step === 3 && !this.endScroll.length) this.carveOnGunwaleOfAMovingBoat()\n // 计算时间间隔\n const startInterval = Date.now() - this.startTime\n const endInterval = Date.now() - this.endTime\n // 分别计算对应插槽的加速度\n slots.forEach((slot, slotIndex) => {\n const order = slot.order\n if (!order || !order.length) return\n const _p = cellAndSpacing * order.length\n const speed = Math.abs(slot.speed || _defaultConfig.speed)\n const direction = slot.direction || _defaultConfig.direction\n let scroll = 0, prevScroll = this.scroll[slotIndex]\n if (step === 1 || startInterval < accelerationTime) { // 加速阶段\n // 记录帧率\n this.FPS = startInterval / num\n const currSpeed = quad.easeIn(startInterval, 0, speed, accelerationTime)\n // 加速到最大速度后, 即可进入匀速阶段\n if (currSpeed === speed) {\n this.step = 2\n }\n scroll = (prevScroll + (currSpeed * direction)) % _p\n } else if (step === 2) { // 匀速阶段\n // 速度保持不变\n scroll = (prevScroll + (speed * direction)) % _p\n // 如果有 prizeFlag 有值, 则进入减速阶段\n if (prizeFlag?.length === slots.length) {\n this.step = 3\n // 清空上一轮的位置信息\n this.stopScroll = []\n this.endScroll = []\n }\n } else if (step === 3 && endInterval) { // 减速阶段\n // 开始缓慢停止\n const stopScroll = this.stopScroll[slotIndex]\n const endScroll = this.endScroll[slotIndex]\n scroll = quad.easeOut(endInterval, stopScroll, endScroll, decelerationTime)\n if (endInterval >= decelerationTime) {\n this.step = 0\n }\n }\n this.scroll[slotIndex] = scroll\n })\n this.draw()\n rAF(this.run.bind(this, num + 1))\n }\n\n // 根据mode置换数值\n private displacement (a: T, b: T): T {\n return this._defaultConfig.mode === 'horizontal' ? b : a\n }\n\n // 根据mode计算宽高\n private displacementWidthOrHeight () {\n const mode = this._defaultConfig.mode\n const slotsLen = this.slots.length\n const { colSpacing, rowSpacing } = this._defaultConfig\n const { x, y, w, h } = this.prizeArea || this.drawBlocks()!\n let cellWidth = 0, cellHeight = 0, widthAndSpacing = 0, heightAndSpacing = 0\n if (mode === 'horizontal') {\n cellHeight = this.cellHeight = (h - rowSpacing * (slotsLen - 1)) / slotsLen\n cellWidth = this.cellWidth = cellHeight\n } else {\n cellWidth = this.cellWidth = (w - colSpacing * (slotsLen - 1)) / slotsLen\n cellHeight = this.cellHeight = cellWidth\n }\n widthAndSpacing = this.widthAndSpacing = this.cellWidth + colSpacing\n heightAndSpacing = this.heightAndSpacing = this.cellHeight + rowSpacing\n if (mode === 'horizontal') {\n this.cellAndSpacing = widthAndSpacing\n } else {\n this.cellAndSpacing = heightAndSpacing\n }\n return {\n cellWidth,\n cellHeight,\n widthAndSpacing,\n heightAndSpacing,\n }\n }\n}\n","import { ImgType } from '../types/index'\nimport { roundRectByArc } from './math'\n\n/**\n * 根据路径获取图片对象\n * @param { string } src 图片路径\n * @returns { Promise } 图片标签\n */\nexport const getImage = (src: string): Promise => {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => resolve(img)\n img.onerror = err => reject(err)\n img.src = src\n })\n}\n\n/**\n * 切割圆角\n * @param img 将要裁剪的图片对象\n * @param radius 裁剪的圆角半径\n * @returns 返回一个离屏 canvas 用于渲染\n */\nexport const cutRound = (img: ImgType, radius: number): ImgType => {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')!\n const { width, height } = img\n canvas.width = width\n canvas.height = height\n roundRectByArc(ctx, 0, 0, width, height, radius)\n ctx.clip()\n ctx.drawImage(img, 0, 0, width, height)\n return canvas\n}\n\n/**\n * 透明度\n * @param img 将要处理的图片对象\n * @param opacity 透明度\n * @returns 返回一个离屏 canvas 用于渲染\n */\nexport const opacity = (\n img: ImgType,\n opacity: number\n): ImgType => {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')!\n const { width, height } = img\n canvas.width = width\n canvas.height = height\n // 绘制图片, 部分浏览器不支持 filter 属性, 需要处理兼容\n if (typeof ctx.filter === 'string') {\n ctx.filter = `opacity(${opacity * 100}%)`\n ctx.drawImage(img, 0, 0, width, height)\n } else {\n ctx.drawImage(img, 0, 0, width, height)\n const imageData = ctx.getImageData(0, 0, width, height)\n const { data } = imageData\n const len = data.length\n for (let i = 0; i < len; i += 4) {\n const alpha = data[i + 3]\n if (alpha !== 0) data[i + 3] = alpha * opacity\n }\n ctx.putImageData(imageData, 0, 0)\n }\n return canvas\n}\n\n/**\n * 权重矩阵\n * @param radius 模糊半径\n * @param sigma \n * @returns 返回一个权重和为1的矩阵\n */\nconst getMatrix = (radius: number, sigma?: number): number[] => {\n sigma = sigma || radius / 3\n const r = Math.ceil(radius)\n const sigma_2 = sigma * sigma\n const sigma2_2 = 2 * sigma_2\n const denominator = 1 / (2 * Math.PI * sigma_2)\n const matrix = []\n let total = 0\n // 计算权重矩阵\n for (let x = -r; x <= r; x++) {\n for (let y = -r; y <= r; y++) {\n // 套用二维高斯函数得到每个点的权重\n const res = denominator * Math.exp(-(x * x + y * y) / sigma2_2)\n matrix.push(res)\n total += res\n }\n }\n // 让矩阵中所有权重的和等于1\n for (let i = 0; i < matrix.length; i++) {\n matrix[i] /= total\n }\n return matrix\n}\n\n/**\n * 高斯模糊\n * @param img 将要处理的图片对象\n * @param radius 模糊半径\n * @returns 返回一个离屏 canvas 用于渲染\n */\nexport const blur = (\n img: ImgType,\n radius: number\n): ImgType => {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')!\n const { width, height } = img\n // 设置图片宽高\n canvas.width = width\n canvas.height = height\n ctx.drawImage(img, 0, 0, width, height)\n const ImageData = ctx.getImageData(0, 0, width, height)\n const { data } = ImageData\n const matrix = getMatrix(radius)\n const r = Math.ceil(radius)\n const w = width * 4\n const cols = r * 2 + 1\n const len = data.length, matrixLen = matrix.length\n for (let i = 0; i < len; i += 4) {\n // 处理\n }\n console.log(ImageData)\n ctx.putImageData(ImageData, 0, 0)\n return canvas\n}\n\nexport const getBase64Image = () => {\n\n}\n"],"names":["Array","prototype","includes","Object","defineProperty","value","valueToFind","fromIndex","this","TypeError","o","len","length","x","y","n","k","Math","max","abs","isNaN","String","search","start","indexOf","find","predicate","thisArg","arguments","kValue","call","isExpectType","param","_i","types","some","type","toString","slice","toLowerCase","has","data","key","hasOwnProperty","removeEnter","str","filter","s","join","hasBackground","color","toLocaleLowerCase","trim","test","alpha","exec","num","NaN","Number","computePadding","block","getLength","padding","split","map","paddingTop","paddingBottom","paddingLeft","paddingRight","res","computeRange","rangeArr","ascendingArr","sum","reduce","prev","curr","push","random","findIndex","splitText","ctx","text","getWidth","lineClamp","Infinity","lines","EndWidth","measureText","width","i","currWidth","maxWidth","subs","Dep","sub","forEach","update","hasProto","def","obj","val","enumerable","writable","configurable","oldArrayProto","newArrayProto","create","method","args","apply","luckyOb","walk","dep","notify","isArray","getOwnPropertyNames","Observer","keys","defineReactive","observe","property","getOwnPropertyDescriptor","getter","get","setter","set","childOb","target","addSub","newVal","uid","$lucky","expr","cb","options","id","deep","path","segments","segment","parsePath","Watcher","dfs","traverse","oldVal","config","el","nodeType","divElement","flag","document","querySelector","canvasElement","createElement","appendChild","getContext","setAttribute","name","addEventListener","e","_this","handleClick","initWindowFunction","console","error","window","fn","wait","timeId","setTimeout","clearTimeout","throttle","resize","MutationObserver","documentElement","attributes","Lucky","beforeResize","setHTMLFontSize","setDpr","resetWidthAndHeight","zoomCanvas","boxWidth","boxHeight","htmlFontSize","getComputedStyle","fontSize","_a","height","clearRect","dpr","devicePixelRatio","offsetWidth","offsetHeight","style","overflow","_b","transform","scale","rAF","requestAnimationFrame","callback","setInterval","clearInterval","timeout_1","src","info","resolveName","Promise","resolve","reject","imgObj_1","Image","onload","onerror","imgObj","drawImg","rectInfo","_c","miniProgramOffCtx","isWeb","temp","getImageData","putImageData","index","drawImage","err","imgInfo","maxHeight","trueWidth","trueHeight","denominator","replace","unit","handleCssUnit","px","rem","vw","innerWidth","otherHandleCssUnit","maxLength","changeUnits","_offscreenCanvas","_ctx","handler","watchOpt","watcher","immediate","getAngle","deg","PI","fanShapedByArc","minRadius","maxRadius","end","gutter","beginPath","r","maxGutter","maxStart","maxEnd","arc","lineTo","sin","cos","toFixed","closePath","roundRectByArc","w","h","min","moveTo","quad","t","b","c","d","_super","Map","initData","initWatch","initComputed","beforeCreate","init","__extends","LuckyWheel","Radius","translate","draw","afterResize","prizeRadius","prizeDeg","prizeAng","rotateDeg","maxBtnRadius","startTime","endTime","stopDeg","endDeg","FPS","prizeFlag","step","initLucky","$set","blocks","prizes","buttons","defaultConfig","defaultStyle","$computed","offsetDegree","speed","speedFunction","accelerationTime","decelerationTime","stopRange","fontColor","fontStyle","fontWeight","background","wordWrap","lengthLimit","$watch","newData","initImageCache","beforeInit","afterInit","willUpdateImgs","imgs","prize","btn","imgName","willUpdate","allPromise","cellIndex","imgIndex","loadAndCacheImg","all","then","isPointInPath","offsetX","offsetY","startCallback","cellName","cell","loadImg","currImg","formatter","ImageCache","catch","radius","blockIndex","fillStyle","fill","blockImg","computedWidthAndHeight","getOffsetX","left","top","xAxis","yAxis","save","rotate","restore","_defaultConfig","_defaultStyle","beforeDraw","drawBlock","shortSide","getFontX","font","line","getFontY","lineIndex","lineHeight","prizeIndex","currMiddleDeg","prizeHeight","prizeImg","fonts","tan","fillText","btnIndex","pointer","btnImg","afterDraw","Date","now","prevSpeed","prevDeg","currSpeed","afterStart","run","item","range","carveOnGunwaleOfAMovingBoat","startInterval","endInterval","stop","bind","endCallback","LuckyGrid","cellWidth","cellHeight","currIndex","stopIndex","endIndex","demo","timer","rows","cols","button","activeStyle","borderRadius","shadow","btnImgs","__spreadArray","getGeometricProperty","col","row","rect","request","defaultImg","activeImg","_activeStyle","cells","prizeArea","handleBackground","isActive","shadowColor","shadowOffsetX","shadowOffsetY","shadowBlur","cellImg","renderImg","size","maxWidth_1","context","shift","direction","getLenOfTanDeg","gradient","createLinearGradient","addColorStop","getLinearGradient","prevIndex","SlotMachine","cellAndSpacing","widthAndSpacing","heightAndSpacing","scroll","stopScroll","endScroll","slots","mode","rowSpacing","colSpacing","drawOffscreenCanvas","drawBlocks","prizesLen","displacementWidthOrHeight","defaultOrder","v","maxOffWidth","maxOffHeight","slot","slotIndex","order","currLen","_d","getOffscreenCanvas","cellX","cellY","lengthOfCopy","newPrizes","arr","getSortedArrayByIndex","prizesX","prizesY","displacement","_x","_y","spacing","_w","_h","drawLen","drawX","drawY","_p","sx","sy","sw","sh","dx","dy","dw","dh","orderIndex","prevScroll","flag_1","currFlag","a","slotsLen","img","canvas","clip","opacity","imageData"],"mappings":"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"} \ No newline at end of file diff --git a/components/lucky-canvas/dist/index.esm.js b/components/lucky-canvas/dist/index.esm.js new file mode 100644 index 0000000..81d43d3 --- /dev/null +++ b/components/lucky-canvas/dist/index.esm.js @@ -0,0 +1,16 @@ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +var t=function(e,i){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i])},t(e,i)};function e(e,i){if("function"!=typeof i&&null!==i)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");function n(){this.constructor=e}t(e,i),e.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}var i=function(){return i=Object.assign||function(t){for(var e,i=1,n=arguments.length;i0&&r[r.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!r||o[1]>r[0]&&o[1]>>0;if(0===n)return!1;var r,o,a=0|e,s=Math.max(a>=0?a:n-Math.abs(a),0);for(;sthis.length)&&-1!==this.indexOf(t,e)}),Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null==this)throw new TypeError('"this" is null or not defined');var e=Object(this),i=e.length>>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var n=arguments[1],r=0;r0){var n=t+i;return e.push(n),n}return e.push(NaN),t}),0),n=Math.random()*i;return e.findIndex((function(t){return n<=t}))},f=function(t,e,i,n){void 0===n&&(n=1/0),n<=0&&(n=1/0);for(var r="",o=[],a=t.measureText("...").width,s=0;sc&&(o.push(r.slice(0,-1)),r=e[s]),n===o.length)return o[o.length-1]+="...",o}return r&&o.push(r),o.length||o.push(e),o},d=function(){function t(){this.subs=[]}return t.prototype.addSub=function(t){this.subs.includes(t)||this.subs.push(t)},t.prototype.notify=function(){this.subs.forEach((function(t){t.update()}))},t}(),p="__proto__"in{};function g(t,e,i,n){Object.defineProperty(t,e,{value:i,enumerable:!!n,writable:!0,configurable:!0})}var v=Array.prototype,m=Object.create(v);["push","pop","shift","unshift","sort","splice","reverse"].forEach((function(t){m[t]=function(){for(var e=[],i=0;i '"+e.src+"' 不能为空或不合法"),"WEB"!==n.config.flag)return e[i]=r,void(e.$reject=o);var a=new Image;a.crossorigin="anonymous",a.onload=function(){return r(a)},a.onerror=function(){return o("=> '"+e.src+"' 图片加载失败")},a.src=t}))},t.prototype.drawImage=function(t,e){for(var i,n,r,a=[],s=2;sh/2&&(s=h/2),t.beginPath(),t.moveTo(n+s,r),t.lineTo(n+s,r),t.lineTo(n+o-s,r),t.arc(n+o-s,r+s,s,-c/2,0),t.lineTo(n+o,r+a-s),t.arc(n+o-s,r+a-s,s,0,c/2),t.lineTo(n+s,r+a),t.arc(n+s,r+a-s,s,c/2,c),t.lineTo(n,r+s),t.arc(n+s,r+s,s,c,-c/2),t.closePath()},A=function(t,e,i,n){return t>=n&&(t=n),i*(t/=n)*t+e},L=function(t,e,i,n){return t>=n&&(t=n),-i*(t/=n)*(t-2)+e},T=function(t){function o(e,i){var n,r=t.call(this,e,{width:i.width,height:i.height})||this;return r.blocks=[],r.prizes=[],r.buttons=[],r.defaultConfig={},r.defaultStyle={},r._defaultConfig={},r._defaultStyle={},r.Radius=0,r.prizeRadius=0,r.prizeDeg=0,r.prizeAng=0,r.rotateDeg=0,r.maxBtnRadius=0,r.startTime=0,r.endTime=0,r.stopDeg=0,r.endDeg=0,r.FPS=16.6,r.step=0,r.ImageCache=new Map,r.initData(i),r.initWatch(),r.initComputed(),null===(n=e.beforeCreate)||void 0===n||n.call(r),r.init(),r}return e(o,t),o.prototype.resize=function(){var e,i;t.prototype.resize.call(this),this.Radius=Math.min(this.boxWidth,this.boxHeight)/2,this.ctx.translate(this.Radius,this.Radius),this.draw(),null===(i=(e=this.config).afterResize)||void 0===i||i.call(e)},o.prototype.initLucky=function(){this.Radius=0,this.prizeRadius=0,this.prizeDeg=0,this.prizeAng=0,this.rotateDeg=0,this.maxBtnRadius=0,this.startTime=0,this.endTime=0,this.stopDeg=0,this.endDeg=0,this.FPS=16.6,this.prizeFlag=-1,this.step=0,t.prototype.initLucky.call(this)},o.prototype.initData=function(t){this.$set(this,"width",t.width),this.$set(this,"height",t.height),this.$set(this,"blocks",t.blocks||[]),this.$set(this,"prizes",t.prizes||[]),this.$set(this,"buttons",t.buttons||[]),this.$set(this,"defaultConfig",t.defaultConfig||{}),this.$set(this,"defaultStyle",t.defaultStyle||{}),this.$set(this,"startCallback",t.start),this.$set(this,"endCallback",t.end)},o.prototype.initComputed=function(){var t=this;this.$computed(this,"_defaultConfig",(function(){return i({gutter:"0px",offsetDegree:0,speed:20,speedFunction:"quad",accelerationTime:2500,decelerationTime:2500,stopRange:0},t.defaultConfig)})),this.$computed(this,"_defaultStyle",(function(){return i({fontSize:"18px",fontColor:"#000",fontStyle:"sans-serif",fontWeight:"400",background:"rgba(0,0,0,0)",wordWrap:!0,lengthLimit:"90%"},t.defaultStyle)}))},o.prototype.initWatch=function(){var t=this;this.$watch("width",(function(e){t.data.width=e,t.resize()})),this.$watch("height",(function(e){t.data.height=e,t.resize()})),this.$watch("blocks",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("prizes",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("buttons",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("defaultConfig",(function(){return t.draw()}),{deep:!0}),this.$watch("defaultStyle",(function(){return t.draw()}),{deep:!0}),this.$watch("startCallback",(function(){return t.init()})),this.$watch("endCallback",(function(){return t.init()}))},o.prototype.init=function(){var t,e;return n(this,void 0,void 0,(function(){var i;return r(this,(function(n){switch(n.label){case 0:return this.initLucky(),i=this.config,null===(t=i.beforeInit)||void 0===t||t.call(this),this.draw(),this.draw(),[4,this.initImageCache()];case 1:return n.sent(),null===(e=i.afterInit)||void 0===e||e.call(this),[2]}}))}))},o.prototype.initImageCache=function(){var t=this;return new Promise((function(e){var i={blocks:t.blocks.map((function(t){return t.imgs})),prizes:t.prizes.map((function(t){return t.imgs})),buttons:t.buttons.map((function(t){return t.imgs}))};Object.keys(i).forEach((function(n){var r=i[n],o=[];r&&r.forEach((function(e,i){e&&e.forEach((function(e,r){o.push(t.loadAndCacheImg(n,i,r))}))})),Promise.all(o).then((function(){t.draw(),e()}))}))}))},o.prototype.handleClick=function(t){var e,i=this.ctx;i.beginPath(),i.arc(0,0,this.maxBtnRadius,0,2*Math.PI,!1),i.isPointInPath(t.offsetX,t.offsetY)&&0===this.step&&(null===(e=this.startCallback)||void 0===e||e.call(this,t))},o.prototype.loadAndCacheImg=function(t,e,i){return n(this,void 0,void 0,(function(){var o=this;return r(this,(function(a){return[2,new Promise((function(a,s){var h=o[t][e];if(h&&h.imgs){var c=h.imgs[i];c&&o.loadImg(c.src,c).then((function(t){return n(o,void 0,void 0,(function(){return r(this,(function(e){switch(e.label){case 0:return"function"!=typeof c.formatter?[3,2]:[4,Promise.resolve(c.formatter.call(this,t))];case 1:t=e.sent(),e.label=2;case 2:return this.ImageCache.set(c.src,t),a(),[2]}}))}))})).catch((function(n){console.error(t+"["+e+"].imgs["+i+"] "+n),s()}))}}))]}))}))},o.prototype.drawBlock=function(t,e,i){var n=this,r=this.ctx;c(e.background)&&(r.beginPath(),r.fillStyle=e.background,r.arc(0,0,t,0,2*Math.PI,!1),r.fill()),e.imgs&&e.imgs.forEach((function(e,i){var o=n.ImageCache.get(e.src);if(o){var a=n.computedWidthAndHeight(o,e,2*t,2*t),s=a[0],h=a[1],c=[n.getOffsetX(s)+n.getLength(e.left,2*t),n.getLength(e.top,2*t)-t],l=c[0],u=c[1];r.save(),e.rotate&&r.rotate(x(n.rotateDeg)),n.drawImage(r,o,l,u,s,h),r.restore()}}))},o.prototype.draw=function(){var t,e,i=this,n=this,r=n.config,o=n.ctx,a=n._defaultConfig,l=n._defaultStyle;null===(t=r.beforeDraw)||void 0===t||t.call(this,o),o.clearRect(-this.Radius,-this.Radius,2*this.Radius,2*this.Radius),this.prizeRadius=this.blocks.reduce((function(t,e,n){return i.drawBlock(t,e,n),t-i.getLength(e.padding&&e.padding.split(" ")[0])}),this.Radius),this.prizeDeg=360/this.prizes.length,this.prizeAng=x(this.prizeDeg);var u=this.prizeRadius*Math.sin(this.prizeAng/2)*2,d=x(this.rotateDeg-90+this.prizeDeg/2+a.offsetDegree),p=function(t,e){return i.getOffsetX(o.measureText(e).width)+i.getLength(t.left,u)},g=function(t,e,n){var r=t.lineHeight||l.lineHeight||t.fontSize||l.fontSize;return i.getLength(t.top,e)+(n+1)*i.getLength(r)};o.save(),this.prizes.forEach((function(t,e){var n=d+e*i.prizeAng,r=i.prizeRadius-i.maxBtnRadius,v=t.background||l.background;c(v)&&(o.fillStyle=v,k(o,i.maxBtnRadius,i.prizeRadius,n-i.prizeAng/2,n+i.prizeAng/2,i.getLength(a.gutter)),o.fill());var m=Math.cos(n)*i.prizeRadius,w=Math.sin(n)*i.prizeRadius;o.translate(m,w),o.rotate(n+x(90)),t.imgs&&t.imgs.forEach((function(t,e){var n=i.ImageCache.get(t.src);if(n){var a=i.computedWidthAndHeight(n,t,i.prizeAng*i.prizeRadius,r),s=a[0],h=a[1],c=[i.getOffsetX(s)+i.getLength(t.left,u),i.getLength(t.top,r)],l=c[0],f=c[1];i.drawImage(o,n,l,f,s,h)}})),t.fonts&&t.fonts.forEach((function(t){var e=t.fontColor||l.fontColor,n=t.fontWeight||l.fontWeight,c=i.getLength(t.fontSize||l.fontSize),u=t.fontStyle||l.fontStyle,d=s(t,"wordWrap")?t.wordWrap:l.wordWrap,v=t.lengthLimit||l.lengthLimit,m=t.lineClamp||l.lineClamp;o.fillStyle=e,o.font=n+" "+(c>>0)+"px "+u;var w=String(t.text);(d?f(o,h(w),(function(e){var n=2*((i.prizeRadius-g(t,r,e.length))*Math.tan(i.prizeAng/2))-i.getLength(a.gutter);return i.getLength(v,n)}),m):w.split("\n")).filter((function(t){return!!t})).forEach((function(e,i){o.fillText(e,p(t,e),g(t,r,i))}))})),o.rotate(x(360)-n-x(90)),o.translate(-m,-w)})),o.restore(),this.buttons.forEach((function(t,e){var n=i.getLength(t.radius,i.prizeRadius);i.maxBtnRadius=Math.max(i.maxBtnRadius,n),c(t.background)&&(o.beginPath(),o.fillStyle=t.background,o.arc(0,0,n,0,2*Math.PI,!1),o.fill()),t.pointer&&c(t.background)&&(o.beginPath(),o.fillStyle=t.background,o.moveTo(-n,0),o.lineTo(n,0),o.lineTo(0,2*-n),o.closePath(),o.fill()),t.imgs&&t.imgs.forEach((function(t,e){var r=i.ImageCache.get(t.src);if(r){var a=i.computedWidthAndHeight(r,t,2*n,2*n),s=a[0],h=a[1],c=[i.getOffsetX(s)+i.getLength(t.left,n),i.getLength(t.top,n)],l=c[0],u=c[1];i.drawImage(o,r,l,u,s,h)}})),t.fonts&&t.fonts.forEach((function(t){var e=t.fontColor||l.fontColor,r=t.fontWeight||l.fontWeight,a=i.getLength(t.fontSize||l.fontSize),s=t.fontStyle||l.fontStyle;o.fillStyle=e,o.font=r+" "+(a>>0)+"px "+s,String(t.text).split("\n").forEach((function(e,i){o.fillText(e,p(t,e),g(t,n,i))}))}))})),null===(e=r.afterDraw)||void 0===e||e.call(this,o)},o.prototype.carveOnGunwaleOfAMovingBoat=function(){var t=this,e=t._defaultConfig,i=t.prizeFlag,n=t.prizeDeg,r=t.rotateDeg;this.endTime=Date.now();for(var o=this.stopDeg=r,a=e.speed,s=(Math.random()*n-n/2)*this.getLength(e.stopRange),h=0,c=0,l=0;++h;){var u=360*h-i*n-r-e.offsetDegree+s-n/2,f=L(this.FPS,o,u,e.decelerationTime)-o;if(f>a){this.endDeg=a-c>f-a?u:l;break}l=u,c=f}},o.prototype.play=function(){var t,e;0===this.step&&(this.startTime=Date.now(),this.prizeFlag=void 0,this.step=1,null===(e=(t=this.config).afterStart)||void 0===e||e.call(t),this.run())},o.prototype.stop=function(t){if(0!==this.step&&3!==this.step){if(!t&&0!==t){var e=this.prizes.map((function(t){return t.range}));t=u(e)}t<0?(this.step=0,this.prizeFlag=-1):(this.step=2,this.prizeFlag=t%this.prizes.length)}},o.prototype.run=function(t){var e;void 0===t&&(t=0);var i=this,n=i.rAF,r=i.step,o=i.prizeFlag,a=i._defaultConfig,s=a.accelerationTime,h=a.decelerationTime,c=a.speed;if(0!==r){if(-1!==o){3!==r||this.endDeg||this.carveOnGunwaleOfAMovingBoat();var l=Date.now()-this.startTime,u=Date.now()-this.endTime,f=this.rotateDeg;if(1===r||l=0&&(this.step=3,this.stopDeg=0,this.endDeg=0)):3===r?(f=L(u,this.stopDeg,this.endDeg,h),u>=h&&(this.step=0)):this.stop(-1);this.rotateDeg=f,this.draw(),n(this.run.bind(this,t+1))}}else null===(e=this.endCallback)||void 0===e||e.call(this,this.prizes.find((function(t,e){return e===o}))||{})},o.prototype.conversionAxis=function(t,e){var i=this.config;return[t/i.dpr-this.Radius,e/i.dpr-this.Radius]},o}(z),W=function(t){function a(e,i){var n,r=t.call(this,e,{width:i.width,height:i.height})||this;return r.rows=3,r.cols=3,r.blocks=[],r.prizes=[],r.buttons=[],r.defaultConfig={},r.defaultStyle={},r.activeStyle={},r._defaultConfig={},r._defaultStyle={},r._activeStyle={},r.cellWidth=0,r.cellHeight=0,r.startTime=0,r.endTime=0,r.currIndex=0,r.stopIndex=0,r.endIndex=0,r.demo=!1,r.timer=0,r.FPS=16.6,r.step=0,r.prizeFlag=-1,r.cells=[],r.ImageCache=new Map,r.initData(i),r.initWatch(),r.initComputed(),null===(n=e.beforeCreate)||void 0===n||n.call(r),r.init(),r}return e(a,t),a.prototype.resize=function(){var e,i;t.prototype.resize.call(this),this.draw(),null===(i=(e=this.config).afterResize)||void 0===i||i.call(e)},a.prototype.initLucky=function(){this.cellWidth=0,this.cellHeight=0,this.startTime=0,this.endTime=0,this.currIndex=0,this.stopIndex=0,this.endIndex=0,this.demo=!1,this.timer=0,this.FPS=16.6,this.prizeFlag=-1,this.step=0,t.prototype.initLucky.call(this)},a.prototype.initData=function(t){this.$set(this,"width",t.width),this.$set(this,"height",t.height),this.$set(this,"rows",Number(t.rows)||3),this.$set(this,"cols",Number(t.cols)||3),this.$set(this,"blocks",t.blocks||[]),this.$set(this,"prizes",t.prizes||[]),this.$set(this,"buttons",t.buttons||[]),this.$set(this,"button",t.button),this.$set(this,"defaultConfig",t.defaultConfig||{}),this.$set(this,"defaultStyle",t.defaultStyle||{}),this.$set(this,"activeStyle",t.activeStyle||{}),this.$set(this,"startCallback",t.start),this.$set(this,"endCallback",t.end)},a.prototype.initComputed=function(){var t=this;this.$computed(this,"_defaultConfig",(function(){var e=i({gutter:5,speed:20,accelerationTime:2500,decelerationTime:2500},t.defaultConfig);return e.gutter=t.getLength(e.gutter),e.speed=e.speed/40,e})),this.$computed(this,"_defaultStyle",(function(){return i({borderRadius:20,fontColor:"#000",fontSize:"18px",fontStyle:"sans-serif",fontWeight:"400",background:"rgba(0,0,0,0)",shadow:"",wordWrap:!0,lengthLimit:"90%"},t.defaultStyle)})),this.$computed(this,"_activeStyle",(function(){return i({background:"#ffce98",shadow:""},t.activeStyle)}))},a.prototype.initWatch=function(){var t=this;this.$watch("width",(function(e){t.data.width=e,t.resize()})),this.$watch("height",(function(e){t.data.height=e,t.resize()})),this.$watch("blocks",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("prizes",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("buttons",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("rows",(function(){return t.init()})),this.$watch("cols",(function(){return t.init()})),this.$watch("defaultConfig",(function(){return t.draw()}),{deep:!0}),this.$watch("defaultStyle",(function(){return t.draw()}),{deep:!0}),this.$watch("activeStyle",(function(){return t.draw()}),{deep:!0}),this.$watch("startCallback",(function(){return t.init()})),this.$watch("endCallback",(function(){return t.init()}))},a.prototype.init=function(){var t,e;return n(this,void 0,void 0,(function(){var i;return r(this,(function(n){switch(n.label){case 0:return this.initLucky(),i=this.config,null===(t=i.beforeInit)||void 0===t||t.call(this),this.draw(),[4,this.initImageCache()];case 1:return n.sent(),null===(e=i.afterInit)||void 0===e||e.call(this),[2]}}))}))},a.prototype.initImageCache=function(){var t=this;return new Promise((function(e){var i=t.buttons.map((function(t){return t.imgs}));t.button&&i.push(t.button.imgs);var n={blocks:t.blocks.map((function(t){return t.imgs})),prizes:t.prizes.map((function(t){return t.imgs})),buttons:i};Object.keys(n).forEach((function(i){var r=n[i],o=[];r&&r.forEach((function(e,n){e&&e.forEach((function(e,r){o.push(t.loadAndCacheImg(i,n,r))}))})),Promise.all(o).then((function(){t.draw(),e()}))}))}))},a.prototype.handleClick=function(t){var e=this,i=this.ctx;o(o([],this.buttons),[this.button]).forEach((function(n){var r;if(n){var o=e.getGeometricProperty([n.x,n.y,n.col||1,n.row||1]),a=o[0],s=o[1],h=o[2],c=o[3];i.beginPath(),i.rect(a,s,h,c),i.isPointInPath(t.offsetX,t.offsetY)&&0===e.step&&("function"==typeof n.callback&&n.callback.call(e,n),null===(r=e.startCallback)||void 0===r||r.call(e,t,n))}}))},a.prototype.loadAndCacheImg=function(t,e,i){return n(this,void 0,void 0,(function(){var o=this;return r(this,(function(a){return[2,new Promise((function(a,s){var h=o[t][e];if("buttons"===t&&!o.buttons.length&&o.button&&(h=o.button),h&&h.imgs){var c=h.imgs[i];if(c){var l=[o.loadImg(c.src,c),c.activeSrc&&o.loadImg(c.activeSrc,c,"$activeResolve")];Promise.all(l).then((function(t){var e=t[0],i=t[1];return n(o,void 0,void 0,(function(){var t;return r(this,(function(n){switch(n.label){case 0:return"function"!=typeof(t=c.formatter)?[3,3]:[4,Promise.resolve(t.call(this,e))];case 1:return e=n.sent(),i?[4,Promise.resolve(t.call(this,i))]:[3,3];case 2:i=n.sent(),n.label=3;case 3:return this.ImageCache.set(c.src,e),i&&this.ImageCache.set(c.activeSrc,i),a(),[2]}}))}))})).catch((function(n){console.error(t+"["+e+"].imgs["+i+"] "+n),s()}))}}}))]}))}))},a.prototype.draw=function(){var t,e,i=this,n=this,r=n.config,a=n.ctx,u=n._defaultConfig,d=n._defaultStyle,p=n._activeStyle;null===(t=r.beforeDraw)||void 0===t||t.call(this,a),a.clearRect(0,0,this.boxWidth,this.boxHeight),this.cells=o(o([],this.prizes),this.buttons),this.button&&this.cells.push(this.button),this.cells.forEach((function(t){t.col=t.col||1,t.row=t.row||1})),this.prizeArea=this.blocks.reduce((function(t,e,n){var r=t.x,o=t.y,s=t.w,h=t.h,u=l(e,i.getLength.bind(i)),f=u[0],d=u[1],p=u[2],g=u[3],v=e.borderRadius?i.getLength(e.borderRadius):0,m=e.background;return c(m)&&(a.fillStyle=i.handleBackground(r,o,s,h,m),I(a,r,o,s,h,v),a.fill()),e.imgs&&e.imgs.forEach((function(t,e){var n=i.ImageCache.get(t.src);if(n){var c=i.computedWidthAndHeight(n,t,s,h),l=c[0],u=c[1],f=[i.getOffsetX(l,s)+i.getLength(t.left,s),i.getLength(t.top,h)],d=f[0],p=f[1];i.drawImage(a,n,r+d,o+p,l,u)}})),{x:r+p,y:o+f,w:s-p-g,h:h-f-d}}),{x:0,y:0,w:this.boxWidth,h:this.boxHeight}),this.cellWidth=(this.prizeArea.w-u.gutter*(this.cols-1))/this.cols,this.cellHeight=(this.prizeArea.h-u.gutter*(this.rows-1))/this.rows,this.cells.forEach((function(t,e){var n=i.getGeometricProperty([t.x,t.y,t.col,t.row]),o=n[0],l=n[1],u=n[2],g=n[3],v=!1;(void 0===i.prizeFlag||i.prizeFlag>-1)&&(v=e===i.currIndex%i.prizes.length>>0);var m=v?p.background:t.background||d.background;if(c(m)){var w=(v?p.shadow:t.shadow||d.shadow).replace(/px/g,"").split(",")[0].split(" ").map((function(t,e){return e<3?Number(t):t}));4===w.length&&(a.shadowColor=w[3],a.shadowOffsetX=w[0]*r.dpr,a.shadowOffsetY=w[1]*r.dpr,a.shadowBlur=w[2],w[0]>0?u-=w[0]:(u+=w[0],o-=w[0]),w[1]>0?g-=w[1]:(g+=w[1],l-=w[1])),a.fillStyle=i.handleBackground(o,l,u,g,m);var y=i.getLength(t.borderRadius?t.borderRadius:d.borderRadius);I(a,o,l,u,g,y),a.fill(),a.shadowColor="rgba(0, 0, 0, 0)",a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0}e>=i.prizes.length&&(e-=i.prizes.length),t.imgs&&t.imgs.forEach((function(t,e){var n=i.ImageCache.get(t.src),r=i.ImageCache.get(t.activeSrc);if(n){var s=v&&r||n;if(s){var h=i.computedWidthAndHeight(s,t,u,g),c=h[0],f=h[1],d=[o+i.getOffsetX(c,u)+i.getLength(t.left,u),l+i.getLength(t.top,g)],p=d[0],m=d[1];i.drawImage(a,s,p,m,c,f)}}})),t.fonts&&t.fonts.forEach((function(t){var e=v&&p.fontStyle?p.fontStyle:t.fontStyle||d.fontStyle,n=v&&p.fontWeight?p.fontWeight:t.fontWeight||d.fontWeight,r=v&&p.fontSize?i.getLength(p.fontSize):i.getLength(t.fontSize||d.fontSize),c=v&&p.lineHeight?p.lineHeight:t.lineHeight||d.lineHeight||t.fontSize||d.fontSize,m=s(t,"wordWrap")?t.wordWrap:d.wordWrap,w=t.lengthLimit||d.lengthLimit,y=t.lineClamp||d.lineClamp;a.font=n+" "+(r>>0)+"px "+e,a.fillStyle=v&&p.fontColor?p.fontColor:t.fontColor||d.fontColor;var b=[],S=String(t.text);if(m){var C=i.getLength(w,u);b=f(a,h(S),(function(){return C}),y)}else b=S.split("\n");b.forEach((function(e,n){a.fillText(e,o+i.getOffsetX(a.measureText(e).width,u)+i.getLength(t.left,u),l+i.getLength(t.top,g)+(n+1)*i.getLength(c))}))}))})),null===(e=r.afterDraw)||void 0===e||e.call(this,a)},a.prototype.handleBackground=function(t,e,i,n,r){var o=this.ctx;return r.includes("linear-gradient")&&(r=function(t,e,i,n,r,o){var a=/linear-gradient\((.+)\)/.exec(o)[1].split(",").map((function(t){return t.trim()})),s=a.shift(),h=[0,0,0,0];if(s.includes("deg")){var c=function(t){return Math.tan(t/180*Math.PI)};(s=s.slice(0,-3)%360)>=0&&s<45?h=[e,i+r,e+n,i+r-n*c(s-0)]:s>=45&&s<90?h=[e,i+r,e+n-r*c(s-45),i]:s>=90&&s<135?h=[e+n,i+r,e+n-r*c(s-90),i]:s>=135&&s<180?h=[e+n,i+r,e,i+n*c(s-135)]:s>=180&&s<225?h=[e+n,i,e,i+n*c(s-180)]:s>=225&&s<270?h=[e+n,i,e+r*c(s-225),i+r]:s>=270&&s<315?h=[e,i,e+r*c(s-270),i+r]:s>=315&&s<360&&(h=[e,i,e+n,i+r-n*c(s-315)])}else s.includes("top")?h=[e,i+r,e,i]:s.includes("bottom")?h=[e,i,e,i+r]:s.includes("left")?h=[e+n,i,e,i]:s.includes("right")&&(h=[e,i,e+n,i]);var l=t.createLinearGradient.apply(t,h.map((function(t){return t>>0})));return a.reduce((function(t,e,i){var n=e.split(" ");return 1===n.length?t.addColorStop(i,n[0]):2===n.length&&t.addColorStop.apply(t,n),t}),l)}(o,t,e,i,n,r)),r},a.prototype.carveOnGunwaleOfAMovingBoat=function(){var t=this,e=t._defaultConfig,i=t.prizeFlag,n=t.currIndex;this.endTime=Date.now();for(var r=this.stopIndex=n,o=e.speed,a=0,s=0,h=0;++a;){var c=this.prizes.length*a+i-r,l=L(this.FPS,r,c,e.decelerationTime)-r;if(l>o){this.endIndex=o-s>l-o?c:h;break}h=c,s=l}},a.prototype.play=function(){var t,e;0===this.step&&(this.startTime=Date.now(),this.prizeFlag=void 0,this.step=1,null===(e=(t=this.config).afterStart)||void 0===e||e.call(t),this.run())},a.prototype.stop=function(t){if(0!==this.step&&3!==this.step){if(!t&&0!==t){var e=this.prizes.map((function(t){return t.range}));t=u(e)}t<0?(this.step=0,this.prizeFlag=-1):(this.step=2,this.prizeFlag=t%this.prizes.length)}},a.prototype.run=function(t){var e;void 0===t&&(t=0);var i=this,n=i.rAF,r=i.step,o=i.prizes,a=i.prizeFlag,s=i._defaultConfig,h=s.accelerationTime,c=s.decelerationTime,l=s.speed;if(0!==r){if(-1!==a){3!==r||this.endIndex||this.carveOnGunwaleOfAMovingBoat();var u=Date.now()-this.startTime,f=Date.now()-this.endTime,d=this.currIndex;if(1===r||u=0&&(this.step=3,this.stopIndex=0,this.endIndex=0)):3===r?(d=L(f,this.stopIndex,this.endIndex,c),f>=c&&(this.step=0)):this.stop(-1);this.currIndex=d,this.draw(),n(this.run.bind(this,t+1))}}else null===(e=this.endCallback)||void 0===e||e.call(this,this.prizes.find((function(t,e){return e===a}))||{})},a.prototype.getGeometricProperty=function(t){var e=t[0],i=t[1],n=t[2],r=void 0===n?1:n,o=t[3],a=void 0===o?1:o,s=this.cellWidth,h=this.cellHeight,c=this._defaultConfig.gutter,l=[this.prizeArea.x+(s+c)*e,this.prizeArea.y+(h+c)*i];return r&&a&&l.push(s*r+c*(r-1),h*a+c*(a-1)),l},a.prototype.conversionAxis=function(t,e){var i=this.config;return[t/i.dpr,e/i.dpr]},a}(z),_=function(t){function o(e,i){var n,r=t.call(this,e,{width:i.width,height:i.height})||this;return r.blocks=[],r.prizes=[],r.slots=[],r.defaultConfig={},r._defaultConfig={},r.defaultStyle={},r._defaultStyle={},r.endCallback=function(){},r.cellWidth=0,r.cellHeight=0,r.cellAndSpacing=0,r.widthAndSpacing=0,r.heightAndSpacing=0,r.FPS=16.6,r.scroll=[],r.stopScroll=[],r.endScroll=[],r.startTime=0,r.endTime=0,r.step=0,r.prizeFlag=void 0,r.ImageCache=new Map,r.initData(i),r.initWatch(),r.initComputed(),null===(n=e.beforeCreate)||void 0===n||n.call(r),r.init(),r}return e(o,t),o.prototype.resize=function(){var e,i;t.prototype.resize.call(this),this.draw(),null===(i=(e=this.config).afterResize)||void 0===i||i.call(e)},o.prototype.initLucky=function(){this.cellWidth=0,this.cellHeight=0,this.cellAndSpacing=0,this.widthAndSpacing=0,this.heightAndSpacing=0,this.FPS=16.6,this.scroll=[],this.stopScroll=[],this.endScroll=[],this.startTime=0,this.endTime=0,this.prizeFlag=void 0,this.step=0,t.prototype.initLucky.call(this)},o.prototype.initData=function(t){this.$set(this,"width",t.width),this.$set(this,"height",t.height),this.$set(this,"blocks",t.blocks||[]),this.$set(this,"prizes",t.prizes||[]),this.$set(this,"slots",t.slots||[]),this.$set(this,"defaultConfig",t.defaultConfig||{}),this.$set(this,"defaultStyle",t.defaultStyle||{}),this.$set(this,"endCallback",t.end)},o.prototype.initComputed=function(){var t=this;this.$computed(this,"_defaultConfig",(function(){var e=i({mode:"vertical",rowSpacing:0,colSpacing:5,speed:20,direction:1,accelerationTime:2500,decelerationTime:2500},t.defaultConfig);return e.rowSpacing=t.getLength(e.rowSpacing),e.colSpacing=t.getLength(e.colSpacing),e})),this.$computed(this,"_defaultStyle",(function(){return i({borderRadius:0,fontColor:"#000",fontSize:"18px",fontStyle:"sans-serif",fontWeight:"400",background:"rgba(0,0,0,0)",wordWrap:!0,lengthLimit:"90%"},t.defaultStyle)}))},o.prototype.initWatch=function(){var t=this;this.$watch("width",(function(e){t.data.width=e,t.resize()})),this.$watch("height",(function(e){t.data.height=e,t.resize()})),this.$watch("blocks",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("prizes",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("slots",(function(e){t.drawOffscreenCanvas(),t.draw()}),{deep:!0}),this.$watch("defaultConfig",(function(){return t.draw()}),{deep:!0}),this.$watch("defaultStyle",(function(){return t.draw()}),{deep:!0}),this.$watch("endCallback",(function(){return t.init()}))},o.prototype.init=function(){var t,e;return n(this,void 0,void 0,(function(){var i;return r(this,(function(n){switch(n.label){case 0:return this.initLucky(),i=this.config,null===(t=i.beforeInit)||void 0===t||t.call(this),this.drawOffscreenCanvas(),this.draw(),[4,this.initImageCache()];case 1:return n.sent(),null===(e=i.afterInit)||void 0===e||e.call(this),[2]}}))}))},o.prototype.initImageCache=function(){var t=this;return new Promise((function(e){var i={blocks:t.blocks.map((function(t){return t.imgs})),prizes:t.prizes.map((function(t){return t.imgs}))};Object.keys(i).forEach((function(n){var r=i[n],o=[];r&&r.forEach((function(e,i){e&&e.forEach((function(e,r){o.push(t.loadAndCacheImg(n,i,r))}))})),Promise.all(o).then((function(){t.drawOffscreenCanvas(),t.draw(),e()}))}))}))},o.prototype.loadAndCacheImg=function(t,e,i){return n(this,void 0,void 0,(function(){var o=this;return r(this,(function(a){return[2,new Promise((function(a,s){var h=o[t][e];if(h&&h.imgs){var c=h.imgs[i];c&&o.loadImg(c.src,c).then((function(t){return n(o,void 0,void 0,(function(){return r(this,(function(e){switch(e.label){case 0:return"function"!=typeof c.formatter?[3,2]:[4,Promise.resolve(c.formatter.call(this,t))];case 1:t=e.sent(),e.label=2;case 2:return this.ImageCache.set(c.src,t),a(),[2]}}))}))})).catch((function(n){console.error(t+"["+e+"].imgs["+i+"] "+n),s()}))}}))]}))}))},o.prototype.drawOffscreenCanvas=function(){var t=this,e=this._defaultConfig,i=this._defaultStyle,n=this.drawBlocks(),r=n.w,o=n.h,a=this.prizes.length,l=this.displacementWidthOrHeight(),u=l.cellWidth,d=l.cellHeight,p=l.widthAndSpacing,g=l.heightAndSpacing,v=new Array(a).fill(void 0).map((function(t,e){return e})),m=0,w=0;this.slots.forEach((function(e,i){void 0===t.scroll[i]&&(t.scroll[i]=0),e.order=e.order||v;var n=e.order.length;m=Math.max(m,r+p*n),w=Math.max(w,o+g*n)}));var y=this.getOffscreenCanvas(m,w),b=y._offscreenCanvas,S=y._ctx;this._offscreenCanvas=b,this.slots.forEach((function(n,r){var o=u*r,a=d*r,l=0,v=function(t,e){for(var i={},n=[],r=0;r>0)+"px "+n,S.fillStyle=e.fontColor||i.fontColor;var g=[],v=String(e.text);if(c){var m=t.getLength(l,u);g=f(S,h(v),(function(){return m}),p)}else g=v.split("\n");g.forEach((function(i,n){S.fillText(i,b+t.getOffsetX(S.measureText(i).width,u)+t.getLength(e.left,u),C+t.getLength(e.top,d)+(n+1)*t.getLength(a))}))}))}}));for(var m=t.displacement([o,0,u,l],[0,a,l,d]),y=m[0],C=m[1],z=m[2],x=m[3],k=l;kn&&(l%=n);var v=e.displacement([u*i,l,u,c],[l,f*i,h,f]),m=v[0],w=v[1],y=v[2],b=v[3],S=e.displacement([a+p*i,s,u,c],[a,s+g*i,h,f]),C=S[0],z=S[1],x=S[2],k=S[3];e.drawImage(r,e._offscreenCanvas,m,w,y,b,C,z,x,k)}))}},o.prototype.carveOnGunwaleOfAMovingBoat=function(){var t=this,e=this,i=e._defaultConfig,n=e.prizeFlag,r=e.cellAndSpacing;this.endTime=Date.now(),this.slots.forEach((function(e,o){var a=e.order;if(a.length)for(var s=e.speed||i.speed,h=e.direction||i.direction,c=a.findIndex((function(t){return t===n[o]})),l=r*a.length,u=t.stopScroll[o]=t.scroll[o],f=0;++f;){var d=r*c+l*f*h-u,p=L(t.FPS,u,d,i.decelerationTime)-u;if(Math.abs(p)>s){t.endScroll[o]=d;break}}}))},o.prototype.play=function(){var t,e;0===this.step&&(this.startTime=Date.now(),this.prizeFlag=void 0,this.step=1,null===(e=(t=this.config).afterStart)||void 0===e||e.call(t),this.run())},o.prototype.stop=function(t){var e;if(0!==this.step&&3!==this.step){if("number"==typeof t)this.prizeFlag=new Array(this.slots.length).fill(t);else{if(!a(t,"array"))return this.stop(-1),console.error("stop() 无法识别的参数类型 "+typeof t);if(t.length!==this.slots.length)return this.stop(-1),console.error("stop(["+t+"]) 参数长度的不正确");this.prizeFlag=t}(null===(e=this.prizeFlag)||void 0===e?void 0:e.includes(-1))?(this.prizeFlag=[],this.step=0):this.step=2}},o.prototype.run=function(t){var e,i,n=this;void 0===t&&(t=0);var r=this,o=r.rAF,a=r.step,s=r.prizeFlag,h=r._defaultConfig,c=r.cellAndSpacing,l=r.slots,u=h.accelerationTime,f=h.decelerationTime;if(0!==this.step||(null==s?void 0:s.length)!==l.length){if(void 0===s||s.length){3!==this.step||this.endScroll.length||this.carveOnGunwaleOfAMovingBoat();var d=Date.now()-this.startTime,p=Date.now()-this.endTime;l.forEach((function(e,i){var r=e.order;if(r&&r.length){var o=c*r.length,g=Math.abs(e.speed||h.speed),v=e.direction||h.direction,m=0,w=n.scroll[i];if(1===a||d=f&&(n.step=0)}n.scroll[i]=m}})),this.draw(),o(this.run.bind(this,t+1))}}else{for(var g=s[0],v=0;v>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x, y) {\n return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(valueToFind, elementK) is true, return true.\n if (sameValueZero(o[k], valueToFind)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n }\n });\n}\n\n// vivo x7 下网易云游戏 app 缺少 includes 方法\nif (!String.prototype.includes) {\n String.prototype.includes = function(search, start) {\n 'use strict';\n if (typeof start !== 'number') {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n } else {\n return this.indexOf(search, start) !== -1;\n }\n };\n}\n\n// vivo x7 下网易云游戏 app 缺少 find 方法\nif (!Array.prototype.find) {\n Object.defineProperty(Array.prototype, 'find', {\n value: function(predicate) {\n // 1. Let O be ? ToObject(this value).\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n var o = Object(this);\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n var thisArg = arguments[1];\n // 5. Let k be 0.\n var k = 0;\n // 6. Repeat, while k < len\n while (k < len) {\n // a. Let Pk be ! ToString(k).\n // b. Let kValue be ? Get(O, Pk).\n // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).\n // d. If testResult is true, return kValue.\n var kValue = o[k];\n if (predicate.call(thisArg, kValue, k, o)) {\n return kValue;\n }\n // e. Increase k by 1.\n k++;\n }\n // 7. Return undefined.\n return void 0;\n }\n });\n}\n","/**\n * 判断是否是期望的类型\n * @param { unknown } param 将要判断的变量\n * @param { ...string } types 期望的类型\n * @return { boolean } 返回期望是否正确\n */\nexport const isExpectType = (param: unknown, ...types: string[]): boolean => {\n return types.some(type => Object.prototype.toString.call(param).slice(8, -1).toLowerCase() === type)\n}\n\nexport const get = (data: object, strKeys: string) => {\n const keys = strKeys.split('.')\n for (let key of keys) {\n const res = data[key]\n if (!isExpectType(res, 'object', 'array')) return res\n data = res\n }\n return data\n}\n\nexport const has = (data: object, key: string | number): boolean => {\n return Object.prototype.hasOwnProperty.call(data, key)\n}\n\n/**\n * 移除\\n\n * @param { string } str 将要处理的字符串\n * @return { string } 返回新的字符串\n */\nexport const removeEnter = (str: string): string => {\n return [].filter.call(str, s => s !== '\\n').join('')\n}\n\n/**\n * 把任何数据类型转成数字\n * @param num \n */\nexport const getNumber = (num: unknown): number => {\n if (num === null) return 0\n if (typeof num === 'object') return NaN\n if (typeof num === 'number') return num\n if (typeof num === 'string') {\n if (num[num.length - 1] === '%') {\n return Number(num.slice(0, -1)) / 100\n }\n return Number(num)\n }\n return NaN\n}\n\n/**\n * 判断颜色是否有效 (透明色 === 无效)\n * @param color 颜色\n */\nexport const hasBackground = (color: string | undefined | null): boolean => {\n if (typeof color !== 'string') return false\n color = color.toLocaleLowerCase().trim()\n if (color === 'transparent') return false\n if (/^rgba/.test(color)) {\n const alpha = /([^\\s,]+)\\)$/.exec(color)\n if (getNumber(alpha) === 0) return false\n }\n return true\n}\n\n/**\n * 通过padding计算\n * @return { object } block 边框信息\n */\nexport const computePadding = (\n block: { padding?: string },\n getLength: Function\n): [number, number, number, number] => {\n let padding = block.padding?.split(' ').map(n => getLength(n)) || [0],\n paddingTop = 0,\n paddingBottom = 0,\n paddingLeft = 0,\n paddingRight = 0\n switch (padding.length) {\n case 1:\n paddingTop = paddingBottom = paddingLeft = paddingRight = padding[0]\n break\n case 2:\n paddingTop = paddingBottom = padding[0]\n paddingLeft = paddingRight = padding[1]\n break\n case 3:\n paddingTop = padding[0]\n paddingLeft = paddingRight = padding[1]\n paddingBottom = padding[2]\n break\n default:\n paddingTop = padding[0]\n paddingBottom = padding[1]\n paddingLeft = padding[2]\n paddingRight = padding[3]\n }\n // 检查是否单独传入值, 并且不是0\n const res = { paddingTop, paddingBottom, paddingLeft, paddingRight }\n for (let key in res) {\n // 是否含有这个属性, 并且是数字或字符串\n res[key] = has(block, key) && isExpectType(block[key], 'string', 'number')\n ? getLength(block[key])\n : res[key]\n }\n return [paddingTop, paddingBottom, paddingLeft, paddingRight]\n}\n\n/**\n * 节流函数\n * @param fn 将要处理的函数\n * @param wait 时间, 单位为毫秒\n * @returns 包装好的节流函数\n */\nexport const throttle = (fn: Function, wait = 300) => {\n let timeId = null as any\n return function (this: any, ...args: any[]) {\n if (timeId) return\n timeId = setTimeout(() => {\n fn.apply(this, args)\n clearTimeout(timeId)\n timeId = null\n }, wait)\n }\n}\n\n/**\n * 通过概率计算出一个奖品索引\n * @param { Array } rangeArr 概率\n * @returns { number } 中奖索引\n */\nexport const computeRange = (rangeArr: Array): number => {\n const ascendingArr: number[] = []\n // 额外增加 map 来优化 ts 的类型推断\n const sum = rangeArr.map(num => Number(num)).reduce((prev, curr) => {\n if (curr > 0) { // 大于0\n const res = prev + curr\n ascendingArr.push(res)\n return res\n } else { // 小于等于0或NaN\n ascendingArr.push(NaN)\n return prev\n }\n }, 0)\n const random = Math.random() * sum\n return ascendingArr.findIndex(num => random <= num)\n}\n\n/**\n * 根据宽度分割字符串, 来达到换行的效果\n * @param text \n * @param maxWidth \n * @returns \n */\nexport const splitText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n getWidth: (lines: string[]) => number,\n lineClamp: number = Infinity\n): string[] => {\n // 如果 lineClamp 设置不正确, 则忽略该属性\n if (lineClamp <= 0) lineClamp = Infinity\n let str = ''\n const lines = []\n const EndWidth = ctx.measureText('...').width\n for (let i = 0; i < text.length; i++) {\n str += text[i]\n let currWidth = ctx.measureText(str).width\n const maxWidth = getWidth(lines)\n // 如果正在计算最后一行, 则加上三个小点的宽度\n if (lineClamp === lines.length + 1) currWidth += EndWidth\n // 如果已经没有宽度了, 就没有必要再计算了\n if (maxWidth < 0) return lines\n // 如果当前一行的宽度不够了, 则处理下一行\n if (currWidth > maxWidth) {\n lines.push(str.slice(0, -1))\n str = text[i]\n }\n // 如果现在是最后一行, 则加上三个小点并跳出\n if (lineClamp === lines.length) {\n lines[lines.length - 1] += '...'\n return lines\n }\n }\n if (str) lines.push(str)\n if (!lines.length) lines.push(text)\n return lines\n}\n\n// 获取一个重新排序的数组\nexport const getSortedArrayByIndex = (arr: T[], order: number[]): T[] => {\n const map: { [key: number]: T } = {}, res = []\n for (let i = 0; i < arr.length; i++) {\n map[i] = arr[i]\n }\n for (let i = 0; i < order.length; i++) {\n const curr = map[order[i]]\n if (curr) (res[i] = curr)\n }\n return res\n}\n","import Watcher from './watcher'\n\nexport default class Dep {\n static target: Watcher | null\n private subs: Array\n\n /**\n * 订阅中心构造器\n */\n constructor () {\n this.subs = []\n }\n\n /**\n * 收集依赖\n * @param {*} sub \n */\n public addSub (sub: Watcher) {\n // 此处临时使用includes防重复添加\n if (!this.subs.includes(sub)) {\n this.subs.push(sub)\n }\n }\n\n /**\n * 派发更新\n */\n public notify () {\n this.subs.forEach(sub => {\n sub.update()\n })\n }\n}\n","\nimport { isExpectType } from '../utils'\n\nexport const hasProto = '__proto__' in {}\n\nexport function def (obj: object, key: string | number, val: any, enumerable?: boolean) {\n Object.defineProperty(obj, key, {\n value: val,\n enumerable: !!enumerable,\n writable: true,\n configurable: true\n })\n}\n\nexport function parsePath (path: string) {\n path += '.'\n let segments: string[] = [], segment = ''\n for (let i = 0; i < path.length; i++) {\n let curr = path[i]\n if (/\\[|\\./.test(curr)) {\n segments.push(segment)\n segment = ''\n } else if (/\\W/.test(curr)) {\n continue\n } else {\n segment += curr\n }\n }\n return function (data: object | any[]) {\n return segments.reduce((data, key) => {\n return data[key]\n }, data)\n }\n}\n\nexport function traverse (value: any) {\n // const seenObjects = new Set()\n const dfs = (data: any) => {\n if (!isExpectType(data, 'array', 'object')) return\n Object.keys(data).forEach(key => {\n const value = data[key]\n dfs(value)\n })\n }\n dfs(value)\n // seenObjects.clear()\n}","/**\n * 重写数组的原型方法\n */\nconst oldArrayProto = Array.prototype\nconst newArrayProto = Object.create(oldArrayProto)\nconst methods = ['push', 'pop', 'shift', 'unshift', 'sort', 'splice', 'reverse']\nmethods.forEach(method => {\n newArrayProto[method] = function (...args: any[]) {\n const res = oldArrayProto[method].apply(this, args)\n const luckyOb = this['__luckyOb__']\n if (['push', 'unshift', 'splice'].includes(method)) luckyOb.walk(this)\n luckyOb.dep.notify()\n return res\n }\n})\n\nexport { newArrayProto }\n","import Dep from './dep'\nimport { hasProto, def } from './utils'\nimport { newArrayProto } from './array'\n\nexport default class Observer {\n value: any\n dep: Dep\n\n /**\n * 观察者构造器\n * @param value \n */\n constructor (value: any) {\n // this.value = value\n this.dep = new Dep()\n // 将响应式对象代理到当前value上面, 并且将当前的enumerable设置为false\n def(value, '__luckyOb__', this)\n if (Array.isArray(value)) { // 如果是数组, 则重写原型方法\n if (hasProto) {\n value['__proto__'] = newArrayProto\n } else {\n Object.getOwnPropertyNames(newArrayProto).forEach(key => {\n def(value, key, newArrayProto[key])\n })\n }\n }\n this.walk(value)\n }\n\n walk (data: object | any[]) {\n Object.keys(data).forEach(key => {\n defineReactive(data, key, data[key])\n })\n }\n}\n\n/**\n * 处理响应式\n * @param { Object | Array } data\n */\nexport function observe (data: any): Observer | void {\n if (!data || typeof data !== 'object') return\n let luckyOb: Observer | void\n if ('__luckyOb__' in data) {\n luckyOb = data['__luckyOb__']\n } else {\n luckyOb = new Observer(data)\n }\n return luckyOb\n}\n\n/**\n * 重写 setter / getter\n * @param {*} data \n * @param {*} key \n * @param {*} val \n */\nexport function defineReactive (data: any, key: string | number, val: any) {\n const dep = new Dep()\n const property = Object.getOwnPropertyDescriptor(data, key)\n if (property && property.configurable === false) {\n return\n }\n const getter = property && property.get\n const setter = property && property.set\n if ((!getter || setter) && arguments.length === 2) {\n val = data[key]\n }\n let childOb = observe(val)\n Object.defineProperty(data, key, {\n get: () => {\n const value = getter ? getter.call(data) : val\n if (Dep.target) {\n dep.addSub(Dep.target)\n if (childOb) {\n childOb.dep.addSub(Dep.target)\n }\n }\n return value\n },\n set: (newVal) => {\n if (newVal === val) return\n val = newVal\n if (getter && !setter) return\n if (setter) {\n setter.call(data, newVal)\n } else {\n val = newVal\n }\n childOb = observe(newVal)\n dep.notify()\n }\n })\n}\n","import Lucky from '../lib/lucky'\nimport Dep from './dep'\nimport { parsePath, traverse } from './utils'\n\nexport interface WatchOptType {\n handler?: () => Function\n immediate?: boolean\n deep?: boolean\n}\n\nlet uid = 0\nexport default class Watcher {\n id: number\n $lucky: Lucky\n expr: string | Function\n cb: Function\n deep: boolean\n getter: Function\n value: any\n\n /**\n * 观察者构造器\n * @param {*} $lucky \n * @param {*} expr \n * @param {*} cb \n */\n constructor ($lucky: Lucky, expr: string | Function, cb: Function, options: WatchOptType = {}) {\n this.id = uid++\n this.$lucky = $lucky\n this.expr = expr\n this.deep = !!options.deep\n if (typeof expr === 'function') {\n this.getter = expr\n } else {\n this.getter = parsePath(expr)\n }\n this.cb = cb\n this.value = this.get()\n }\n\n /**\n * 根据表达式获取新值\n */\n get () {\n Dep.target = this\n const value = this.getter.call(this.$lucky, this.$lucky)\n // 处理深度监听\n if (this.deep) {\n traverse(value)\n }\n Dep.target = null\n return value\n }\n\n /**\n * 触发 watcher 更新\n */\n update () {\n // get获取新值\n const newVal = this.get()\n // 读取之前存储的旧值\n const oldVal = this.value\n this.value = newVal\n // 触发 watch 回调\n this.cb.call(this.$lucky, newVal, oldVal)\n }\n}\n","import '../utils/polyfill'\nimport { has, isExpectType, throttle } from '../utils/index'\nimport { name, version } from '../../package.json'\nimport { ConfigType, UserConfigType, ImgItemType, ImgType, Tuple } from '../types/index'\nimport { defineReactive } from '../observer'\nimport Watcher, { WatchOptType } from '../observer/watcher'\n\nexport default class Lucky {\n static version: string = version\n protected readonly version: string = version\n protected readonly config: ConfigType\n protected readonly ctx: CanvasRenderingContext2D\n protected htmlFontSize: number = 16\n protected rAF: Function = function () {}\n protected boxWidth: number = 0\n protected boxHeight: number = 0\n protected data: {\n width: string | number,\n height: string | number\n }\n\n /**\n * 公共构造器\n * @param config\n */\n constructor (\n config: string | HTMLDivElement | UserConfigType,\n data: {\n width: string | number,\n height: string | number\n }\n ) {\n // 兼容代码开始: 为了处理 v1.0.6 版本在这里传入了一个 dom\n if (typeof config === 'string') config = { el: config } as UserConfigType\n else if (config.nodeType === 1) config = { el: '', divElement: config } as UserConfigType\n // 这里先野蛮的处理, 等待后续优化, 对外暴露的类型是UserConfigType, 但内部期望是ConfigType\n config = config as UserConfigType\n this.config = config as ConfigType\n this.data = data\n // 开始初始化\n if (!config.flag) config.flag = 'WEB'\n if (config.el) config.divElement = document.querySelector(config.el) as HTMLDivElement\n // 如果存在父盒子, 就创建canvas标签\n if (config.divElement) {\n // 无论盒子内有没有canvas都执行覆盖逻辑\n config.canvasElement = document.createElement('canvas')\n config.divElement.appendChild(config.canvasElement)\n }\n // 获取 canvas 上下文\n if (config.canvasElement) {\n config.ctx = config.canvasElement.getContext('2d')!\n // 添加版本信息到标签上, 方便定位版本问题\n config.canvasElement.setAttribute('package', `${name}@${version}`)\n config.canvasElement.addEventListener('click', e => this.handleClick(e))\n }\n this.ctx = config.ctx as CanvasRenderingContext2D\n // 初始化 window 方法\n this.initWindowFunction()\n // 如果最后得不到 canvas 上下文那就无法进行绘制\n if (!this.config.ctx) {\n console.error('无法获取到 CanvasContext2D')\n }\n // 监听 window 触发 resize 时重置\n if (window && typeof window.addEventListener === 'function') {\n window.addEventListener('resize', throttle(() => this.resize(), 300))\n }\n // 监听异步设置 html 的 fontSize 并重新绘制\n if (window && typeof window.MutationObserver === 'function') {\n new window.MutationObserver(() => {\n this.resize()\n }).observe(document.documentElement, { attributes: true })\n }\n }\n\n /**\n * 初始化组件大小/单位\n */\n protected resize(): void {\n this.config.beforeResize?.()\n // 先初始化 fontSize 以防后面有 rem 单位\n this.setHTMLFontSize()\n // 拿到 config 即可设置 dpr\n this.setDpr()\n // 初始化宽高\n this.resetWidthAndHeight()\n // 根据 dpr 来缩放 canvas\n this.zoomCanvas()\n }\n\n /**\n * 初始化方法\n */\n protected initLucky () {\n this.resize()\n if (!this.boxWidth || !this.boxHeight) {\n return console.error('无法获取到宽度或高度')\n }\n }\n\n /**\n * 鼠标点击事件\n * @param e 事件参数\n */\n protected handleClick (e: MouseEvent): void {}\n\n /**\n * 根标签的字体大小\n */\n protected setHTMLFontSize (): void {\n if (!window) return\n this.htmlFontSize = +window.getComputedStyle(document.documentElement).fontSize.slice(0, -2)\n }\n\n // 清空画布\n public clearCanvas (): void {\n const [width, height] = [this.boxWidth, this.boxHeight]\n this.ctx.clearRect(-width, -height, width * 2, height * 2)\n }\n\n /**\n * 设备像素比\n * window 环境下自动获取, 其余环境手动传入\n */\n protected setDpr (): void {\n const { config } = this\n if (config.dpr) {\n // 优先使用 config 传入的 dpr\n } else if (window) {\n window['dpr'] = config.dpr = window.devicePixelRatio || 1\n } else if (!config.dpr) {\n console.error(config, '未传入 dpr 可能会导致绘制异常')\n }\n }\n\n /**\n * 重置盒子和canvas的宽高\n */\n private resetWidthAndHeight (): void {\n const { config, data } = this\n // 如果是浏览器环境并且存在盒子\n let boxWidth = 0, boxHeight = 0\n if (config.divElement) {\n boxWidth = config.divElement.offsetWidth\n boxHeight = config.divElement.offsetHeight\n }\n // 先从 data 里取宽高, 如果 config 上面没有, 就从 style 上面取\n this.boxWidth = this.getLength(data.width || config['width']) || boxWidth\n this.boxHeight = this.getLength(data.height || config['height']) || boxHeight\n // 重新把宽高赋给盒子\n if (config.divElement) {\n config.divElement.style.overflow = 'hidden'\n config.divElement.style.width = this.boxWidth + 'px'\n config.divElement.style.height = this.boxHeight + 'px'\n }\n }\n\n /**\n * 根据 dpr 缩放 canvas 并处理位移\n */\n protected zoomCanvas (): void {\n const { config, ctx } = this\n const { canvasElement, dpr } = config\n const [width, height] = [this.boxWidth * dpr, this.boxHeight * dpr]\n if (!canvasElement) return\n canvasElement.width = width\n canvasElement.height = height\n canvasElement.style.width = `${width}px`\n canvasElement.style.height = `${height}px`\n canvasElement.style['transform-origin'] = 'left top'\n canvasElement.style.transform = `scale(${1 / dpr})`\n ctx.scale(dpr, dpr)\n }\n\n /**\n * 从 window 对象上获取一些方法\n */\n private initWindowFunction (): void {\n const { config } = this\n if (window) {\n this.rAF = window.requestAnimationFrame ||\n window['webkitRequestAnimationFrame'] ||\n window['mozRequestAnimationFrame'] ||\n function (callback: Function) {\n window.setTimeout(callback, 1000 / 60)\n }\n config.setTimeout = window.setTimeout\n config.setInterval = window.setInterval\n config.clearTimeout = window.clearTimeout\n config.clearInterval = window.clearInterval\n return\n }\n if (config.rAF) {\n // 优先使用帧动画\n this.rAF = config.rAF\n } else if (config.setTimeout) {\n // 其次使用定时器\n const timeout = config.setTimeout\n this.rAF = (callback: Function): number => timeout(callback, 16.7)\n } else {\n // 如果config里面没有提供, 那就假设全局方法存在setTimeout\n this.rAF = (callback: Function): number => setTimeout(callback, 16.7)\n }\n }\n\n public isWeb () {\n return ['WEB', 'UNI-H5', 'TARO-H5'].includes(this.config.flag)\n }\n\n /**\n * 异步加载图片并返回图片的几何信息\n * @param src 图片路径\n * @param info 图片信息\n */\n protected loadImg (\n src: string,\n info: ImgItemType,\n resolveName = '$resolve'\n ): Promise {\n return new Promise((resolve, reject) => {\n if (!src) reject(`=> '${info.src}' 不能为空或不合法`)\n if (this.config.flag === 'WEB') {\n let imgObj = new Image()\n imgObj['crossorigin'] = 'anonymous'\n imgObj.onload = () => resolve(imgObj)\n imgObj.onerror = () => reject(`=> '${info.src}' 图片加载失败`)\n imgObj.src = src\n } else {\n // 其余平台向外暴露, 交给外部自行处理\n info[resolveName] = resolve\n info['$reject'] = reject\n return\n }\n })\n }\n\n /**\n * 公共绘制图片的方法\n * @param imgObj 图片对象\n * @param rectInfo: [x轴位置, y轴位置, 渲染宽度, 渲染高度] \n */\n protected drawImage(\n ctx: CanvasRenderingContext2D,\n imgObj: ImgType,\n ...rectInfo: [...Tuple, ...Partial>]\n ): void {\n let drawImg\n const { flag, dpr } = this.config\n if (['WEB', 'MP-WX'].includes(flag)) {\n // 浏览器和新版小程序中直接绘制即可\n drawImg = imgObj\n } else if (['UNI-H5', 'UNI-MP', 'TARO-H5', 'TARO-MP'].includes(flag)) {\n // 旧版本的小程序需要绘制 path, 这里特殊处理一下\n type OldImageType = ImgType & { path: CanvasImageSource }\n drawImg = (imgObj as OldImageType).path\n } else {\n // 如果传入了未知的标识\n return console.error('意料之外的 flag, 该平台尚未兼容!')\n }\n const miniProgramOffCtx = (drawImg['canvas'] || drawImg).getContext?.('2d')\n if (miniProgramOffCtx && !this.isWeb()) {\n rectInfo = rectInfo.map(val => val! * dpr) as Tuple\n const temp = miniProgramOffCtx.getImageData(...rectInfo.slice(0, 4))\n ctx.putImageData(temp, ...(rectInfo.slice(4, 6) as Tuple))\n } else {\n if (rectInfo.length === 8) {\n rectInfo = rectInfo.map((val, index) => index < 4 ? val! * dpr : val) as Tuple\n }\n // 尝试捕获错误\n try {\n ctx.drawImage(drawImg, ...rectInfo as Tuple)\n } catch (err) {\n /**\n * TODO: safari浏览器下, init() 会出现奇怪的报错\n * IndexSizeError: The index is not in the allowed range\n * 但是这个报错并不影响实际的绘制, 目前先放一放, 等待有缘人\n */\n // console.log(err)\n }\n }\n }\n\n /**\n * 计算图片的渲染宽高\n * @param imgObj 图片标签元素\n * @param imgInfo 图片信息\n * @param maxWidth 最大宽度\n * @param maxHeight 最大高度\n * @return [渲染宽度, 渲染高度]\n */\n protected computedWidthAndHeight (\n imgObj: ImgType,\n imgInfo: ImgItemType,\n maxWidth: number,\n maxHeight: number\n ): [number, number] {\n // 根据配置的样式计算图片的真实宽高\n if (!imgInfo.width && !imgInfo.height) {\n // 如果没有配置宽高, 则使用图片本身的宽高\n return [imgObj.width, imgObj.height]\n } else if (imgInfo.width && !imgInfo.height) {\n // 如果只填写了宽度, 没填写高度\n let trueWidth = this.getLength(imgInfo.width, maxWidth)\n // 那高度就随着宽度进行等比缩放\n return [trueWidth, imgObj.height * (trueWidth / imgObj.width)]\n } else if (!imgInfo.width && imgInfo.height) {\n // 如果只填写了宽度, 没填写高度\n let trueHeight = this.getLength(imgInfo.height, maxHeight)\n // 那宽度就随着高度进行等比缩放\n return [imgObj.width * (trueHeight / imgObj.height), trueHeight]\n }\n // 如果宽度和高度都填写了, 就如实计算\n return [\n this.getLength(imgInfo.width, maxWidth),\n this.getLength(imgInfo.height, maxHeight)\n ]\n }\n\n /**\n * 转换单位\n * @param { string } value 将要转换的值\n * @param { number } denominator 分子\n * @return { number } 返回新的字符串\n */\n protected changeUnits (value: string, denominator = 1): number {\n const { config } = this\n return Number(value.replace(/^([-]*[0-9.]*)([a-z%]*)$/, (val, num, unit) => {\n const handleCssUnit = {\n '%': (n: number) => n * (denominator / 100),\n 'px': (n: number) => n * 1,\n 'rem': (n: number) => n * this.htmlFontSize,\n 'vw': (n: number) => n / 100 * window.innerWidth,\n }[unit]\n if (handleCssUnit) return handleCssUnit(num)\n // 如果找不到默认单位, 就交给外面处理\n const otherHandleCssUnit = config.handleCssUnit || config['unitFunc']\n return otherHandleCssUnit ? otherHandleCssUnit(num, unit) : num\n }))\n }\n\n /**\n * 获取长度\n * @param length 将要转换的长度\n * @param maxLength 最大长度\n * @return 返回长度\n */\n protected getLength (length: string | number | undefined, maxLength?: number): number {\n if (isExpectType(length, 'number')) return length as number\n if (isExpectType(length, 'string')) return this.changeUnits(length as string, maxLength)\n return 0\n }\n\n /**\n * 获取相对(居中)X坐标\n * @param width\n * @param col\n */\n protected getOffsetX (width: number, maxWidth: number = 0): number {\n return (maxWidth - width) / 2\n }\n\n protected getOffscreenCanvas (width: number, height: number): {\n _offscreenCanvas: HTMLCanvasElement,\n _ctx: CanvasRenderingContext2D\n } | void {\n if (!has(this, '_offscreenCanvas')) {\n if (window && window.document && this.config.flag === 'WEB') {\n this['_offscreenCanvas'] = document.createElement('canvas')\n } else {\n this['_offscreenCanvas'] = this.config['offscreenCanvas']\n }\n if (!this['_offscreenCanvas']) return console.error('离屏 Canvas 无法渲染!')\n }\n const dpr = this.config.dpr\n const _offscreenCanvas = this['_offscreenCanvas'] as HTMLCanvasElement\n _offscreenCanvas.width = (width || 300) * dpr\n _offscreenCanvas.height = (height || 150) * dpr\n const _ctx = _offscreenCanvas.getContext('2d')!\n _ctx.clearRect(0, 0, width, height)\n _ctx.scale(dpr, dpr)\n _ctx['dpr'] = dpr\n return { _offscreenCanvas, _ctx }\n }\n\n /**\n * 添加一个新的响应式数据 (临时)\n * @param data 数据\n * @param key 属性\n * @param value 新值\n */\n public $set (data: object, key: string | number, value: any) {\n if (!data || typeof data !== 'object') return\n defineReactive(data, key, value)\n }\n\n /**\n * 添加一个属性计算 (临时)\n * @param data 源数据\n * @param key 属性名\n * @param callback 回调函数\n */\n protected $computed (data: object, key: string, callback: Function) {\n Object.defineProperty(data, key, {\n get: () => {\n return callback.call(this)\n }\n })\n }\n\n /**\n * 添加一个观察者 create user watcher\n * @param expr 表达式\n * @param handler 回调函数\n * @param watchOpt 配置参数\n * @return 卸载当前观察者的函数 (暂未返回)\n */\n protected $watch (\n expr: string | Function,\n handler: Function | WatchOptType,\n watchOpt: WatchOptType = {}\n ): Function {\n if (typeof handler === 'object') {\n watchOpt = handler\n handler = watchOpt.handler!\n }\n // 创建 user watcher\n const watcher = new Watcher(this, expr, handler, watchOpt)\n // 判断是否需要初始化时触发回调\n if (watchOpt.immediate) {\n handler.call(this, watcher.value)\n }\n // 返回一个卸载当前观察者的函数\n return function unWatchFn () {}\n }\n}\n","/**\n * 转换为运算角度\n * @param { number } deg 数学角度\n * @return { number } 运算角度\n */\nexport const getAngle = (deg: number): number => {\n return Math.PI / 180 * deg\n}\n\n/**\n * 根据角度计算圆上的点\n * @param { number } deg 运算角度\n * @param { number } r 半径\n * @return { Array } 坐标[x, y]\n */\nexport const getArcPointerByDeg = (deg: number, r: number): [number, number] => {\n return [+(Math.cos(deg) * r).toFixed(8), +(Math.sin(deg) * r).toFixed(8)]\n}\n\n/**\n * 根据点计算切线方程\n * @param { number } x 横坐标\n * @param { number } y 纵坐标\n * @return { Array } [斜率, 常数]\n */\nexport const getTangentByPointer = (x: number, y: number): Array => {\n let k = - x / y\n let b = -k * x + y\n return [k, b]\n}\n\n// 使用 arc 绘制扇形\nexport const fanShapedByArc = (\n ctx: CanvasRenderingContext2D,\n minRadius: number,\n maxRadius: number,\n start: number,\n end: number,\n gutter: number,\n): void => {\n ctx.beginPath()\n let maxGutter = getAngle(90 / Math.PI / maxRadius * gutter)\n let minGutter = getAngle(90 / Math.PI / minRadius * gutter)\n let maxStart = start + maxGutter\n let maxEnd = end - maxGutter\n let minStart = start + minGutter\n let minEnd = end - minGutter\n ctx.arc(0, 0, maxRadius, maxStart, maxEnd, false)\n // 如果 getter 比按钮短就绘制圆弧, 反之计算新的坐标点\n // if (minEnd > minStart) {\n // ctx.arc(0, 0, minRadius, minEnd, minStart, true)\n // } else {\n ctx.lineTo(\n ...getArcPointerByDeg(\n (start + end) / 2,\n gutter / 2 / Math.abs(Math.sin((start - end) / 2))\n )\n )\n // }\n ctx.closePath()\n}\n\n// 使用 arc 绘制圆角矩形\nexport const roundRectByArc = (\n ctx: CanvasRenderingContext2D,\n ...[x, y, w, h, r]: number[]\n) => {\n const min = Math.min(w, h), PI = Math.PI\n if (r > min / 2) r = min / 2\n ctx.beginPath()\n ctx.moveTo(x + r, y)\n ctx.lineTo(x + r, y)\n ctx.lineTo(x + w - r, y)\n ctx.arc(x + w - r, y + r, r, -PI / 2, 0)\n ctx.lineTo(x + w, y + h - r)\n ctx.arc(x + w - r, y + h - r, r, 0, PI / 2)\n ctx.lineTo(x + r, y + h)\n ctx.arc(x + r, y + h - r, r, PI / 2, PI)\n ctx.lineTo(x, y + r)\n ctx.arc(x + r, y + r, r, PI, -PI / 2)\n ctx.closePath()\n}\n\n/**\n * 创建线性渐变色\n */\nexport const getLinearGradient = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n background: string\n) => {\n const context = (/linear-gradient\\((.+)\\)/.exec(background) as Array)[1]\n .split(',') // 根据逗号分割\n .map((text: string) => text.trim()) // 去除两边空格\n let deg = context.shift(), direction: [number, number, number, number] = [0, 0, 0, 0]\n // 通过起始点和角度计算渐变终点的坐标点, 这里感谢泽宇大神提醒我使用勾股定理....\n if (deg.includes('deg')) {\n deg = deg.slice(0, -3) % 360\n // 根据4个象限定义起点坐标, 根据45度划分8个区域计算终点坐标\n const getLenOfTanDeg = (deg: number) => Math.tan(deg / 180 * Math.PI)\n if (deg >= 0 && deg < 45) direction = [x, y + h, x + w, y + h - w * getLenOfTanDeg(deg - 0)]\n else if (deg >= 45 && deg < 90) direction = [x, y + h, (x + w) - h * getLenOfTanDeg(deg - 45), y]\n else if (deg >= 90 && deg < 135) direction = [x + w, y + h, (x + w) - h * getLenOfTanDeg(deg - 90), y]\n else if (deg >= 135 && deg < 180) direction = [x + w, y + h, x, y + w * getLenOfTanDeg(deg - 135)]\n else if (deg >= 180 && deg < 225) direction = [x + w, y, x, y + w * getLenOfTanDeg(deg - 180)]\n else if (deg >= 225 && deg < 270) direction = [x + w, y, x + h * getLenOfTanDeg(deg - 225), y + h]\n else if (deg >= 270 && deg < 315) direction = [x, y, x + h * getLenOfTanDeg(deg - 270), y + h]\n else if (deg >= 315 && deg < 360) direction = [x, y, x + w, y + h - w * getLenOfTanDeg(deg - 315)]\n }\n // 创建四个简单的方向坐标\n else if (deg.includes('top')) direction = [x, y + h, x, y]\n else if (deg.includes('bottom')) direction = [x, y, x, y + h]\n else if (deg.includes('left')) direction = [x + w, y, x, y]\n else if (deg.includes('right')) direction = [x, y, x + w, y]\n // 创建线性渐变必须使用整数坐标\n const gradient = ctx.createLinearGradient(...(direction.map(n => n >> 0) as typeof direction))\n // 这里后期重构, 先用any代替\n return context.reduce((gradient: any, item: any, index: any) => {\n const info = item.split(' ')\n if (info.length === 1) gradient.addColorStop(index, info[0])\n else if (info.length === 2) gradient.addColorStop(...info)\n return gradient\n }, gradient)\n}\n\n// // 根据三点画圆弧\n// export const drawRadian = (\n// ctx: CanvasRenderingContext2D,\n// r: number,\n// start: number,\n// end: number,\n// direction: boolean = true\n// ) => {\n// // 如果角度大于等于180度, 则分两次绘制, 因为 arcTo 无法绘制180度的圆弧\n// if (Math.abs(end - start).toFixed(8) >= getAngle(180).toFixed(8)) {\n// let middle = (end + start) / 2\n// if (direction) {\n// drawRadian(ctx, r, start, middle, direction)\n// drawRadian(ctx, r, middle, end, direction)\n// } else {\n// drawRadian(ctx, r, middle, end, direction)\n// drawRadian(ctx, r, start, middle, direction)\n// }\n// return false\n// }\n// // 如果方法相反, 则交换起点和终点\n// if (!direction) [start, end] = [end, start]\n// const [x1, y1] = getArcPointerByDeg(start, r)\n// const [x2, y2] = getArcPointerByDeg(end, r)\n// const [k1, b1] = getTangentByPointer(x1, y1)\n// const [k2, b2] = getTangentByPointer(x2, y2)\n// // 计算两条切线的交点\n// let x0 = (b2 - b1) / (k1 - k2)\n// let y0 = (k2 * b1 - k1 * b2) / (k2 - k1)\n// // 如果有任何一条切线垂直于x轴, 则斜率不存在\n// if (isNaN(x0)) {\n// Math.abs(x1) === +r.toFixed(8) && (x0 = x1)\n// Math.abs(x2) === +r.toFixed(8) && (x0 = x2)\n// }\n// if (k1 === Infinity || k1 === -Infinity) {\n// y0 = k2 * x0 + b2\n// }\n// else if (k2 === Infinity || k2 === -Infinity) {\n// y0 = k1 * x0 + b1\n// }\n// ctx.lineTo(x1, y1)\n// // 微信小程序下 arcTo 在安卓真机下绘制有 bug\n// ctx.arcTo(x0, y0, x2, y2, r)\n// }\n\n// // 使用 arcTo 绘制扇形 (弃用)\n// export const drawSectorByArcTo = (\n// ctx: CanvasRenderingContext2D,\n// minRadius: number,\n// maxRadius: number,\n// start: number,\n// end: number,\n// gutter: number,\n// ) => {\n// if (!minRadius) minRadius = gutter\n// // 内外圆弧分别进行等边缩放\n// let maxGutter = getAngle(90 / Math.PI / maxRadius * gutter)\n// let minGutter = getAngle(90 / Math.PI / minRadius * gutter)\n// let maxStart = start + maxGutter\n// let maxEnd = end - maxGutter\n// let minStart = start + minGutter\n// let minEnd = end - minGutter\n// ctx.beginPath()\n// ctx.moveTo(...getArcPointerByDeg(maxStart, maxRadius))\n// drawRadian(ctx, maxRadius, maxStart, maxEnd, true)\n// // 如果 getter 比按钮短就绘制圆弧, 反之计算新的坐标点\n// if (minEnd > minStart) {\n// drawRadian(ctx, minRadius, minStart, minEnd, false)\n// } else {\n// ctx.lineTo(\n// ...getArcPointerByDeg(\n// (start + end) / 2,\n// gutter / 2 / Math.abs(Math.sin((start - end) / 2))\n// )\n// )\n// }\n// ctx.closePath()\n// }\n\n// // 使用 arcTo 绘制圆角矩形 (弃用)\n// export const roundRectByArcTo = (\n// ctx: CanvasRenderingContext2D,\n// ...[x, y, w, h, r]: number[]\n// ) => {\n// let min = Math.min(w, h)\n// if (r > min / 2) r = min / 2\n// ctx.beginPath()\n// ctx.moveTo(x + r, y)\n// ctx.lineTo(x + r, y)\n// ctx.lineTo(x + w - r, y)\n// ctx.arcTo(x + w, y, x + w, y + r, r)\n// ctx.lineTo(x + w, y + h - r)\n// ctx.arcTo(x + w, y + h, x + w - r, y + h, r)\n// ctx.lineTo(x + r, y + h)\n// ctx.arcTo(x, y + h, x, y + h - r, r)\n// ctx.lineTo(x, y + r)\n// ctx.arcTo(x, y, x + r, y, r)\n// }\n","/**\n * 缓动函数\n * t: current time(当前时间)\n * b: beginning value(初始值)\n * c: change in value(变化量)\n * d: duration(持续时间)\n * \n * 感谢张鑫旭大佬 https://github.com/zhangxinxu/Tween\n */\n\ninterface SpeedType {\n easeIn: (...arr: number[]) => number\n easeOut: (...arr: number[]) => number\n}\n\n// 二次方的缓动\nexport const quad: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return c * (t /= d) * t + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return -c * (t /= d) * (t - 2) + b\n }\n}\n\n// 三次方的缓动\nexport const cubic: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return c * (t /= d) * t * t + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return c * ((t = t / d - 1) * t * t + 1) + b\n }\n}\n\n// 四次方的缓动\nexport const quart: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return c * (t /= d) * t * t * t + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return -c * ((t = t / d - 1) * t * t * t - 1) + b\n }\n}\n\n// 五次方的缓动\nexport const quint: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return c * (t /= d) * t * t * t * t + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b\n }\n}\n\n// 正弦曲线的缓动\nexport const sine: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return c * Math.sin(t / d * (Math.PI / 2)) + b\n }\n}\n\n// 指数曲线的缓动\nexport const expo: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b\n }\n}\n\n// 圆形曲线的缓动\nexport const circ: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b\n }\n}\n","import Lucky from './lucky'\nimport { UserConfigType, FontItemType, ImgType } from '../types/index'\nimport LuckyWheelConfig, {\n BlockType,\n PrizeType,\n ButtonType,\n DefaultConfigType,\n DefaultStyleType,\n StartCallbackType,\n EndCallbackType\n} from '../types/wheel'\nimport {\n removeEnter,\n hasBackground,\n computeRange,\n splitText,\n has,\n} from '../utils/index'\nimport { getAngle, fanShapedByArc } from '../utils/math'\nimport { quad } from '../utils/tween'\n\nexport default class LuckyWheel extends Lucky {\n private blocks: Array = []\n private prizes: Array = []\n private buttons: Array = []\n private defaultConfig: DefaultConfigType = {}\n private defaultStyle: DefaultStyleType = {}\n private _defaultConfig: Required = {} as Required\n private _defaultStyle: Required = {} as Required\n private startCallback?: StartCallbackType\n private endCallback?: EndCallbackType\n private Radius = 0 // 大转盘半径\n private prizeRadius = 0 // 奖品区域半径\n private prizeDeg = 0 // 奖品数学角度\n private prizeAng = 0 // 奖品运算角度\n private rotateDeg = 0 // 转盘旋转角度\n private maxBtnRadius = 0 // 最大按钮半径\n private startTime = 0 // 开始时间戳\n private endTime = 0 // 停止时间戳\n private stopDeg = 0 // 刻舟求剑\n private endDeg = 0 // 停止角度\n private FPS = 16.6 // 屏幕刷新率\n /**\n * 游戏当前的阶段\n * step = 0 时, 游戏尚未开始\n * step = 1 时, 此时处于加速阶段\n * step = 2 时, 此时处于匀速阶段\n * step = 3 时, 此时处于减速阶段\n */\n private step: 0 | 1 | 2 | 3 = 0\n /**\n * 中奖索引\n * prizeFlag = undefined 时, 处于开始抽奖阶段, 正常旋转\n * prizeFlag >= 0 时, 说明stop方法被调用, 并且传入了中奖索引\n * prizeFlag === -1 时, 说明stop方法被调用, 并且传入了负值, 本次抽奖无效\n */\n private prizeFlag: number | undefined\n private ImageCache = new Map()\n\n /**\n * 大转盘构造器\n * @param config 配置项\n * @param data 抽奖数据\n */\n constructor (config: UserConfigType, data: LuckyWheelConfig) {\n super(config, {\n width: data.width,\n height: data.height\n })\n this.initData(data)\n this.initWatch()\n this.initComputed()\n // 创建前回调函数\n config.beforeCreate?.call(this)\n // 首次初始化\n this.init()\n }\n\n protected resize(): void {\n super.resize()\n this.Radius = Math.min(this.boxWidth, this.boxHeight) / 2\n this.ctx.translate(this.Radius, this.Radius)\n this.draw()\n this.config.afterResize?.()\n }\n\n protected initLucky (): void {\n this.Radius = 0\n this.prizeRadius = 0\n this.prizeDeg = 0\n this.prizeAng = 0\n this.rotateDeg = 0\n this.maxBtnRadius = 0\n this.startTime = 0\n this.endTime = 0\n this.stopDeg = 0\n this.endDeg = 0\n this.FPS = 16.6\n this.prizeFlag = -1\n this.step = 0\n super.initLucky()\n }\n\n /**\n * 初始化数据\n * @param data\n */\n private initData (data: LuckyWheelConfig): void {\n this.$set(this, 'width', data.width)\n this.$set(this, 'height', data.height)\n this.$set(this, 'blocks', data.blocks || [])\n this.$set(this, 'prizes', data.prizes || [])\n this.$set(this, 'buttons', data.buttons || [])\n this.$set(this, 'defaultConfig', data.defaultConfig || {})\n this.$set(this, 'defaultStyle', data.defaultStyle || {})\n this.$set(this, 'startCallback', data.start)\n this.$set(this, 'endCallback', data.end)\n }\n\n /**\n * 初始化属性计算\n */\n private initComputed () {\n // 默认配置\n this.$computed(this, '_defaultConfig', () => {\n const config = {\n gutter: '0px',\n offsetDegree: 0,\n speed: 20,\n speedFunction: 'quad',\n accelerationTime: 2500,\n decelerationTime: 2500,\n stopRange: 0,\n ...this.defaultConfig\n }\n return config\n })\n // 默认样式\n this.$computed(this, '_defaultStyle', () => {\n const style = {\n fontSize: '18px',\n fontColor: '#000',\n fontStyle: 'sans-serif',\n fontWeight: '400',\n background: 'rgba(0,0,0,0)',\n wordWrap: true,\n lengthLimit: '90%',\n ...this.defaultStyle\n }\n return style\n })\n }\n\n /**\n * 初始化观察者\n */\n private initWatch () {\n // 重置宽度\n this.$watch('width', (newVal: string | number) => {\n this.data.width = newVal\n this.resize()\n })\n // 重置高度\n this.$watch('height', (newVal: string | number) => {\n this.data.height = newVal\n this.resize()\n })\n // 观察 blocks 变化收集图片\n this.$watch('blocks', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 观察 prizes 变化收集图片\n this.$watch('prizes', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 观察 buttons 变化收集图片\n this.$watch('buttons', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n this.$watch('defaultConfig', () => this.draw(), { deep: true })\n this.$watch('defaultStyle', () => this.draw(), { deep: true })\n this.$watch('startCallback', () => this.init())\n this.$watch('endCallback', () => this.init())\n }\n\n /**\n * 初始化 canvas 抽奖\n */\n public async init (): Promise {\n this.initLucky()\n const { config } = this\n // 初始化前回调函数\n config.beforeInit?.call(this)\n this.draw() // 先画一次, 防止闪烁\n this.draw() // 再画一次, 拿到正确的按钮轮廓\n // 异步加载图片\n await this.initImageCache()\n // 初始化后回调函数\n config.afterInit?.call(this)\n }\n\n private initImageCache (): Promise {\n return new Promise((resolve) => {\n const willUpdateImgs = {\n blocks: this.blocks.map(block => block.imgs),\n prizes: this.prizes.map(prize => prize.imgs),\n buttons: this.buttons.map(btn => btn.imgs),\n }\n ;(<(keyof typeof willUpdateImgs)[]>Object.keys(willUpdateImgs)).forEach(imgName => {\n const willUpdate = willUpdateImgs[imgName]\n // 循环遍历所有图片\n const allPromise: Promise[] = []\n willUpdate && willUpdate.forEach((imgs, cellIndex) => {\n imgs && imgs.forEach((imgInfo, imgIndex) => {\n allPromise.push(this.loadAndCacheImg(imgName, cellIndex, imgIndex))\n })\n })\n Promise.all(allPromise).then(() => {\n this.draw()\n resolve()\n })\n })\n })\n }\n\n /**\n * canvas点击事件\n * @param e 事件参数\n */\n protected handleClick (e: MouseEvent): void {\n const { ctx } = this\n ctx.beginPath()\n ctx.arc(0, 0, this.maxBtnRadius, 0, Math.PI * 2, false)\n if (!ctx.isPointInPath(e.offsetX, e.offsetY)) return\n if (this.step !== 0) return\n this.startCallback?.(e)\n }\n\n /**\n * 根据索引单独加载指定图片并缓存\n * @param cellName 模块名称\n * @param cellIndex 模块索引\n * @param imgName 模块对应的图片缓存\n * @param imgIndex 图片索引\n */\n private async loadAndCacheImg (\n cellName: 'blocks' | 'prizes' | 'buttons',\n cellIndex: number,\n imgIndex: number,\n ): Promise {\n return new Promise((resolve, reject) => {\n // 获取图片信息\n const cell: BlockType | PrizeType | ButtonType = this[cellName][cellIndex]\n if (!cell || !cell.imgs) return\n const imgInfo = cell.imgs[imgIndex]\n if (!imgInfo) return\n // 异步加载图片\n this.loadImg(imgInfo.src, imgInfo).then(async currImg => {\n if (typeof imgInfo.formatter === 'function') {\n currImg = await Promise.resolve(imgInfo.formatter.call(this, currImg))\n }\n this.ImageCache.set(imgInfo['src'], currImg)\n resolve()\n }).catch(err => {\n console.error(`${cellName}[${cellIndex}].imgs[${imgIndex}] ${err}`)\n reject()\n })\n })\n }\n\n private drawBlock (radius: number, block: BlockType, blockIndex: number): void {\n const { ctx } = this\n if (hasBackground(block.background)) {\n ctx.beginPath()\n ctx.fillStyle = block.background!\n ctx.arc(0, 0, radius, 0, Math.PI * 2, false)\n ctx.fill()\n }\n block.imgs && block.imgs.forEach((imgInfo, imgIndex) => {\n const blockImg = this.ImageCache.get(imgInfo.src)\n if (!blockImg) return\n // 绘制图片\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(blockImg, imgInfo, radius * 2, radius * 2)\n const [xAxis, yAxis] = [this.getOffsetX(trueWidth) + this.getLength(imgInfo.left, radius * 2), this.getLength(imgInfo.top, radius * 2) - radius]\n ctx.save()\n imgInfo.rotate && ctx.rotate(getAngle(this.rotateDeg))\n this.drawImage(ctx, blockImg, xAxis, yAxis, trueWidth, trueHeight)\n ctx.restore()\n })\n }\n\n /**\n * 开始绘制\n */\n protected draw (): void {\n const { config, ctx, _defaultConfig, _defaultStyle } = this\n // 触发绘制前回调\n config.beforeDraw?.call(this, ctx)\n // 清空画布\n ctx.clearRect(-this.Radius, -this.Radius, this.Radius * 2, this.Radius * 2)\n // 计算 padding 并绘制 blocks 边框\n this.prizeRadius = this.blocks.reduce((radius, block, blockIndex) => {\n this.drawBlock(radius, block, blockIndex)\n return radius - this.getLength(block.padding && block.padding.split(' ')[0])\n }, this.Radius)\n // 计算起始弧度\n this.prizeDeg = 360 / this.prizes.length\n this.prizeAng = getAngle(this.prizeDeg)\n const shortSide = this.prizeRadius * Math.sin(this.prizeAng / 2) * 2\n // 起始角度调整到正上方, 并且减去半个扇形角度\n let start = getAngle(this.rotateDeg - 90 + this.prizeDeg / 2 + _defaultConfig.offsetDegree)\n // 计算文字横坐标\n const getFontX = (font: FontItemType, line: string) => {\n return this.getOffsetX(ctx.measureText(line).width) + this.getLength(font.left, shortSide)\n }\n // 计算文字纵坐标\n const getFontY = (font: FontItemType, height: number, lineIndex: number) => {\n // 优先使用字体行高, 要么使用默认行高, 其次使用字体大小, 否则使用默认字体大小\n const lineHeight = font.lineHeight || _defaultStyle.lineHeight || font.fontSize || _defaultStyle.fontSize\n return this.getLength(font.top, height) + (lineIndex + 1) * this.getLength(lineHeight)\n }\n ctx.save()\n // 绘制prizes奖品区域\n this.prizes.forEach((prize, prizeIndex) => {\n // 计算当前奖品区域中间坐标点\n let currMiddleDeg = start + prizeIndex * this.prizeAng\n // 奖品区域可见高度\n let prizeHeight = this.prizeRadius - this.maxBtnRadius\n // 绘制背景\n const background = prize.background || _defaultStyle.background\n if (hasBackground(background)) {\n ctx.fillStyle = background\n fanShapedByArc(\n ctx, this.maxBtnRadius, this.prizeRadius,\n currMiddleDeg - this.prizeAng / 2,\n currMiddleDeg + this.prizeAng / 2,\n this.getLength(_defaultConfig.gutter),\n )\n ctx.fill()\n }\n // 计算临时坐标并旋转文字\n let x = Math.cos(currMiddleDeg) * this.prizeRadius\n let y = Math.sin(currMiddleDeg) * this.prizeRadius\n ctx.translate(x, y)\n ctx.rotate(currMiddleDeg + getAngle(90))\n // 绘制图片\n prize.imgs && prize.imgs.forEach((imgInfo, imgIndex) => {\n const prizeImg = this.ImageCache.get(imgInfo.src)\n if (!prizeImg) return\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(\n prizeImg,\n imgInfo,\n this.prizeAng * this.prizeRadius,\n prizeHeight\n )\n const [xAxis, yAxis] = [\n this.getOffsetX(trueWidth) + this.getLength(imgInfo.left, shortSide),\n this.getLength(imgInfo.top, prizeHeight)\n ]\n this.drawImage(ctx, prizeImg, xAxis, yAxis, trueWidth, trueHeight)\n })\n // 逐行绘制文字\n prize.fonts && prize.fonts.forEach(font => {\n const fontColor = font.fontColor || _defaultStyle.fontColor\n const fontWeight = font.fontWeight || _defaultStyle.fontWeight\n const fontSize = this.getLength(font.fontSize || _defaultStyle.fontSize)\n const fontStyle = font.fontStyle || _defaultStyle.fontStyle\n const wordWrap = has(font, 'wordWrap') ? font.wordWrap : _defaultStyle.wordWrap\n const lengthLimit = font.lengthLimit || _defaultStyle.lengthLimit\n const lineClamp = font.lineClamp || _defaultStyle.lineClamp\n ctx.fillStyle = fontColor\n ctx.font = `${fontWeight} ${fontSize >> 0}px ${fontStyle}`\n let lines = [], text = String(font.text)\n if (wordWrap) {\n lines = splitText(ctx, removeEnter(text), (lines) => {\n // 三角形临边\n const adjacentSide = this.prizeRadius - getFontY(font, prizeHeight, lines.length)\n // 三角形短边\n const shortSide = adjacentSide * Math.tan(this.prizeAng / 2)\n // 最大宽度\n let maxWidth = shortSide * 2 - this.getLength(_defaultConfig.gutter)\n return this.getLength(lengthLimit, maxWidth)\n }, lineClamp)\n } else {\n lines = text.split('\\n')\n }\n lines.filter(line => !!line).forEach((line, lineIndex) => {\n ctx.fillText(line, getFontX(font, line), getFontY(font, prizeHeight, lineIndex))\n })\n })\n // 修正旋转角度和原点坐标\n ctx.rotate(getAngle(360) - currMiddleDeg - getAngle(90))\n ctx.translate(-x, -y)\n })\n ctx.restore()\n // 绘制按钮\n this.buttons.forEach((btn, btnIndex) => {\n let radius = this.getLength(btn.radius, this.prizeRadius)\n // 绘制背景颜色\n this.maxBtnRadius = Math.max(this.maxBtnRadius, radius)\n if (hasBackground(btn.background)) {\n ctx.beginPath()\n ctx.fillStyle = btn.background as string\n ctx.arc(0, 0, radius, 0, Math.PI * 2, false)\n ctx.fill()\n }\n // 绘制指针\n if (btn.pointer && hasBackground(btn.background)) {\n ctx.beginPath()\n ctx.fillStyle = btn.background as string\n ctx.moveTo(-radius, 0)\n ctx.lineTo(radius, 0)\n ctx.lineTo(0, -radius * 2)\n ctx.closePath()\n ctx.fill()\n }\n // 绘制按钮图片\n btn.imgs && btn.imgs.forEach((imgInfo, imgIndex) => {\n const btnImg = this.ImageCache.get(imgInfo.src)\n if (!btnImg) return\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(btnImg, imgInfo, radius * 2, radius * 2)\n const [xAxis, yAxis] = [this.getOffsetX(trueWidth) + this.getLength(imgInfo.left, radius), this.getLength(imgInfo.top, radius)]\n this.drawImage(ctx, btnImg, xAxis, yAxis, trueWidth, trueHeight)\n })\n // 绘制按钮文字\n btn.fonts && btn.fonts.forEach(font => {\n let fontColor = font.fontColor || _defaultStyle.fontColor\n let fontWeight = font.fontWeight || _defaultStyle.fontWeight\n let fontSize = this.getLength(font.fontSize || _defaultStyle.fontSize)\n let fontStyle = font.fontStyle || _defaultStyle.fontStyle\n ctx.fillStyle = fontColor\n ctx.font = `${fontWeight} ${fontSize >> 0}px ${fontStyle}`\n String(font.text).split('\\n').forEach((line, lineIndex) => {\n ctx.fillText(line, getFontX(font, line), getFontY(font, radius, lineIndex))\n })\n })\n })\n // 触发绘制后回调\n config.afterDraw?.call(this, ctx)\n }\n\n /**\n * 刻舟求剑\n */\n private carveOnGunwaleOfAMovingBoat (): void {\n const { _defaultConfig, prizeFlag, prizeDeg, rotateDeg } = this\n this.endTime = Date.now()\n const stopDeg = this.stopDeg = rotateDeg\n const speed = _defaultConfig.speed\n const stopRange = (Math.random() * prizeDeg - prizeDeg / 2) * this.getLength(_defaultConfig.stopRange)\n let i = 0, prevSpeed = 0, prevDeg = 0\n while (++i) {\n const endDeg = 360 * i - prizeFlag! * prizeDeg - rotateDeg - _defaultConfig.offsetDegree + stopRange - prizeDeg / 2\n let currSpeed = quad.easeOut(this.FPS, stopDeg, endDeg, _defaultConfig.decelerationTime) - stopDeg\n if (currSpeed > speed) {\n this.endDeg = (speed - prevSpeed > currSpeed - speed) ? endDeg : prevDeg\n break\n }\n prevDeg = endDeg\n prevSpeed = currSpeed\n }\n }\n\n /**\n * 对外暴露: 开始抽奖方法\n */\n public play (): void {\n if (this.step !== 0) return\n // 记录游戏开始时间\n this.startTime = Date.now()\n // 重置中奖索引\n this.prizeFlag = void 0\n // 加速阶段\n this.step = 1\n // 触发回调\n this.config.afterStart?.()\n // 开始游戏\n this.run()\n }\n\n /**\n * 对外暴露: 缓慢停止方法\n * @param index 中奖索引\n */\n public stop (index?: number): void {\n if (this.step === 0 || this.step === 3) return\n // 如果没有传递中奖索引, 则通过range属性计算一个\n if (!index && index !== 0) {\n const rangeArr = this.prizes.map(item => item.range)\n index = computeRange(rangeArr)\n }\n // 如果index是负数则停止游戏, 反之则传递中奖索引\n if (index < 0) {\n this.step = 0\n this.prizeFlag = -1\n } else {\n this.step = 2\n this.prizeFlag = index % this.prizes.length\n }\n }\n\n /**\n * 实际开始执行方法\n * @param num 记录帧动画执行多少次\n */\n private run (num: number = 0): void {\n const { rAF, step, prizeFlag, _defaultConfig } = this\n const { accelerationTime, decelerationTime, speed } = _defaultConfig\n // 游戏结束\n if (step === 0) {\n this.endCallback?.(this.prizes.find((prize, index) => index === prizeFlag) || {})\n return\n }\n // 如果等于 -1 就直接停止游戏\n if (prizeFlag === -1) return\n // 计算结束位置\n if (step === 3 && !this.endDeg) this.carveOnGunwaleOfAMovingBoat()\n // 计算时间间隔\n const startInterval = Date.now() - this.startTime\n const endInterval = Date.now() - this.endTime\n let rotateDeg = this.rotateDeg\n // \n if (step === 1 || startInterval < accelerationTime) { // 加速阶段\n // 记录帧率\n this.FPS = startInterval / num\n const currSpeed = quad.easeIn(startInterval, 0, speed, accelerationTime)\n // 加速到峰值后, 进入匀速阶段\n if (currSpeed === speed) {\n this.step = 2\n }\n rotateDeg = rotateDeg + currSpeed % 360\n } else if (step === 2) { // 匀速阶段\n // 速度保持不变\n rotateDeg = rotateDeg + speed % 360\n // 如果 prizeFlag 有值, 则进入减速阶段\n if (prizeFlag !== void 0 && prizeFlag >= 0) {\n this.step = 3\n // 清空上一次的位置信息\n this.stopDeg = 0\n this.endDeg = 0\n }\n } else if (step === 3) { // 减速阶段\n // 开始缓慢停止\n rotateDeg = quad.easeOut(endInterval, this.stopDeg, this.endDeg, decelerationTime)\n if (endInterval >= decelerationTime) {\n this.step = 0\n }\n } else {\n // 出现异常\n this.stop(-1)\n }\n this.rotateDeg = rotateDeg\n this.draw()\n rAF(this.run.bind(this, num + 1))\n }\n\n /**\n * 换算渲染坐标\n * @param x\n * @param y\n */\n protected conversionAxis (x: number, y: number): [number, number] {\n const { config } = this\n return [x / config.dpr - this.Radius, y / config.dpr - this.Radius]\n }\n}\n","import Lucky from './lucky'\nimport { UserConfigType, ImgType } from '../types/index'\nimport LuckyGridConfig, {\n BlockType,\n PrizeType,\n ButtonType,\n CellFontType,\n CellImgType,\n RowsType,\n ColsType,\n CellType,\n DefaultConfigType,\n DefaultStyleType,\n ActiveStyleType,\n StartCallbackType,\n EndCallbackType,\n} from '../types/grid'\nimport {\n has,\n isExpectType,\n removeEnter,\n computePadding,\n hasBackground,\n computeRange,\n splitText\n} from '../utils/index'\nimport { roundRectByArc, getLinearGradient } from '../utils/math'\nimport { quad } from '../utils/tween'\n\nexport default class LuckyGrid extends Lucky {\n private rows: RowsType = 3\n private cols: ColsType = 3\n private blocks: Array = []\n private prizes: Array = []\n private buttons: Array = []\n private button?: ButtonType\n private defaultConfig: DefaultConfigType = {}\n private defaultStyle: DefaultStyleType = {}\n private activeStyle: ActiveStyleType = {}\n private _defaultConfig: Required = {} as Required\n private _defaultStyle: Required = {} as Required\n private _activeStyle: Required = {} as Required\n private startCallback?: StartCallbackType\n private endCallback?: EndCallbackType\n private cellWidth = 0 // 格子宽度\n private cellHeight = 0 // 格子高度\n private startTime = 0 // 开始时间戳\n private endTime = 0 // 结束时间戳\n private currIndex = 0 // 当前index累加\n private stopIndex = 0 // 刻舟求剑\n private endIndex = 0 // 停止索引\n private demo = false // 是否自动游走\n private timer = 0 // 游走定时器\n private FPS = 16.6 // 屏幕刷新率\n /**\n * 游戏当前的阶段\n * step = 0 时, 游戏尚未开始\n * step = 1 时, 此时处于加速阶段\n * step = 2 时, 此时处于匀速阶段\n * step = 3 时, 此时处于减速阶段\n */\n private step: 0 | 1 | 2 | 3 = 0\n /**\n * 中奖索引\n * prizeFlag = undefined 时, 处于开始抽奖阶段, 正常旋转\n * prizeFlag >= 0 时, 说明stop方法被调用, 并且传入了中奖索引\n * prizeFlag === -1 时, 说明stop方法被调用, 并且传入了负值, 本次抽奖无效\n */\n private prizeFlag: number | undefined = -1\n // 所有格子\n private cells: CellType[] = []\n // 奖品区域几何信息\n private prizeArea: { x: number, y: number, w: number, h: number } | undefined\n // 图片缓存\n private ImageCache = new Map()\n\n /**\n * 九宫格构造器\n * @param config 配置项\n * @param data 抽奖数据\n */\n constructor (config: UserConfigType, data: LuckyGridConfig) {\n super(config, {\n width: data.width,\n height: data.height\n })\n this.initData(data)\n this.initWatch()\n this.initComputed()\n // 创建前回调函数\n config.beforeCreate?.call(this)\n // 首次初始化\n this.init()\n }\n\n protected resize(): void {\n super.resize()\n this.draw()\n this.config.afterResize?.()\n }\n\n protected initLucky (): void {\n this.cellWidth = 0\n this.cellHeight = 0\n this.startTime = 0\n this.endTime = 0\n this.currIndex = 0\n this.stopIndex = 0\n this.endIndex = 0\n this.demo = false\n this.timer = 0\n this.FPS = 16.6\n this.prizeFlag = -1\n this.step = 0\n super.initLucky()\n }\n\n /**\n * 初始化数据\n * @param data\n */\n private initData (data: LuckyGridConfig): void {\n this.$set(this, 'width', data.width)\n this.$set(this, 'height', data.height)\n this.$set(this, 'rows', Number(data.rows) || 3)\n this.$set(this, 'cols', Number(data.cols) || 3)\n this.$set(this, 'blocks', data.blocks || [])\n this.$set(this, 'prizes', data.prizes || [])\n this.$set(this, 'buttons', data.buttons || [])\n // 临时过渡代码, 升级到2.x即可删除\n this.$set(this, 'button', data.button)\n this.$set(this, 'defaultConfig', data.defaultConfig || {})\n this.$set(this, 'defaultStyle', data.defaultStyle || {})\n this.$set(this, 'activeStyle', data.activeStyle || {})\n this.$set(this, 'startCallback', data.start)\n this.$set(this, 'endCallback', data.end)\n }\n\n /**\n * 初始化属性计算\n */\n private initComputed (): void {\n // 默认配置\n this.$computed(this, '_defaultConfig', () => {\n const config = {\n gutter: 5,\n speed: 20,\n accelerationTime: 2500,\n decelerationTime: 2500,\n ...this.defaultConfig\n }\n config.gutter = this.getLength(config.gutter)\n config.speed = config.speed / 40\n return config\n })\n // 默认样式\n this.$computed(this, '_defaultStyle', () => {\n return {\n borderRadius: 20,\n fontColor: '#000',\n fontSize: '18px',\n fontStyle: 'sans-serif',\n fontWeight: '400',\n background: 'rgba(0,0,0,0)',\n shadow: '',\n wordWrap: true,\n lengthLimit: '90%',\n ...this.defaultStyle\n }\n })\n // 中奖样式\n this.$computed(this, '_activeStyle', () => {\n return {\n background: '#ffce98',\n shadow: '',\n ...this.activeStyle\n }\n })\n }\n\n /**\n * 初始化观察者\n */\n private initWatch (): void {\n // 重置宽度\n this.$watch('width', (newVal: string | number) => {\n this.data.width = newVal\n this.resize()\n })\n // 重置高度\n this.$watch('height', (newVal: string | number) => {\n this.data.height = newVal\n this.resize()\n })\n // 监听 blocks 数据的变化\n this.$watch('blocks', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 监听 prizes 数据的变化\n this.$watch('prizes', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 监听 button 数据的变化\n this.$watch('buttons', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n this.$watch('rows', () => this.init())\n this.$watch('cols', () => this.init())\n this.$watch('defaultConfig', () => this.draw(), { deep: true })\n this.$watch('defaultStyle', () => this.draw(), { deep: true })\n this.$watch('activeStyle', () => this.draw(), { deep: true })\n this.$watch('startCallback', () => this.init())\n this.$watch('endCallback', () => this.init())\n }\n\n /**\n * 初始化 canvas 抽奖\n */\n public async init (): Promise {\n this.initLucky()\n const { config } = this\n // 初始化前回调函数\n config.beforeInit?.call(this)\n // 先画一次防止闪烁\n this.draw()\n // 异步加载图片\n await this.initImageCache()\n // 初始化后回调函数\n config.afterInit?.call(this)\n }\n\n private initImageCache (): Promise {\n return new Promise((resolve) => {\n const btnImgs = this.buttons.map(btn => btn.imgs)\n if (this.button) btnImgs.push(this.button.imgs)\n const willUpdateImgs = {\n blocks: this.blocks.map(block => block.imgs),\n prizes: this.prizes.map(prize => prize.imgs),\n buttons: btnImgs,\n }\n ;(<(keyof typeof willUpdateImgs)[]>Object.keys(willUpdateImgs)).forEach(imgName => {\n const willUpdate = willUpdateImgs[imgName]\n // 循环遍历所有图片\n const allPromise: Promise[] = []\n willUpdate && willUpdate.forEach((imgs, cellIndex) => {\n imgs && imgs.forEach((imgInfo, imgIndex) => {\n allPromise.push(this.loadAndCacheImg(imgName, cellIndex, imgIndex))\n })\n })\n Promise.all(allPromise).then(() => {\n this.draw()\n resolve()\n })\n })\n })\n }\n\n /**\n * canvas点击事件\n * @param e 事件参数\n */\n protected handleClick (e: MouseEvent): void {\n const { ctx } = this\n ;[\n ...this.buttons,\n this.button\n ].forEach(btn => {\n if (!btn) return\n const [x, y, width, height] = this.getGeometricProperty([\n btn.x, btn.y, btn.col || 1, btn.row || 1\n ])\n ctx.beginPath()\n ctx.rect(x, y, width, height)\n if (!ctx.isPointInPath(e.offsetX, e.offsetY)) return\n if (this.step !== 0) return\n // 如果btn里有单独的回调方法, 优先触发\n if (typeof btn.callback === 'function') btn.callback.call(this, btn)\n // 最后触发公共回调\n this.startCallback?.(e, btn)\n })\n }\n\n /**\n * 根据索引单独加载指定图片并缓存\n * @param cellName 模块名称\n * @param cellIndex 模块索引\n * @param imgName 模块对应的图片缓存\n * @param imgIndex 图片索引\n */\n private async loadAndCacheImg (\n cellName: 'blocks' | 'prizes' | 'buttons',\n cellIndex: number,\n imgIndex: number\n ): Promise {\n return new Promise((resolve, reject) => {\n let cell: BlockType | PrizeType | ButtonType = this[cellName][cellIndex]\n // 临时过渡代码, 升级到2.x即可删除\n if (cellName === 'buttons' && !this.buttons.length && this.button) {\n cell = this.button\n }\n if (!cell || !cell.imgs) return\n const imgInfo = cell.imgs[imgIndex]\n if (!imgInfo) return\n // 异步加载图片\n const request = [\n this.loadImg(imgInfo.src, imgInfo),\n imgInfo['activeSrc'] && this.loadImg(imgInfo['activeSrc'], imgInfo, '$activeResolve')\n ]\n Promise.all(request).then(async ([defaultImg, activeImg]) => {\n const formatter = imgInfo.formatter\n // 对图片进行处理\n if (typeof formatter === 'function') {\n defaultImg = await Promise.resolve(formatter.call(this, defaultImg))\n if (activeImg) {\n activeImg = await Promise.resolve(formatter.call(this, activeImg))\n }\n }\n this.ImageCache.set(imgInfo['src'], defaultImg)\n activeImg && this.ImageCache.set(imgInfo['activeSrc'], activeImg)\n resolve()\n }).catch(err => {\n console.error(`${cellName}[${cellIndex}].imgs[${imgIndex}] ${err}`)\n reject()\n })\n })\n }\n\n /**\n * 绘制九宫格抽奖\n */\n protected draw (): void {\n const { config, ctx, _defaultConfig, _defaultStyle, _activeStyle } = this\n // 触发绘制前回调\n config.beforeDraw?.call(this, ctx)\n // 清空画布\n ctx.clearRect(0, 0, this.boxWidth, this.boxHeight)\n // 合并奖品和按钮\n this.cells = [\n ...this.prizes,\n ...this.buttons\n ]\n if (this.button) this.cells.push(this.button)\n this.cells.forEach(cell => {\n cell.col = cell.col || 1\n cell.row = cell.row || 1\n })\n // 计算获取奖品区域的几何信息\n this.prizeArea = this.blocks.reduce(({x, y, w, h}, block, blockIndex) => {\n const [paddingTop, paddingBottom, paddingLeft, paddingRight] = computePadding(block, this.getLength.bind(this))\n const r = block.borderRadius ? this.getLength(block.borderRadius) : 0\n // 绘制边框\n const background = block.background\n if (hasBackground(background)) {\n ctx.fillStyle = this.handleBackground(x, y, w, h, background!)\n roundRectByArc(ctx, x, y, w, h, r)\n ctx.fill()\n }\n // 绘制图片\n block.imgs && block.imgs.forEach((imgInfo, imgIndex) => {\n const blockImg = this.ImageCache.get(imgInfo.src)\n if (!blockImg) return\n // 绘制图片\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(blockImg, imgInfo, w, h)\n const [xAxis, yAxis] = [\n this.getOffsetX(trueWidth, w) + this.getLength(imgInfo.left, w),\n this.getLength(imgInfo.top, h)\n ]\n this.drawImage(ctx, blockImg, x + xAxis, y + yAxis, trueWidth, trueHeight)\n })\n return {\n x: x + paddingLeft,\n y: y + paddingTop,\n w: w - paddingLeft - paddingRight,\n h: h - paddingTop - paddingBottom\n }\n }, { x: 0, y: 0, w: this.boxWidth, h: this.boxHeight })\n // 计算单一奖品格子的宽度和高度\n this.cellWidth = (this.prizeArea.w - _defaultConfig.gutter * (this.cols - 1)) / this.cols\n this.cellHeight = (this.prizeArea.h - _defaultConfig.gutter * (this.rows - 1)) / this.rows\n // 绘制所有格子\n this.cells.forEach((cell, cellIndex) => {\n let [x, y, width, height] = this.getGeometricProperty([cell.x, cell.y, cell.col!, cell.row!])\n // 默认不显示中奖标识\n let isActive = false\n // 只要 prizeFlag 不是负数, 就显示中奖标识\n if (this.prizeFlag === void 0 || this.prizeFlag > -1) {\n isActive = cellIndex === this.currIndex % this.prizes.length >> 0\n }\n // 绘制背景色\n const background = isActive ? _activeStyle.background : (cell.background || _defaultStyle.background)\n if (hasBackground(background)) {\n // 处理阴影 (暂时先用any, 这里后续要优化)\n const shadow: any = (\n isActive ? _activeStyle.shadow : (cell.shadow || _defaultStyle.shadow)\n )\n .replace(/px/g, '') // 清空px字符串\n .split(',')[0].split(' ') // 防止有人声明多个阴影, 截取第一个阴影\n .map((n, i) => i < 3 ? Number(n) : n) // 把数组的前三个值*像素比\n // 绘制阴影\n if (shadow.length === 4) {\n ctx.shadowColor = shadow[3]\n ctx.shadowOffsetX = shadow[0] * config.dpr\n ctx.shadowOffsetY = shadow[1] * config.dpr\n ctx.shadowBlur = shadow[2]\n // 修正(格子+阴影)的位置, 这里使用逗号运算符\n shadow[0] > 0 ? (width -= shadow[0]) : (width += shadow[0], x -= shadow[0])\n shadow[1] > 0 ? (height -= shadow[1]) : (height += shadow[1], y -= shadow[1])\n }\n // 绘制背景\n ctx.fillStyle = this.handleBackground(x, y, width, height, background)\n const borderRadius = this.getLength(cell.borderRadius ? cell.borderRadius : _defaultStyle.borderRadius)\n roundRectByArc(ctx, x, y, width, height, borderRadius)\n ctx.fill()\n // 清空阴影\n ctx.shadowColor = 'rgba(0, 0, 0, 0)'\n ctx.shadowOffsetX = 0\n ctx.shadowOffsetY = 0\n ctx.shadowBlur = 0\n }\n // 修正图片缓存\n let cellName = 'prizes'\n if (cellIndex >= this.prizes.length) {\n cellName = 'buttons'\n cellIndex -= this.prizes.length\n }\n // 绘制图片\n cell.imgs && cell.imgs.forEach((imgInfo, imgIndex) => {\n const cellImg = this.ImageCache.get(imgInfo.src)\n const activeImg = this.ImageCache.get(imgInfo['activeSrc'])\n if (!cellImg) return\n const renderImg = (isActive && activeImg) || cellImg\n if (!renderImg) return\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(renderImg, imgInfo, width, height)\n const [xAxis, yAxis] = [\n x + this.getOffsetX(trueWidth, width) + this.getLength(imgInfo.left, width),\n y + this.getLength(imgInfo.top, height)\n ]\n this.drawImage(ctx, renderImg, xAxis, yAxis, trueWidth, trueHeight)\n })\n // 绘制文字\n cell.fonts && cell.fonts.forEach(font => {\n // 字体样式\n const style = isActive && _activeStyle.fontStyle\n ? _activeStyle.fontStyle\n : (font.fontStyle || _defaultStyle.fontStyle)\n // 字体加粗\n const fontWeight = isActive && _activeStyle.fontWeight\n ? _activeStyle.fontWeight\n : (font.fontWeight || _defaultStyle.fontWeight)\n // 字体大小\n const size = isActive && _activeStyle.fontSize\n ? this.getLength(_activeStyle.fontSize)\n : this.getLength(font.fontSize || _defaultStyle.fontSize)\n // 字体行高\n const lineHeight = isActive && _activeStyle.lineHeight\n ? _activeStyle.lineHeight\n : font.lineHeight || _defaultStyle.lineHeight || font.fontSize || _defaultStyle.fontSize\n const wordWrap = has(font, 'wordWrap') ? font.wordWrap : _defaultStyle.wordWrap\n const lengthLimit = font.lengthLimit || _defaultStyle.lengthLimit\n const lineClamp = font.lineClamp || _defaultStyle.lineClamp\n ctx.font = `${fontWeight} ${size >> 0}px ${style}`\n ctx.fillStyle = (isActive && _activeStyle.fontColor) ? _activeStyle.fontColor : (font.fontColor || _defaultStyle.fontColor)\n let lines = [], text = String(font.text)\n // 计算文字换行\n if (wordWrap) {\n // 最大宽度\n let maxWidth = this.getLength(lengthLimit, width)\n lines = splitText(ctx, removeEnter(text), () => maxWidth, lineClamp)\n } else {\n lines = text.split('\\n')\n }\n lines.forEach((line, lineIndex) => {\n ctx.fillText(\n line,\n x + this.getOffsetX(ctx.measureText(line).width, width) + this.getLength(font.left, width),\n y + this.getLength(font.top, height) + (lineIndex + 1) * this.getLength(lineHeight)\n )\n })\n })\n })\n // 触发绘制后回调\n config.afterDraw?.call(this, ctx)\n }\n\n /**\n * 处理背景色\n * @param x\n * @param y\n * @param width\n * @param height\n * @param background\n * @param isActive\n */\n private handleBackground (\n x: number,\n y: number,\n width: number,\n height: number,\n background: string,\n ) {\n const { ctx } = this\n // 处理线性渐变\n if (background.includes('linear-gradient')) {\n background = getLinearGradient(ctx, x, y, width, height, background)\n }\n return background\n }\n\n /**\n * 刻舟求剑\n */\n private carveOnGunwaleOfAMovingBoat (): void {\n const { _defaultConfig, prizeFlag, currIndex } = this\n this.endTime = Date.now()\n const stopIndex = this.stopIndex = currIndex\n const speed = _defaultConfig.speed\n let i = 0, prevSpeed = 0, prevIndex = 0\n while (++i) {\n const endIndex = this.prizes.length * i + prizeFlag! - (stopIndex)\n const currSpeed = quad.easeOut(this.FPS, stopIndex, endIndex, _defaultConfig.decelerationTime) - stopIndex\n if (currSpeed > speed) {\n this.endIndex = (speed - prevSpeed > currSpeed - speed) ? endIndex : prevIndex\n break\n }\n prevIndex = endIndex\n prevSpeed = currSpeed\n }\n }\n\n /**\n * 对外暴露: 开始抽奖方法\n */\n public play (): void {\n if (this.step !== 0) return\n // 记录游戏开始的时间\n this.startTime = Date.now()\n // 重置中奖索引\n this.prizeFlag = void 0\n // 开始加速\n this.step = 1\n // 触发回调\n this.config.afterStart?.()\n // 开始运行\n this.run()\n }\n\n /**\n * 对外暴露: 缓慢停止方法\n * @param index 中奖索引\n */\n public stop (index?: number): void {\n if (this.step === 0 || this.step === 3) return\n // 如果没有传递中奖索引, 则通过range属性计算一个\n if (!index && index !== 0) {\n const rangeArr = this.prizes.map(item => item.range)\n index = computeRange(rangeArr)\n }\n // 如果index是负数则停止游戏, 反之则传递中奖索引\n if (index < 0) {\n this.step = 0\n this.prizeFlag = -1\n } else {\n this.step = 2\n this.prizeFlag = index % this.prizes.length\n }\n }\n\n /**\n * 实际开始执行方法\n * @param num 记录帧动画执行多少次\n */\n private run (num: number = 0): void {\n const { rAF, step, prizes, prizeFlag, _defaultConfig } = this\n const { accelerationTime, decelerationTime, speed } = _defaultConfig\n // 结束游戏\n if (step === 0) {\n this.endCallback?.(this.prizes.find((prize, index) => index === prizeFlag) || {})\n return\n }\n // 如果等于 -1 就直接停止游戏\n if (prizeFlag === -1) return\n // 计算结束位置\n if (step === 3 && !this.endIndex) this.carveOnGunwaleOfAMovingBoat()\n // 计算时间间隔\n const startInterval = Date.now() - this.startTime\n const endInterval = Date.now() - this.endTime\n let currIndex = this.currIndex\n // \n if (step === 1 || startInterval < accelerationTime) { // 加速阶段\n // 记录帧率\n this.FPS = startInterval / num\n const currSpeed = quad.easeIn(startInterval, 0.1, speed - 0.1, accelerationTime)\n // 加速到峰值后, 进入匀速阶段\n if (currSpeed === speed) {\n this.step = 2\n }\n currIndex = currIndex + currSpeed % prizes.length\n } else if (step === 2) { // 匀速阶段\n // 速度保持不变\n currIndex = currIndex + speed % prizes.length\n // 如果 prizeFlag 有值, 则进入减速阶段\n if (prizeFlag !== void 0 && prizeFlag >= 0) {\n this.step = 3\n // 清空上一次的位置信息\n this.stopIndex = 0\n this.endIndex = 0\n }\n } else if (step === 3) { // 减速阶段\n // 开始缓慢停止\n currIndex = quad.easeOut(endInterval, this.stopIndex, this.endIndex, decelerationTime)\n if (endInterval >= decelerationTime) {\n this.step = 0\n }\n } else {\n // 出现异常\n this.stop(-1)\n }\n this.currIndex = currIndex\n this.draw()\n rAF(this.run.bind(this, num + 1))\n }\n\n /**\n * 计算奖品格子的几何属性\n * @param { array } [...矩阵坐标, col, row]\n * @return { array } [...真实坐标, width, height]\n */\n private getGeometricProperty ([x, y, col = 1, row = 1]: number[]) {\n const { cellWidth, cellHeight } = this\n const gutter = this._defaultConfig.gutter\n let res = [\n this.prizeArea!.x + (cellWidth + gutter) * x,\n this.prizeArea!.y + (cellHeight + gutter) * y\n ]\n col && row && res.push(\n cellWidth * col + gutter * (col - 1),\n cellHeight * row + gutter * (row - 1),\n )\n return res\n }\n\n /**\n * 换算渲染坐标\n * @param x\n * @param y\n */\n protected conversionAxis (x: number, y: number): [number, number] {\n const { config } = this\n return [x / config.dpr, y / config.dpr]\n }\n}\n","import Lucky from './lucky'\nimport { UserConfigType, ImgType, ImgItemType, Tuple } from '../types/index'\nimport SlotMachineConfig, {\n BlockType,\n PrizeType,\n SlotType,\n DefaultConfigType,\n DefaultStyleType,\n EndCallbackType,\n} from '../types/slot'\nimport {\n get, has,\n isExpectType,\n removeEnter,\n computePadding,\n hasBackground,\n computeRange,\n splitText,\n getSortedArrayByIndex\n} from '../utils/index'\nimport { roundRectByArc } from '../utils/math'\nimport { quad } from '../utils/tween'\n\nexport default class SlotMachine extends Lucky {\n // 背景\n private blocks: Array = []\n // 奖品列表\n private prizes: Array = []\n // 插槽列表\n private slots: Array = []\n // 默认配置\n private defaultConfig: DefaultConfigType = {}\n private _defaultConfig: Required = {} as Required\n // 默认样式\n private defaultStyle: DefaultStyleType = {}\n private _defaultStyle: Required = {} as Required\n private endCallback: EndCallbackType = () => {}\n // 离屏canvas\n private _offscreenCanvas?: HTMLCanvasElement\n private cellWidth = 0 // 格子宽度\n private cellHeight = 0 // 格子高度\n private cellAndSpacing = 0 // 格子+间距\n private widthAndSpacing = 0 // 格子宽度+列间距\n private heightAndSpacing = 0 // 格子高度+行间距\n private FPS = 16.6 // 屏幕刷新率\n private scroll: number[] = [] // 滚动的长度\n private stopScroll: number[] = [] // 刻舟求剑\n private endScroll: number[] = [] // 最终停止的长度\n private startTime = 0 // 开始游戏的时间\n private endTime = 0 // 开始停止的时间\n /**\n * 游戏当前的阶段\n * step = 0 时, 游戏尚未开始\n * step = 1 时, 此时处于加速阶段\n * step = 2 时, 此时处于匀速阶段\n * step = 3 时, 此时处于减速阶段\n */\n private step: 0 | 1 | 2 | 3 = 0\n /**\n * 中奖索引\n * prizeFlag = undefined 时, 处于开始抽奖阶段, 正常旋转\n * prizeFlag >= 0 时, 说明stop方法被调用, 并且传入了中奖索引\n * prizeFlag === -1 时, 说明stop方法被调用, 并且传入了负值, 本次抽奖无效\n */\n private prizeFlag: number[] | undefined = void 0\n // 奖品区域几何信息\n private prizeArea?: { x: number, y: number, w: number, h: number }\n // 图片缓存\n private ImageCache = new Map()\n\n /**\n * 老虎机构造器\n * @param config 配置项\n * @param data 抽奖数据\n */\n constructor (config: UserConfigType, data: SlotMachineConfig) {\n super(config, {\n width: data.width,\n height: data.height\n })\n this.initData(data)\n this.initWatch()\n this.initComputed()\n // 创建前回调函数\n config.beforeCreate?.call(this)\n // 首次初始化\n this.init()\n }\n\n protected resize(): void {\n super.resize()\n this.draw()\n this.config.afterResize?.()\n }\n\n protected initLucky (): void {\n this.cellWidth = 0\n this.cellHeight = 0\n this.cellAndSpacing = 0\n this.widthAndSpacing = 0\n this.heightAndSpacing = 0\n this.FPS = 16.6\n this.scroll = []\n this.stopScroll = []\n this.endScroll = []\n this.startTime = 0\n this.endTime = 0\n this.prizeFlag = void 0\n this.step = 0\n super.initLucky()\n }\n\n /**\n * 初始化数据\n * @param data\n */\n private initData (data: SlotMachineConfig): void {\n this.$set(this, 'width', data.width)\n this.$set(this, 'height', data.height)\n this.$set(this, 'blocks', data.blocks || [])\n this.$set(this, 'prizes', data.prizes || [])\n this.$set(this, 'slots', data.slots || [])\n this.$set(this, 'defaultConfig', data.defaultConfig || {})\n this.$set(this, 'defaultStyle', data.defaultStyle || {})\n this.$set(this, 'endCallback', data.end)\n }\n\n /**\n * 初始化属性计算\n */\n private initComputed (): void {\n // 默认配置\n this.$computed(this, '_defaultConfig', () => {\n const config = {\n mode: 'vertical',\n rowSpacing: 0,\n colSpacing: 5,\n speed: 20,\n direction: 1,\n accelerationTime: 2500,\n decelerationTime: 2500,\n ...this.defaultConfig\n }\n config.rowSpacing = this.getLength(config.rowSpacing)\n config.colSpacing = this.getLength(config.colSpacing)\n return config\n })\n // 默认样式\n this.$computed(this, '_defaultStyle', () => {\n return {\n borderRadius: 0,\n fontColor: '#000',\n fontSize: '18px',\n fontStyle: 'sans-serif',\n fontWeight: '400',\n background: 'rgba(0,0,0,0)',\n wordWrap: true,\n lengthLimit: '90%',\n ...this.defaultStyle\n }\n })\n }\n\n /**\n * 初始化观察者\n */\n private initWatch (): void {\n // 重置宽度\n this.$watch('width', (newVal: string | number) => {\n this.data.width = newVal\n this.resize()\n })\n // 重置高度\n this.$watch('height', (newVal: string | number) => {\n this.data.height = newVal\n this.resize()\n })\n // 监听 blocks 数据的变化\n this.$watch('blocks', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 监听 prizes 数据的变化\n this.$watch('prizes', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 监听 prizes 数据的变化\n this.$watch('slots', (newData: Array) => {\n this.drawOffscreenCanvas()\n this.draw()\n }, { deep: true })\n this.$watch('defaultConfig', () => this.draw(), { deep: true })\n this.$watch('defaultStyle', () => this.draw(), { deep: true })\n this.$watch('endCallback', () => this.init())\n }\n\n /**\n * 初始化 canvas 抽奖\n */\n public async init (): Promise {\n this.initLucky()\n const { config } = this\n // 初始化前回调函数\n config.beforeInit?.call(this)\n // 先绘制一次\n this.drawOffscreenCanvas()\n this.draw()\n // 异步加载图片\n await this.initImageCache()\n // 初始化后回调函数\n config.afterInit?.call(this)\n }\n\n private initImageCache (): Promise {\n return new Promise((resolve) => {\n const willUpdateImgs = {\n blocks: this.blocks.map(block => block.imgs),\n prizes: this.prizes.map(prize => prize.imgs),\n }\n ;(<(keyof typeof willUpdateImgs)[]>Object.keys(willUpdateImgs)).forEach(imgName => {\n const willUpdate = willUpdateImgs[imgName]\n // 循环遍历所有图片\n const allPromise: Promise[] = []\n willUpdate && willUpdate.forEach((imgs, cellIndex) => {\n imgs && imgs.forEach((imgInfo, imgIndex) => {\n allPromise.push(this.loadAndCacheImg(imgName, cellIndex, imgIndex))\n })\n })\n Promise.all(allPromise).then(() => {\n this.drawOffscreenCanvas()\n this.draw()\n resolve()\n })\n })\n })\n }\n\n /**\n * 根据索引单独加载指定图片并缓存\n * @param cellName 模块名称\n * @param cellIndex 模块索引\n * @param imgName 模块对应的图片缓存\n * @param imgIndex 图片索引\n */\n private async loadAndCacheImg (\n cellName: 'blocks' | 'prizes',\n cellIndex: number,\n imgIndex: number\n ): Promise {\n return new Promise((resolve, reject) => {\n let cell: BlockType | PrizeType = this[cellName][cellIndex]\n if (!cell || !cell.imgs) return\n const imgInfo = cell.imgs[imgIndex]\n if (!imgInfo) return\n // 异步加载图片\n this.loadImg(imgInfo.src, imgInfo).then(async currImg => {\n if (typeof imgInfo.formatter === 'function') {\n currImg = await Promise.resolve(imgInfo.formatter.call(this, currImg))\n }\n this.ImageCache.set(imgInfo['src'], currImg)\n resolve()\n }).catch(err => {\n console.error(`${cellName}[${cellIndex}].imgs[${imgIndex}] ${err}`)\n reject()\n })\n })\n }\n\n /**\n * 绘制离屏canvas\n */\n protected drawOffscreenCanvas (): void {\n const { _defaultConfig, _defaultStyle } = this\n const { w, h } = this.drawBlocks()!\n // 计算单一奖品格子的宽度和高度\n const prizesLen = this.prizes.length\n const { cellWidth, cellHeight, widthAndSpacing, heightAndSpacing } = this.displacementWidthOrHeight()\n const defaultOrder = new Array(prizesLen).fill(void 0).map((v, i) => i)\n let maxOrderLen = 0, maxOffWidth = 0, maxOffHeight = 0\n this.slots.forEach((slot, slotIndex) => {\n // 初始化 scroll 的值\n if (this.scroll[slotIndex] === void 0) this.scroll[slotIndex] = 0\n // 如果没有order属性, 就填充prizes\n slot.order = slot.order || defaultOrder\n // 计算最大值\n const currLen = slot.order.length\n maxOrderLen = Math.max(maxOrderLen, currLen)\n maxOffWidth = Math.max(maxOffWidth, w + widthAndSpacing * currLen)\n maxOffHeight = Math.max(maxOffHeight, h + heightAndSpacing * currLen)\n })\n // 创建一个离屏Canvas来存储画布的内容\n const { _offscreenCanvas, _ctx } = this.getOffscreenCanvas(maxOffWidth, maxOffHeight)!\n this._offscreenCanvas = _offscreenCanvas\n // 绘制插槽\n this.slots.forEach((slot, slotIndex) => {\n const cellX = cellWidth * slotIndex\n const cellY = cellHeight * slotIndex\n let lengthOfCopy = 0\n // 绘制奖品\n const newPrizes = getSortedArrayByIndex(this.prizes, slot.order!)\n // 如果没有奖品则打断逻辑\n if (!newPrizes.length) return\n newPrizes.forEach((cell, cellIndex) => {\n if (!cell) return\n const orderIndex = slot.order![cellIndex]\n const prizesX = widthAndSpacing * cellIndex + _defaultConfig.colSpacing / 2\n const prizesY = heightAndSpacing * cellIndex + _defaultConfig.rowSpacing / 2\n const [_x, _y, spacing] = this.displacement(\n [cellX, prizesY, heightAndSpacing],\n [prizesX, cellY, widthAndSpacing]\n )\n lengthOfCopy += spacing\n // 绘制背景\n const background = cell.background || _defaultStyle.background\n if (hasBackground(background)) {\n const borderRadius = this.getLength(has(cell, 'borderRadius') ? cell.borderRadius : _defaultStyle.borderRadius)\n roundRectByArc(_ctx, _x, _y, cellWidth, cellWidth, borderRadius)\n _ctx.fillStyle = background\n _ctx.fill()\n }\n // 绘制图片\n cell.imgs && cell.imgs.forEach((imgInfo, imgIndex) => {\n const cellImg = this.ImageCache.get(imgInfo.src)\n if (!cellImg) return\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(cellImg, imgInfo, cellWidth, cellHeight)\n const [xAxis, yAxis] = [\n _x + this.getOffsetX(trueWidth, cellWidth) + this.getLength(imgInfo.left, cellWidth),\n _y + this.getLength(imgInfo.top, cellHeight)\n ]\n this.drawImage(_ctx, cellImg, xAxis, yAxis, trueWidth, trueHeight)\n })\n // 绘制文字\n cell.fonts && cell.fonts.forEach(font => {\n // 字体样式\n const style = font.fontStyle || _defaultStyle.fontStyle\n // 字体加粗\n const fontWeight = font.fontWeight || _defaultStyle.fontWeight\n // 字体大小\n const size = this.getLength(font.fontSize || _defaultStyle.fontSize)\n // 字体行高\n const lineHeight = font.lineHeight || _defaultStyle.lineHeight || font.fontSize || _defaultStyle.fontSize\n const wordWrap = has(font, 'wordWrap') ? font.wordWrap : _defaultStyle.wordWrap\n const lengthLimit = font.lengthLimit || _defaultStyle.lengthLimit\n const lineClamp = font.lineClamp || _defaultStyle.lineClamp\n _ctx.font = `${fontWeight} ${size >> 0}px ${style}`\n _ctx.fillStyle = font.fontColor || _defaultStyle.fontColor\n let lines = [], text = String(font.text)\n // 计算文字换行\n if (wordWrap) {\n // 最大宽度\n let maxWidth = this.getLength(lengthLimit, cellWidth)\n lines = splitText(_ctx, removeEnter(text), () => maxWidth, lineClamp)\n } else {\n lines = text.split('\\n')\n }\n lines.forEach((line, lineIndex) => {\n _ctx.fillText(\n line,\n _x + this.getOffsetX(_ctx.measureText(line).width, cellWidth) + this.getLength(font.left, cellWidth),\n _y + this.getLength(font.top, cellHeight) + (lineIndex + 1) * this.getLength(lineHeight)\n )\n })\n })\n })\n const [_x, _y, _w, _h] = this.displacement(\n [cellX, 0, cellWidth, lengthOfCopy],\n [0, cellY, lengthOfCopy, cellHeight]\n )\n let drawLen = lengthOfCopy\n while (drawLen < maxOffHeight + lengthOfCopy) {\n const [drawX, drawY] = this.displacement([_x, drawLen], [drawLen, _y])\n this.drawImage(\n _ctx, _offscreenCanvas,\n _x, _y, _w, _h,\n drawX, drawY, _w, _h\n )\n drawLen += lengthOfCopy\n }\n })\n }\n\n /**\n * 绘制背景区域\n */\n protected drawBlocks (): SlotMachine['prizeArea'] {\n const { config, ctx, _defaultConfig, _defaultStyle } = this\n // 绘制背景区域, 并计算奖品区域\n return this.prizeArea = this.blocks.reduce(({x, y, w, h}, block, blockIndex) => {\n const [paddingTop, paddingBottom, paddingLeft, paddingRight] = computePadding(block, this.getLength.bind(this))\n const r = block.borderRadius ? this.getLength(block.borderRadius) : 0\n // 绘制边框\n const background = block.background || _defaultStyle.background\n if (hasBackground(background)) {\n roundRectByArc(ctx, x, y, w, h, r)\n ctx.fillStyle = background\n ctx.fill()\n }\n // 绘制图片\n block.imgs && block.imgs.forEach((imgInfo, imgIndex) => {\n const blockImg = this.ImageCache.get(imgInfo.src)\n if (!blockImg) return\n // 绘制图片\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(blockImg, imgInfo, w, h)\n const [xAxis, yAxis] = [this.getOffsetX(trueWidth, w) + this.getLength(imgInfo.left, w), this.getLength(imgInfo.top, h)]\n this.drawImage(ctx, blockImg, x + xAxis, y + yAxis, trueWidth, trueHeight)\n })\n return {\n x: x + paddingLeft,\n y: y + paddingTop,\n w: w - paddingLeft - paddingRight,\n h: h - paddingTop - paddingBottom\n }\n }, { x: 0, y: 0, w: this.boxWidth, h: this.boxHeight })\n }\n\n /**\n * 绘制老虎机抽奖\n */\n protected draw (): void {\n const { config, ctx, _defaultConfig, _defaultStyle } = this\n // 触发绘制前回调\n config.beforeDraw?.call(this, ctx)\n // 清空画布\n ctx.clearRect(0, 0, this.boxWidth, this.boxHeight)\n // 绘制背景\n const { x, y, w, h } = this.drawBlocks()!\n // 绘制插槽\n if (!this._offscreenCanvas) return\n const { cellWidth, cellHeight, cellAndSpacing, widthAndSpacing, heightAndSpacing } = this\n this.slots.forEach((slot, slotIndex) => {\n // 绘制临界点\n const _p = cellAndSpacing * slot.order!.length\n // 调整奖品垂直居中\n const start = this.displacement(-(h - heightAndSpacing) / 2, -(w - widthAndSpacing) / 2)\n let scroll = this.scroll[slotIndex] + start\n // scroll 会无限累加 1 / -1\n if (scroll < 0) {\n scroll = scroll % _p + _p\n }\n if (scroll > _p) {\n scroll = scroll % _p\n }\n const [sx, sy, sw, sh] = this.displacement(\n [cellWidth * slotIndex, scroll, cellWidth, h],\n [scroll, cellHeight * slotIndex, w, cellHeight]\n )\n const [dx, dy, dw, dh] = this.displacement(\n [x + widthAndSpacing * slotIndex, y, cellWidth, h],\n [x, y + heightAndSpacing * slotIndex, w, cellHeight]\n )\n this.drawImage(ctx, this._offscreenCanvas!, sx, sy, sw, sh, dx, dy, dw, dh)\n })\n }\n\n /**\n * 刻舟求剑\n */\n private carveOnGunwaleOfAMovingBoat (): void {\n const { _defaultConfig, prizeFlag, cellAndSpacing } = this\n // 记录开始停止的时间戳\n this.endTime = Date.now()\n this.slots.forEach((slot, slotIndex) => {\n const order = slot.order!\n if (!order.length) return\n const speed = slot.speed || _defaultConfig.speed\n const direction = slot.direction || _defaultConfig.direction\n const orderIndex = order.findIndex(prizeIndex => prizeIndex === prizeFlag![slotIndex])\n const _p = cellAndSpacing * order.length\n const stopScroll = this.stopScroll[slotIndex] = this.scroll[slotIndex]\n let i = 0\n while (++i) {\n const endScroll = cellAndSpacing * orderIndex + (_p * i * direction) - stopScroll\n const currSpeed = quad.easeOut(this.FPS, stopScroll, endScroll, _defaultConfig.decelerationTime) - stopScroll\n if (Math.abs(currSpeed) > speed) {\n this.endScroll[slotIndex] = endScroll\n break\n }\n }\n })\n }\n\n /**\n * 对外暴露: 开始抽奖方法\n */\n public play (): void {\n if (this.step !== 0) return\n // 记录开始游戏的时间\n this.startTime = Date.now()\n // 清空中奖索引\n this.prizeFlag = void 0\n // 开始加速\n this.step = 1\n // 触发回调\n this.config.afterStart?.()\n // 开始渲染\n this.run()\n }\n\n public stop (index: number | number[]): void {\n if (this.step === 0 || this.step === 3) return\n // 设置中奖索引\n if (typeof index === 'number') {\n this.prizeFlag = new Array(this.slots.length).fill(index)\n } else if (isExpectType(index, 'array')) {\n if (index.length === this.slots.length) {\n this.prizeFlag = index\n } else {\n this.stop(-1)\n return console.error(`stop([${index}]) 参数长度的不正确`)\n }\n } else {\n this.stop(-1)\n return console.error(`stop() 无法识别的参数类型 ${typeof index}`)\n }\n // 如果包含负数则停止游戏, 反之则继续游戏\n if (this.prizeFlag?.includes(-1)) {\n this.prizeFlag = []\n // 停止游戏\n this.step = 0\n } else {\n // 进入匀速\n this.step = 2\n }\n }\n\n /**\n * 让游戏动起来\n * @param num 记录帧动画执行多少次\n */\n private run (num: number = 0): void {\n const { rAF, step, prizeFlag, _defaultConfig, cellAndSpacing, slots } = this\n const { accelerationTime, decelerationTime } = _defaultConfig\n // 游戏结束\n if (this.step === 0 && prizeFlag?.length === slots.length) {\n let flag = prizeFlag[0]\n for (let i = 0; i < slots.length; i++) {\n const slot = slots[i], currFlag = prizeFlag[i]\n if (!slot.order?.includes(currFlag) || flag !== currFlag) {\n flag = -1\n break\n }\n }\n this.endCallback?.(this.prizes.find((prize, index) => index === flag) || void 0)\n return\n }\n // 如果长度为 0 就直接停止游戏\n if (prizeFlag !== void 0 && !prizeFlag.length) return\n // 计算最终停止的位置\n if (this.step === 3 && !this.endScroll.length) this.carveOnGunwaleOfAMovingBoat()\n // 计算时间间隔\n const startInterval = Date.now() - this.startTime\n const endInterval = Date.now() - this.endTime\n // 分别计算对应插槽的加速度\n slots.forEach((slot, slotIndex) => {\n const order = slot.order\n if (!order || !order.length) return\n const _p = cellAndSpacing * order.length\n const speed = Math.abs(slot.speed || _defaultConfig.speed)\n const direction = slot.direction || _defaultConfig.direction\n let scroll = 0, prevScroll = this.scroll[slotIndex]\n if (step === 1 || startInterval < accelerationTime) { // 加速阶段\n // 记录帧率\n this.FPS = startInterval / num\n const currSpeed = quad.easeIn(startInterval, 0, speed, accelerationTime)\n // 加速到最大速度后, 即可进入匀速阶段\n if (currSpeed === speed) {\n this.step = 2\n }\n scroll = (prevScroll + (currSpeed * direction)) % _p\n } else if (step === 2) { // 匀速阶段\n // 速度保持不变\n scroll = (prevScroll + (speed * direction)) % _p\n // 如果有 prizeFlag 有值, 则进入减速阶段\n if (prizeFlag?.length === slots.length) {\n this.step = 3\n // 清空上一轮的位置信息\n this.stopScroll = []\n this.endScroll = []\n }\n } else if (step === 3 && endInterval) { // 减速阶段\n // 开始缓慢停止\n const stopScroll = this.stopScroll[slotIndex]\n const endScroll = this.endScroll[slotIndex]\n scroll = quad.easeOut(endInterval, stopScroll, endScroll, decelerationTime)\n if (endInterval >= decelerationTime) {\n this.step = 0\n }\n }\n this.scroll[slotIndex] = scroll\n })\n this.draw()\n rAF(this.run.bind(this, num + 1))\n }\n\n // 根据mode置换数值\n private displacement (a: T, b: T): T {\n return this._defaultConfig.mode === 'horizontal' ? b : a\n }\n\n // 根据mode计算宽高\n private displacementWidthOrHeight () {\n const mode = this._defaultConfig.mode\n const slotsLen = this.slots.length\n const { colSpacing, rowSpacing } = this._defaultConfig\n const { x, y, w, h } = this.prizeArea || this.drawBlocks()!\n let cellWidth = 0, cellHeight = 0, widthAndSpacing = 0, heightAndSpacing = 0\n if (mode === 'horizontal') {\n cellHeight = this.cellHeight = (h - rowSpacing * (slotsLen - 1)) / slotsLen\n cellWidth = this.cellWidth = cellHeight\n } else {\n cellWidth = this.cellWidth = (w - colSpacing * (slotsLen - 1)) / slotsLen\n cellHeight = this.cellHeight = cellWidth\n }\n widthAndSpacing = this.widthAndSpacing = this.cellWidth + colSpacing\n heightAndSpacing = this.heightAndSpacing = this.cellHeight + rowSpacing\n if (mode === 'horizontal') {\n this.cellAndSpacing = widthAndSpacing\n } else {\n this.cellAndSpacing = heightAndSpacing\n }\n return {\n cellWidth,\n cellHeight,\n widthAndSpacing,\n heightAndSpacing,\n }\n }\n}\n","import { ImgType } from '../types/index'\nimport { roundRectByArc } from './math'\n\n/**\n * 根据路径获取图片对象\n * @param { string } src 图片路径\n * @returns { Promise } 图片标签\n */\nexport const getImage = (src: string): Promise => {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => resolve(img)\n img.onerror = err => reject(err)\n img.src = src\n })\n}\n\n/**\n * 切割圆角\n * @param img 将要裁剪的图片对象\n * @param radius 裁剪的圆角半径\n * @returns 返回一个离屏 canvas 用于渲染\n */\nexport const cutRound = (img: ImgType, radius: number): ImgType => {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')!\n const { width, height } = img\n canvas.width = width\n canvas.height = height\n roundRectByArc(ctx, 0, 0, width, height, radius)\n ctx.clip()\n ctx.drawImage(img, 0, 0, width, height)\n return canvas\n}\n\n/**\n * 透明度\n * @param img 将要处理的图片对象\n * @param opacity 透明度\n * @returns 返回一个离屏 canvas 用于渲染\n */\nexport const opacity = (\n img: ImgType,\n opacity: number\n): ImgType => {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')!\n const { width, height } = img\n canvas.width = width\n canvas.height = height\n // 绘制图片, 部分浏览器不支持 filter 属性, 需要处理兼容\n if (typeof ctx.filter === 'string') {\n ctx.filter = `opacity(${opacity * 100}%)`\n ctx.drawImage(img, 0, 0, width, height)\n } else {\n ctx.drawImage(img, 0, 0, width, height)\n const imageData = ctx.getImageData(0, 0, width, height)\n const { data } = imageData\n const len = data.length\n for (let i = 0; i < len; i += 4) {\n const alpha = data[i + 3]\n if (alpha !== 0) data[i + 3] = alpha * opacity\n }\n ctx.putImageData(imageData, 0, 0)\n }\n return canvas\n}\n\n/**\n * 权重矩阵\n * @param radius 模糊半径\n * @param sigma \n * @returns 返回一个权重和为1的矩阵\n */\nconst getMatrix = (radius: number, sigma?: number): number[] => {\n sigma = sigma || radius / 3\n const r = Math.ceil(radius)\n const sigma_2 = sigma * sigma\n const sigma2_2 = 2 * sigma_2\n const denominator = 1 / (2 * Math.PI * sigma_2)\n const matrix = []\n let total = 0\n // 计算权重矩阵\n for (let x = -r; x <= r; x++) {\n for (let y = -r; y <= r; y++) {\n // 套用二维高斯函数得到每个点的权重\n const res = denominator * Math.exp(-(x * x + y * y) / sigma2_2)\n matrix.push(res)\n total += res\n }\n }\n // 让矩阵中所有权重的和等于1\n for (let i = 0; i < matrix.length; i++) {\n matrix[i] /= total\n }\n return matrix\n}\n\n/**\n * 高斯模糊\n * @param img 将要处理的图片对象\n * @param radius 模糊半径\n * @returns 返回一个离屏 canvas 用于渲染\n */\nexport const blur = (\n img: ImgType,\n radius: number\n): ImgType => {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')!\n const { width, height } = img\n // 设置图片宽高\n canvas.width = width\n canvas.height = height\n ctx.drawImage(img, 0, 0, width, height)\n const ImageData = ctx.getImageData(0, 0, width, height)\n const { data } = ImageData\n const matrix = getMatrix(radius)\n const r = Math.ceil(radius)\n const w = width * 4\n const cols = r * 2 + 1\n const len = data.length, matrixLen = matrix.length\n for (let i = 0; i < len; i += 4) {\n // 处理\n }\n console.log(ImageData)\n ctx.putImageData(ImageData, 0, 0)\n return canvas\n}\n\nexport const getBase64Image = () => {\n\n}\n"],"names":["Array","prototype","includes","Object","defineProperty","value","valueToFind","fromIndex","this","TypeError","o","len","length","x","y","n","k","Math","max","abs","isNaN","String","search","start","indexOf","find","predicate","thisArg","arguments","kValue","call","isExpectType","param","_i","types","some","type","toString","slice","toLowerCase","has","data","key","hasOwnProperty","removeEnter","str","filter","s","join","hasBackground","color","toLocaleLowerCase","trim","test","alpha","exec","num","NaN","Number","computePadding","block","getLength","padding","split","map","paddingTop","paddingBottom","paddingLeft","paddingRight","res","computeRange","rangeArr","ascendingArr","sum","reduce","prev","curr","push","random","findIndex","splitText","ctx","text","getWidth","lineClamp","Infinity","lines","EndWidth","measureText","width","i","currWidth","maxWidth","subs","Dep","sub","forEach","update","hasProto","def","obj","val","enumerable","writable","configurable","oldArrayProto","newArrayProto","create","method","args","apply","luckyOb","walk","dep","notify","isArray","getOwnPropertyNames","Observer","keys","defineReactive","observe","property","getOwnPropertyDescriptor","getter","get","setter","set","childOb","target","addSub","newVal","uid","$lucky","expr","cb","options","id","deep","path","segments","segment","parsePath","Watcher","dfs","traverse","oldVal","config","el","nodeType","divElement","flag","document","querySelector","canvasElement","createElement","appendChild","getContext","setAttribute","name","addEventListener","e","_this","handleClick","initWindowFunction","console","error","window","fn","wait","timeId","setTimeout","clearTimeout","throttle","resize","MutationObserver","documentElement","attributes","Lucky","beforeResize","setHTMLFontSize","setDpr","resetWidthAndHeight","zoomCanvas","boxWidth","boxHeight","htmlFontSize","getComputedStyle","fontSize","_a","height","clearRect","dpr","devicePixelRatio","offsetWidth","offsetHeight","style","overflow","_b","transform","scale","rAF","requestAnimationFrame","callback","setInterval","clearInterval","timeout_1","src","info","resolveName","Promise","resolve","reject","imgObj_1","Image","onload","onerror","imgObj","drawImg","rectInfo","_c","miniProgramOffCtx","isWeb","temp","getImageData","putImageData","index","drawImage","err","imgInfo","maxHeight","trueWidth","trueHeight","denominator","replace","unit","handleCssUnit","px","rem","vw","innerWidth","otherHandleCssUnit","maxLength","changeUnits","_offscreenCanvas","_ctx","handler","watchOpt","watcher","immediate","getAngle","deg","PI","fanShapedByArc","minRadius","maxRadius","end","gutter","beginPath","r","maxGutter","maxStart","maxEnd","arc","lineTo","sin","cos","toFixed","closePath","roundRectByArc","w","h","min","moveTo","quad","t","b","c","d","_super","Map","initData","initWatch","initComputed","beforeCreate","init","__extends","LuckyWheel","Radius","translate","draw","afterResize","prizeRadius","prizeDeg","prizeAng","rotateDeg","maxBtnRadius","startTime","endTime","stopDeg","endDeg","FPS","prizeFlag","step","initLucky","$set","blocks","prizes","buttons","defaultConfig","defaultStyle","$computed","offsetDegree","speed","speedFunction","accelerationTime","decelerationTime","stopRange","fontColor","fontStyle","fontWeight","background","wordWrap","lengthLimit","$watch","newData","initImageCache","beforeInit","afterInit","willUpdateImgs","imgs","prize","btn","imgName","willUpdate","allPromise","cellIndex","imgIndex","loadAndCacheImg","all","then","isPointInPath","offsetX","offsetY","startCallback","cellName","cell","loadImg","currImg","formatter","ImageCache","catch","radius","blockIndex","fillStyle","fill","blockImg","computedWidthAndHeight","getOffsetX","left","top","xAxis","yAxis","save","rotate","restore","_defaultConfig","_defaultStyle","beforeDraw","drawBlock","shortSide","getFontX","font","line","getFontY","lineIndex","lineHeight","prizeIndex","currMiddleDeg","prizeHeight","prizeImg","fonts","tan","fillText","btnIndex","pointer","btnImg","afterDraw","Date","now","prevSpeed","prevDeg","currSpeed","afterStart","run","item","range","carveOnGunwaleOfAMovingBoat","startInterval","endInterval","stop","bind","endCallback","LuckyGrid","cellWidth","cellHeight","currIndex","stopIndex","endIndex","demo","timer","rows","cols","button","activeStyle","borderRadius","shadow","btnImgs","__spreadArray","getGeometricProperty","col","row","rect","request","defaultImg","activeImg","_activeStyle","cells","prizeArea","handleBackground","isActive","shadowColor","shadowOffsetX","shadowOffsetY","shadowBlur","cellImg","renderImg","size","maxWidth_1","context","shift","direction","getLenOfTanDeg","gradient","createLinearGradient","addColorStop","getLinearGradient","prevIndex","SlotMachine","cellAndSpacing","widthAndSpacing","heightAndSpacing","scroll","stopScroll","endScroll","slots","mode","rowSpacing","colSpacing","drawOffscreenCanvas","drawBlocks","prizesLen","displacementWidthOrHeight","defaultOrder","v","maxOffWidth","maxOffHeight","slot","slotIndex","order","currLen","_d","getOffscreenCanvas","cellX","cellY","lengthOfCopy","newPrizes","arr","getSortedArrayByIndex","prizesX","prizesY","displacement","_x","_y","spacing","_w","_h","drawLen","drawX","drawY","_p","sx","sy","sw","sh","dx","dy","dw","dh","orderIndex","prevScroll","flag_1","currFlag","a","slotsLen","cutRound","img","canvas","clip","opacity","imageData"],"mappings":"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"} \ No newline at end of file diff --git a/components/lucky-canvas/dist/index.umd.js b/components/lucky-canvas/dist/index.umd.js new file mode 100644 index 0000000..1da74a3 --- /dev/null +++ b/components/lucky-canvas/dist/index.umd.js @@ -0,0 +1,15 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).LuckyCanvas={})}(this,(function(t){"use strict"; +/*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */var e=function(t,i){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i])},e(t,i)};function i(t,i){if("function"!=typeof i&&null!==i)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");function n(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}var n=function(){return n=Object.assign||function(t){for(var e,i=1,n=arguments.length;i0&&r[r.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!r||o[1]>r[0]&&o[1]>>0;if(0===n)return!1;var r,o,a=0|e,s=Math.max(a>=0?a:n-Math.abs(a),0);for(;sthis.length)&&-1!==this.indexOf(t,e)}),Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null==this)throw new TypeError('"this" is null or not defined');var e=Object(this),i=e.length>>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var n=arguments[1],r=0;r0){var n=t+i;return e.push(n),n}return e.push(NaN),t}),0),n=Math.random()*i;return e.findIndex((function(t){return n<=t}))},d=function(t,e,i,n){void 0===n&&(n=1/0),n<=0&&(n=1/0);for(var r="",o=[],a=t.measureText("...").width,s=0;sc&&(o.push(r.slice(0,-1)),r=e[s]),n===o.length)return o[o.length-1]+="...",o}return r&&o.push(r),o.length||o.push(e),o},p="1.7.26",g=function(){function t(){this.subs=[]}return t.prototype.addSub=function(t){this.subs.includes(t)||this.subs.push(t)},t.prototype.notify=function(){this.subs.forEach((function(t){t.update()}))},t}(),v="__proto__"in{};function m(t,e,i,n){Object.defineProperty(t,e,{value:i,enumerable:!!n,writable:!0,configurable:!0})}var w=Array.prototype,y=Object.create(w);["push","pop","shift","unshift","sort","splice","reverse"].forEach((function(t){y[t]=function(){for(var e=[],i=0;i '"+e.src+"' 不能为空或不合法"),"WEB"!==n.config.flag)return e[i]=r,void(e.$reject=o);var a=new Image;a.crossorigin="anonymous",a.onload=function(){return r(a)},a.onerror=function(){return o("=> '"+e.src+"' 图片加载失败")},a.src=t}))},t.prototype.drawImage=function(t,e){for(var i,n,r,o=[],s=2;sh/2&&(s=h/2),t.beginPath(),t.moveTo(n+s,r),t.lineTo(n+s,r),t.lineTo(n+o-s,r),t.arc(n+o-s,r+s,s,-c/2,0),t.lineTo(n+o,r+a-s),t.arc(n+o-s,r+a-s,s,0,c/2),t.lineTo(n+s,r+a),t.arc(n+s,r+a-s,s,c/2,c),t.lineTo(n,r+s),t.arc(n+s,r+s,s,c,-c/2),t.closePath()},T=function(t,e,i,n){return t>=n&&(t=n),i*(t/=n)*t+e},_=function(t,e,i,n){return t>=n&&(t=n),-i*(t/=n)*(t-2)+e},W=function(t){function e(e,i){var n,r=t.call(this,e,{width:i.width,height:i.height})||this;return r.blocks=[],r.prizes=[],r.buttons=[],r.defaultConfig={},r.defaultStyle={},r._defaultConfig={},r._defaultStyle={},r.Radius=0,r.prizeRadius=0,r.prizeDeg=0,r.prizeAng=0,r.rotateDeg=0,r.maxBtnRadius=0,r.startTime=0,r.endTime=0,r.stopDeg=0,r.endDeg=0,r.FPS=16.6,r.step=0,r.ImageCache=new Map,r.initData(i),r.initWatch(),r.initComputed(),null===(n=e.beforeCreate)||void 0===n||n.call(r),r.init(),r}return i(e,t),e.prototype.resize=function(){var e,i;t.prototype.resize.call(this),this.Radius=Math.min(this.boxWidth,this.boxHeight)/2,this.ctx.translate(this.Radius,this.Radius),this.draw(),null===(i=(e=this.config).afterResize)||void 0===i||i.call(e)},e.prototype.initLucky=function(){this.Radius=0,this.prizeRadius=0,this.prizeDeg=0,this.prizeAng=0,this.rotateDeg=0,this.maxBtnRadius=0,this.startTime=0,this.endTime=0,this.stopDeg=0,this.endDeg=0,this.FPS=16.6,this.prizeFlag=-1,this.step=0,t.prototype.initLucky.call(this)},e.prototype.initData=function(t){this.$set(this,"width",t.width),this.$set(this,"height",t.height),this.$set(this,"blocks",t.blocks||[]),this.$set(this,"prizes",t.prizes||[]),this.$set(this,"buttons",t.buttons||[]),this.$set(this,"defaultConfig",t.defaultConfig||{}),this.$set(this,"defaultStyle",t.defaultStyle||{}),this.$set(this,"startCallback",t.start),this.$set(this,"endCallback",t.end)},e.prototype.initComputed=function(){var t=this;this.$computed(this,"_defaultConfig",(function(){return n({gutter:"0px",offsetDegree:0,speed:20,speedFunction:"quad",accelerationTime:2500,decelerationTime:2500,stopRange:0},t.defaultConfig)})),this.$computed(this,"_defaultStyle",(function(){return n({fontSize:"18px",fontColor:"#000",fontStyle:"sans-serif",fontWeight:"400",background:"rgba(0,0,0,0)",wordWrap:!0,lengthLimit:"90%"},t.defaultStyle)}))},e.prototype.initWatch=function(){var t=this;this.$watch("width",(function(e){t.data.width=e,t.resize()})),this.$watch("height",(function(e){t.data.height=e,t.resize()})),this.$watch("blocks",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("prizes",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("buttons",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("defaultConfig",(function(){return t.draw()}),{deep:!0}),this.$watch("defaultStyle",(function(){return t.draw()}),{deep:!0}),this.$watch("startCallback",(function(){return t.init()})),this.$watch("endCallback",(function(){return t.init()}))},e.prototype.init=function(){var t,e;return r(this,void 0,void 0,(function(){var i;return o(this,(function(n){switch(n.label){case 0:return this.initLucky(),i=this.config,null===(t=i.beforeInit)||void 0===t||t.call(this),this.draw(),this.draw(),[4,this.initImageCache()];case 1:return n.sent(),null===(e=i.afterInit)||void 0===e||e.call(this),[2]}}))}))},e.prototype.initImageCache=function(){var t=this;return new Promise((function(e){var i={blocks:t.blocks.map((function(t){return t.imgs})),prizes:t.prizes.map((function(t){return t.imgs})),buttons:t.buttons.map((function(t){return t.imgs}))};Object.keys(i).forEach((function(n){var r=i[n],o=[];r&&r.forEach((function(e,i){e&&e.forEach((function(e,r){o.push(t.loadAndCacheImg(n,i,r))}))})),Promise.all(o).then((function(){t.draw(),e()}))}))}))},e.prototype.handleClick=function(t){var e,i=this.ctx;i.beginPath(),i.arc(0,0,this.maxBtnRadius,0,2*Math.PI,!1),i.isPointInPath(t.offsetX,t.offsetY)&&0===this.step&&(null===(e=this.startCallback)||void 0===e||e.call(this,t))},e.prototype.loadAndCacheImg=function(t,e,i){return r(this,void 0,void 0,(function(){var n=this;return o(this,(function(a){return[2,new Promise((function(a,s){var h=n[t][e];if(h&&h.imgs){var c=h.imgs[i];c&&n.loadImg(c.src,c).then((function(t){return r(n,void 0,void 0,(function(){return o(this,(function(e){switch(e.label){case 0:return"function"!=typeof c.formatter?[3,2]:[4,Promise.resolve(c.formatter.call(this,t))];case 1:t=e.sent(),e.label=2;case 2:return this.ImageCache.set(c.src,t),a(),[2]}}))}))})).catch((function(n){console.error(t+"["+e+"].imgs["+i+"] "+n),s()}))}}))]}))}))},e.prototype.drawBlock=function(t,e,i){var n=this,r=this.ctx;l(e.background)&&(r.beginPath(),r.fillStyle=e.background,r.arc(0,0,t,0,2*Math.PI,!1),r.fill()),e.imgs&&e.imgs.forEach((function(e,i){var o=n.ImageCache.get(e.src);if(o){var a=n.computedWidthAndHeight(o,e,2*t,2*t),s=a[0],h=a[1],c=[n.getOffsetX(s)+n.getLength(e.left,2*t),n.getLength(e.top,2*t)-t],l=c[0],u=c[1];r.save(),e.rotate&&r.rotate(I(n.rotateDeg)),n.drawImage(r,o,l,u,s,h),r.restore()}}))},e.prototype.draw=function(){var t,e,i=this,n=this,r=n.config,o=n.ctx,a=n._defaultConfig,s=n._defaultStyle;null===(t=r.beforeDraw)||void 0===t||t.call(this,o),o.clearRect(-this.Radius,-this.Radius,2*this.Radius,2*this.Radius),this.prizeRadius=this.blocks.reduce((function(t,e,n){return i.drawBlock(t,e,n),t-i.getLength(e.padding&&e.padding.split(" ")[0])}),this.Radius),this.prizeDeg=360/this.prizes.length,this.prizeAng=I(this.prizeDeg);var u=this.prizeRadius*Math.sin(this.prizeAng/2)*2,f=I(this.rotateDeg-90+this.prizeDeg/2+a.offsetDegree),p=function(t,e){return i.getOffsetX(o.measureText(e).width)+i.getLength(t.left,u)},g=function(t,e,n){var r=t.lineHeight||s.lineHeight||t.fontSize||s.fontSize;return i.getLength(t.top,e)+(n+1)*i.getLength(r)};o.save(),this.prizes.forEach((function(t,e){var n=f+e*i.prizeAng,r=i.prizeRadius-i.maxBtnRadius,v=t.background||s.background;l(v)&&(o.fillStyle=v,A(o,i.maxBtnRadius,i.prizeRadius,n-i.prizeAng/2,n+i.prizeAng/2,i.getLength(a.gutter)),o.fill());var m=Math.cos(n)*i.prizeRadius,w=Math.sin(n)*i.prizeRadius;o.translate(m,w),o.rotate(n+I(90)),t.imgs&&t.imgs.forEach((function(t,e){var n=i.ImageCache.get(t.src);if(n){var a=i.computedWidthAndHeight(n,t,i.prizeAng*i.prizeRadius,r),s=a[0],h=a[1],c=[i.getOffsetX(s)+i.getLength(t.left,u),i.getLength(t.top,r)],l=c[0],f=c[1];i.drawImage(o,n,l,f,s,h)}})),t.fonts&&t.fonts.forEach((function(t){var e=t.fontColor||s.fontColor,n=t.fontWeight||s.fontWeight,l=i.getLength(t.fontSize||s.fontSize),u=t.fontStyle||s.fontStyle,f=h(t,"wordWrap")?t.wordWrap:s.wordWrap,v=t.lengthLimit||s.lengthLimit,m=t.lineClamp||s.lineClamp;o.fillStyle=e,o.font=n+" "+(l>>0)+"px "+u;var w=String(t.text);(f?d(o,c(w),(function(e){var n=2*((i.prizeRadius-g(t,r,e.length))*Math.tan(i.prizeAng/2))-i.getLength(a.gutter);return i.getLength(v,n)}),m):w.split("\n")).filter((function(t){return!!t})).forEach((function(e,i){o.fillText(e,p(t,e),g(t,r,i))}))})),o.rotate(I(360)-n-I(90)),o.translate(-m,-w)})),o.restore(),this.buttons.forEach((function(t,e){var n=i.getLength(t.radius,i.prizeRadius);i.maxBtnRadius=Math.max(i.maxBtnRadius,n),l(t.background)&&(o.beginPath(),o.fillStyle=t.background,o.arc(0,0,n,0,2*Math.PI,!1),o.fill()),t.pointer&&l(t.background)&&(o.beginPath(),o.fillStyle=t.background,o.moveTo(-n,0),o.lineTo(n,0),o.lineTo(0,2*-n),o.closePath(),o.fill()),t.imgs&&t.imgs.forEach((function(t,e){var r=i.ImageCache.get(t.src);if(r){var a=i.computedWidthAndHeight(r,t,2*n,2*n),s=a[0],h=a[1],c=[i.getOffsetX(s)+i.getLength(t.left,n),i.getLength(t.top,n)],l=c[0],u=c[1];i.drawImage(o,r,l,u,s,h)}})),t.fonts&&t.fonts.forEach((function(t){var e=t.fontColor||s.fontColor,r=t.fontWeight||s.fontWeight,a=i.getLength(t.fontSize||s.fontSize),h=t.fontStyle||s.fontStyle;o.fillStyle=e,o.font=r+" "+(a>>0)+"px "+h,String(t.text).split("\n").forEach((function(e,i){o.fillText(e,p(t,e),g(t,n,i))}))}))})),null===(e=r.afterDraw)||void 0===e||e.call(this,o)},e.prototype.carveOnGunwaleOfAMovingBoat=function(){var t=this,e=t._defaultConfig,i=t.prizeFlag,n=t.prizeDeg,r=t.rotateDeg;this.endTime=Date.now();for(var o=this.stopDeg=r,a=e.speed,s=(Math.random()*n-n/2)*this.getLength(e.stopRange),h=0,c=0,l=0;++h;){var u=360*h-i*n-r-e.offsetDegree+s-n/2,f=_(this.FPS,o,u,e.decelerationTime)-o;if(f>a){this.endDeg=a-c>f-a?u:l;break}l=u,c=f}},e.prototype.play=function(){var t,e;0===this.step&&(this.startTime=Date.now(),this.prizeFlag=void 0,this.step=1,null===(e=(t=this.config).afterStart)||void 0===e||e.call(t),this.run())},e.prototype.stop=function(t){if(0!==this.step&&3!==this.step){if(!t&&0!==t){var e=this.prizes.map((function(t){return t.range}));t=f(e)}t<0?(this.step=0,this.prizeFlag=-1):(this.step=2,this.prizeFlag=t%this.prizes.length)}},e.prototype.run=function(t){var e;void 0===t&&(t=0);var i=this,n=i.rAF,r=i.step,o=i.prizeFlag,a=i._defaultConfig,s=a.accelerationTime,h=a.decelerationTime,c=a.speed;if(0!==r){if(-1!==o){3!==r||this.endDeg||this.carveOnGunwaleOfAMovingBoat();var l=Date.now()-this.startTime,u=Date.now()-this.endTime,f=this.rotateDeg;if(1===r||l=0&&(this.step=3,this.stopDeg=0,this.endDeg=0)):3===r?(f=_(u,this.stopDeg,this.endDeg,h),u>=h&&(this.step=0)):this.stop(-1);this.rotateDeg=f,this.draw(),n(this.run.bind(this,t+1))}}else null===(e=this.endCallback)||void 0===e||e.call(this,this.prizes.find((function(t,e){return e===o}))||{})},e.prototype.conversionAxis=function(t,e){var i=this.config;return[t/i.dpr-this.Radius,e/i.dpr-this.Radius]},e}(k),$=function(t){function e(e,i){var n,r=t.call(this,e,{width:i.width,height:i.height})||this;return r.rows=3,r.cols=3,r.blocks=[],r.prizes=[],r.buttons=[],r.defaultConfig={},r.defaultStyle={},r.activeStyle={},r._defaultConfig={},r._defaultStyle={},r._activeStyle={},r.cellWidth=0,r.cellHeight=0,r.startTime=0,r.endTime=0,r.currIndex=0,r.stopIndex=0,r.endIndex=0,r.demo=!1,r.timer=0,r.FPS=16.6,r.step=0,r.prizeFlag=-1,r.cells=[],r.ImageCache=new Map,r.initData(i),r.initWatch(),r.initComputed(),null===(n=e.beforeCreate)||void 0===n||n.call(r),r.init(),r}return i(e,t),e.prototype.resize=function(){var e,i;t.prototype.resize.call(this),this.draw(),null===(i=(e=this.config).afterResize)||void 0===i||i.call(e)},e.prototype.initLucky=function(){this.cellWidth=0,this.cellHeight=0,this.startTime=0,this.endTime=0,this.currIndex=0,this.stopIndex=0,this.endIndex=0,this.demo=!1,this.timer=0,this.FPS=16.6,this.prizeFlag=-1,this.step=0,t.prototype.initLucky.call(this)},e.prototype.initData=function(t){this.$set(this,"width",t.width),this.$set(this,"height",t.height),this.$set(this,"rows",Number(t.rows)||3),this.$set(this,"cols",Number(t.cols)||3),this.$set(this,"blocks",t.blocks||[]),this.$set(this,"prizes",t.prizes||[]),this.$set(this,"buttons",t.buttons||[]),this.$set(this,"button",t.button),this.$set(this,"defaultConfig",t.defaultConfig||{}),this.$set(this,"defaultStyle",t.defaultStyle||{}),this.$set(this,"activeStyle",t.activeStyle||{}),this.$set(this,"startCallback",t.start),this.$set(this,"endCallback",t.end)},e.prototype.initComputed=function(){var t=this;this.$computed(this,"_defaultConfig",(function(){var e=n({gutter:5,speed:20,accelerationTime:2500,decelerationTime:2500},t.defaultConfig);return e.gutter=t.getLength(e.gutter),e.speed=e.speed/40,e})),this.$computed(this,"_defaultStyle",(function(){return n({borderRadius:20,fontColor:"#000",fontSize:"18px",fontStyle:"sans-serif",fontWeight:"400",background:"rgba(0,0,0,0)",shadow:"",wordWrap:!0,lengthLimit:"90%"},t.defaultStyle)})),this.$computed(this,"_activeStyle",(function(){return n({background:"#ffce98",shadow:""},t.activeStyle)}))},e.prototype.initWatch=function(){var t=this;this.$watch("width",(function(e){t.data.width=e,t.resize()})),this.$watch("height",(function(e){t.data.height=e,t.resize()})),this.$watch("blocks",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("prizes",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("buttons",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("rows",(function(){return t.init()})),this.$watch("cols",(function(){return t.init()})),this.$watch("defaultConfig",(function(){return t.draw()}),{deep:!0}),this.$watch("defaultStyle",(function(){return t.draw()}),{deep:!0}),this.$watch("activeStyle",(function(){return t.draw()}),{deep:!0}),this.$watch("startCallback",(function(){return t.init()})),this.$watch("endCallback",(function(){return t.init()}))},e.prototype.init=function(){var t,e;return r(this,void 0,void 0,(function(){var i;return o(this,(function(n){switch(n.label){case 0:return this.initLucky(),i=this.config,null===(t=i.beforeInit)||void 0===t||t.call(this),this.draw(),[4,this.initImageCache()];case 1:return n.sent(),null===(e=i.afterInit)||void 0===e||e.call(this),[2]}}))}))},e.prototype.initImageCache=function(){var t=this;return new Promise((function(e){var i=t.buttons.map((function(t){return t.imgs}));t.button&&i.push(t.button.imgs);var n={blocks:t.blocks.map((function(t){return t.imgs})),prizes:t.prizes.map((function(t){return t.imgs})),buttons:i};Object.keys(n).forEach((function(i){var r=n[i],o=[];r&&r.forEach((function(e,n){e&&e.forEach((function(e,r){o.push(t.loadAndCacheImg(i,n,r))}))})),Promise.all(o).then((function(){t.draw(),e()}))}))}))},e.prototype.handleClick=function(t){var e=this,i=this.ctx;a(a([],this.buttons),[this.button]).forEach((function(n){var r;if(n){var o=e.getGeometricProperty([n.x,n.y,n.col||1,n.row||1]),a=o[0],s=o[1],h=o[2],c=o[3];i.beginPath(),i.rect(a,s,h,c),i.isPointInPath(t.offsetX,t.offsetY)&&0===e.step&&("function"==typeof n.callback&&n.callback.call(e,n),null===(r=e.startCallback)||void 0===r||r.call(e,t,n))}}))},e.prototype.loadAndCacheImg=function(t,e,i){return r(this,void 0,void 0,(function(){var n=this;return o(this,(function(a){return[2,new Promise((function(a,s){var h=n[t][e];if("buttons"===t&&!n.buttons.length&&n.button&&(h=n.button),h&&h.imgs){var c=h.imgs[i];if(c){var l=[n.loadImg(c.src,c),c.activeSrc&&n.loadImg(c.activeSrc,c,"$activeResolve")];Promise.all(l).then((function(t){var e=t[0],i=t[1];return r(n,void 0,void 0,(function(){var t;return o(this,(function(n){switch(n.label){case 0:return"function"!=typeof(t=c.formatter)?[3,3]:[4,Promise.resolve(t.call(this,e))];case 1:return e=n.sent(),i?[4,Promise.resolve(t.call(this,i))]:[3,3];case 2:i=n.sent(),n.label=3;case 3:return this.ImageCache.set(c.src,e),i&&this.ImageCache.set(c.activeSrc,i),a(),[2]}}))}))})).catch((function(n){console.error(t+"["+e+"].imgs["+i+"] "+n),s()}))}}}))]}))}))},e.prototype.draw=function(){var t,e,i=this,n=this,r=n.config,o=n.ctx,s=n._defaultConfig,f=n._defaultStyle,p=n._activeStyle;null===(t=r.beforeDraw)||void 0===t||t.call(this,o),o.clearRect(0,0,this.boxWidth,this.boxHeight),this.cells=a(a([],this.prizes),this.buttons),this.button&&this.cells.push(this.button),this.cells.forEach((function(t){t.col=t.col||1,t.row=t.row||1})),this.prizeArea=this.blocks.reduce((function(t,e,n){var r=t.x,a=t.y,s=t.w,h=t.h,c=u(e,i.getLength.bind(i)),f=c[0],d=c[1],p=c[2],g=c[3],v=e.borderRadius?i.getLength(e.borderRadius):0,m=e.background;return l(m)&&(o.fillStyle=i.handleBackground(r,a,s,h,m),L(o,r,a,s,h,v),o.fill()),e.imgs&&e.imgs.forEach((function(t,e){var n=i.ImageCache.get(t.src);if(n){var c=i.computedWidthAndHeight(n,t,s,h),l=c[0],u=c[1],f=[i.getOffsetX(l,s)+i.getLength(t.left,s),i.getLength(t.top,h)],d=f[0],p=f[1];i.drawImage(o,n,r+d,a+p,l,u)}})),{x:r+p,y:a+f,w:s-p-g,h:h-f-d}}),{x:0,y:0,w:this.boxWidth,h:this.boxHeight}),this.cellWidth=(this.prizeArea.w-s.gutter*(this.cols-1))/this.cols,this.cellHeight=(this.prizeArea.h-s.gutter*(this.rows-1))/this.rows,this.cells.forEach((function(t,e){var n=i.getGeometricProperty([t.x,t.y,t.col,t.row]),a=n[0],s=n[1],u=n[2],g=n[3],v=!1;(void 0===i.prizeFlag||i.prizeFlag>-1)&&(v=e===i.currIndex%i.prizes.length>>0);var m=v?p.background:t.background||f.background;if(l(m)){var w=(v?p.shadow:t.shadow||f.shadow).replace(/px/g,"").split(",")[0].split(" ").map((function(t,e){return e<3?Number(t):t}));4===w.length&&(o.shadowColor=w[3],o.shadowOffsetX=w[0]*r.dpr,o.shadowOffsetY=w[1]*r.dpr,o.shadowBlur=w[2],w[0]>0?u-=w[0]:(u+=w[0],a-=w[0]),w[1]>0?g-=w[1]:(g+=w[1],s-=w[1])),o.fillStyle=i.handleBackground(a,s,u,g,m);var y=i.getLength(t.borderRadius?t.borderRadius:f.borderRadius);L(o,a,s,u,g,y),o.fill(),o.shadowColor="rgba(0, 0, 0, 0)",o.shadowOffsetX=0,o.shadowOffsetY=0,o.shadowBlur=0}e>=i.prizes.length&&(e-=i.prizes.length),t.imgs&&t.imgs.forEach((function(t,e){var n=i.ImageCache.get(t.src),r=i.ImageCache.get(t.activeSrc);if(n){var h=v&&r||n;if(h){var c=i.computedWidthAndHeight(h,t,u,g),l=c[0],f=c[1],d=[a+i.getOffsetX(l,u)+i.getLength(t.left,u),s+i.getLength(t.top,g)],p=d[0],m=d[1];i.drawImage(o,h,p,m,l,f)}}})),t.fonts&&t.fonts.forEach((function(t){var e=v&&p.fontStyle?p.fontStyle:t.fontStyle||f.fontStyle,n=v&&p.fontWeight?p.fontWeight:t.fontWeight||f.fontWeight,r=v&&p.fontSize?i.getLength(p.fontSize):i.getLength(t.fontSize||f.fontSize),l=v&&p.lineHeight?p.lineHeight:t.lineHeight||f.lineHeight||t.fontSize||f.fontSize,m=h(t,"wordWrap")?t.wordWrap:f.wordWrap,w=t.lengthLimit||f.lengthLimit,y=t.lineClamp||f.lineClamp;o.font=n+" "+(r>>0)+"px "+e,o.fillStyle=v&&p.fontColor?p.fontColor:t.fontColor||f.fontColor;var b=[],S=String(t.text);if(m){var C=i.getLength(w,u);b=d(o,c(S),(function(){return C}),y)}else b=S.split("\n");b.forEach((function(e,n){o.fillText(e,a+i.getOffsetX(o.measureText(e).width,u)+i.getLength(t.left,u),s+i.getLength(t.top,g)+(n+1)*i.getLength(l))}))}))})),null===(e=r.afterDraw)||void 0===e||e.call(this,o)},e.prototype.handleBackground=function(t,e,i,n,r){var o=this.ctx;return r.includes("linear-gradient")&&(r=function(t,e,i,n,r,o){var a=/linear-gradient\((.+)\)/.exec(o)[1].split(",").map((function(t){return t.trim()})),s=a.shift(),h=[0,0,0,0];if(s.includes("deg")){var c=function(t){return Math.tan(t/180*Math.PI)};(s=s.slice(0,-3)%360)>=0&&s<45?h=[e,i+r,e+n,i+r-n*c(s-0)]:s>=45&&s<90?h=[e,i+r,e+n-r*c(s-45),i]:s>=90&&s<135?h=[e+n,i+r,e+n-r*c(s-90),i]:s>=135&&s<180?h=[e+n,i+r,e,i+n*c(s-135)]:s>=180&&s<225?h=[e+n,i,e,i+n*c(s-180)]:s>=225&&s<270?h=[e+n,i,e+r*c(s-225),i+r]:s>=270&&s<315?h=[e,i,e+r*c(s-270),i+r]:s>=315&&s<360&&(h=[e,i,e+n,i+r-n*c(s-315)])}else s.includes("top")?h=[e,i+r,e,i]:s.includes("bottom")?h=[e,i,e,i+r]:s.includes("left")?h=[e+n,i,e,i]:s.includes("right")&&(h=[e,i,e+n,i]);var l=t.createLinearGradient.apply(t,h.map((function(t){return t>>0})));return a.reduce((function(t,e,i){var n=e.split(" ");return 1===n.length?t.addColorStop(i,n[0]):2===n.length&&t.addColorStop.apply(t,n),t}),l)}(o,t,e,i,n,r)),r},e.prototype.carveOnGunwaleOfAMovingBoat=function(){var t=this,e=t._defaultConfig,i=t.prizeFlag,n=t.currIndex;this.endTime=Date.now();for(var r=this.stopIndex=n,o=e.speed,a=0,s=0,h=0;++a;){var c=this.prizes.length*a+i-r,l=_(this.FPS,r,c,e.decelerationTime)-r;if(l>o){this.endIndex=o-s>l-o?c:h;break}h=c,s=l}},e.prototype.play=function(){var t,e;0===this.step&&(this.startTime=Date.now(),this.prizeFlag=void 0,this.step=1,null===(e=(t=this.config).afterStart)||void 0===e||e.call(t),this.run())},e.prototype.stop=function(t){if(0!==this.step&&3!==this.step){if(!t&&0!==t){var e=this.prizes.map((function(t){return t.range}));t=f(e)}t<0?(this.step=0,this.prizeFlag=-1):(this.step=2,this.prizeFlag=t%this.prizes.length)}},e.prototype.run=function(t){var e;void 0===t&&(t=0);var i=this,n=i.rAF,r=i.step,o=i.prizes,a=i.prizeFlag,s=i._defaultConfig,h=s.accelerationTime,c=s.decelerationTime,l=s.speed;if(0!==r){if(-1!==a){3!==r||this.endIndex||this.carveOnGunwaleOfAMovingBoat();var u=Date.now()-this.startTime,f=Date.now()-this.endTime,d=this.currIndex;if(1===r||u=0&&(this.step=3,this.stopIndex=0,this.endIndex=0)):3===r?(d=_(f,this.stopIndex,this.endIndex,c),f>=c&&(this.step=0)):this.stop(-1);this.currIndex=d,this.draw(),n(this.run.bind(this,t+1))}}else null===(e=this.endCallback)||void 0===e||e.call(this,this.prizes.find((function(t,e){return e===a}))||{})},e.prototype.getGeometricProperty=function(t){var e=t[0],i=t[1],n=t[2],r=void 0===n?1:n,o=t[3],a=void 0===o?1:o,s=this.cellWidth,h=this.cellHeight,c=this._defaultConfig.gutter,l=[this.prizeArea.x+(s+c)*e,this.prizeArea.y+(h+c)*i];return r&&a&&l.push(s*r+c*(r-1),h*a+c*(a-1)),l},e.prototype.conversionAxis=function(t,e){var i=this.config;return[t/i.dpr,e/i.dpr]},e}(k),E=function(t){function e(e,i){var n,r=t.call(this,e,{width:i.width,height:i.height})||this;return r.blocks=[],r.prizes=[],r.slots=[],r.defaultConfig={},r._defaultConfig={},r.defaultStyle={},r._defaultStyle={},r.endCallback=function(){},r.cellWidth=0,r.cellHeight=0,r.cellAndSpacing=0,r.widthAndSpacing=0,r.heightAndSpacing=0,r.FPS=16.6,r.scroll=[],r.stopScroll=[],r.endScroll=[],r.startTime=0,r.endTime=0,r.step=0,r.prizeFlag=void 0,r.ImageCache=new Map,r.initData(i),r.initWatch(),r.initComputed(),null===(n=e.beforeCreate)||void 0===n||n.call(r),r.init(),r}return i(e,t),e.prototype.resize=function(){var e,i;t.prototype.resize.call(this),this.draw(),null===(i=(e=this.config).afterResize)||void 0===i||i.call(e)},e.prototype.initLucky=function(){this.cellWidth=0,this.cellHeight=0,this.cellAndSpacing=0,this.widthAndSpacing=0,this.heightAndSpacing=0,this.FPS=16.6,this.scroll=[],this.stopScroll=[],this.endScroll=[],this.startTime=0,this.endTime=0,this.prizeFlag=void 0,this.step=0,t.prototype.initLucky.call(this)},e.prototype.initData=function(t){this.$set(this,"width",t.width),this.$set(this,"height",t.height),this.$set(this,"blocks",t.blocks||[]),this.$set(this,"prizes",t.prizes||[]),this.$set(this,"slots",t.slots||[]),this.$set(this,"defaultConfig",t.defaultConfig||{}),this.$set(this,"defaultStyle",t.defaultStyle||{}),this.$set(this,"endCallback",t.end)},e.prototype.initComputed=function(){var t=this;this.$computed(this,"_defaultConfig",(function(){var e=n({mode:"vertical",rowSpacing:0,colSpacing:5,speed:20,direction:1,accelerationTime:2500,decelerationTime:2500},t.defaultConfig);return e.rowSpacing=t.getLength(e.rowSpacing),e.colSpacing=t.getLength(e.colSpacing),e})),this.$computed(this,"_defaultStyle",(function(){return n({borderRadius:0,fontColor:"#000",fontSize:"18px",fontStyle:"sans-serif",fontWeight:"400",background:"rgba(0,0,0,0)",wordWrap:!0,lengthLimit:"90%"},t.defaultStyle)}))},e.prototype.initWatch=function(){var t=this;this.$watch("width",(function(e){t.data.width=e,t.resize()})),this.$watch("height",(function(e){t.data.height=e,t.resize()})),this.$watch("blocks",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("prizes",(function(e){t.initImageCache()}),{deep:!0}),this.$watch("slots",(function(e){t.drawOffscreenCanvas(),t.draw()}),{deep:!0}),this.$watch("defaultConfig",(function(){return t.draw()}),{deep:!0}),this.$watch("defaultStyle",(function(){return t.draw()}),{deep:!0}),this.$watch("endCallback",(function(){return t.init()}))},e.prototype.init=function(){var t,e;return r(this,void 0,void 0,(function(){var i;return o(this,(function(n){switch(n.label){case 0:return this.initLucky(),i=this.config,null===(t=i.beforeInit)||void 0===t||t.call(this),this.drawOffscreenCanvas(),this.draw(),[4,this.initImageCache()];case 1:return n.sent(),null===(e=i.afterInit)||void 0===e||e.call(this),[2]}}))}))},e.prototype.initImageCache=function(){var t=this;return new Promise((function(e){var i={blocks:t.blocks.map((function(t){return t.imgs})),prizes:t.prizes.map((function(t){return t.imgs}))};Object.keys(i).forEach((function(n){var r=i[n],o=[];r&&r.forEach((function(e,i){e&&e.forEach((function(e,r){o.push(t.loadAndCacheImg(n,i,r))}))})),Promise.all(o).then((function(){t.drawOffscreenCanvas(),t.draw(),e()}))}))}))},e.prototype.loadAndCacheImg=function(t,e,i){return r(this,void 0,void 0,(function(){var n=this;return o(this,(function(a){return[2,new Promise((function(a,s){var h=n[t][e];if(h&&h.imgs){var c=h.imgs[i];c&&n.loadImg(c.src,c).then((function(t){return r(n,void 0,void 0,(function(){return o(this,(function(e){switch(e.label){case 0:return"function"!=typeof c.formatter?[3,2]:[4,Promise.resolve(c.formatter.call(this,t))];case 1:t=e.sent(),e.label=2;case 2:return this.ImageCache.set(c.src,t),a(),[2]}}))}))})).catch((function(n){console.error(t+"["+e+"].imgs["+i+"] "+n),s()}))}}))]}))}))},e.prototype.drawOffscreenCanvas=function(){var t=this,e=this._defaultConfig,i=this._defaultStyle,n=this.drawBlocks(),r=n.w,o=n.h,a=this.prizes.length,s=this.displacementWidthOrHeight(),u=s.cellWidth,f=s.cellHeight,p=s.widthAndSpacing,g=s.heightAndSpacing,v=new Array(a).fill(void 0).map((function(t,e){return e})),m=0,w=0;this.slots.forEach((function(e,i){void 0===t.scroll[i]&&(t.scroll[i]=0),e.order=e.order||v;var n=e.order.length;m=Math.max(m,r+p*n),w=Math.max(w,o+g*n)}));var y=this.getOffscreenCanvas(m,w),b=y._offscreenCanvas,S=y._ctx;this._offscreenCanvas=b,this.slots.forEach((function(n,r){var o=u*r,a=f*r,s=0,v=function(t,e){for(var i={},n=[],r=0;r>0)+"px "+n,S.fillStyle=e.fontColor||i.fontColor;var g=[],v=String(e.text);if(s){var m=t.getLength(l,u);g=d(S,c(v),(function(){return m}),p)}else g=v.split("\n");g.forEach((function(i,n){S.fillText(i,b+t.getOffsetX(S.measureText(i).width,u)+t.getLength(e.left,u),C+t.getLength(e.top,f)+(n+1)*t.getLength(a))}))}))}}));for(var m=t.displacement([o,0,u,s],[0,a,s,f]),y=m[0],C=m[1],z=m[2],x=m[3],k=s;kn&&(l%=n);var v=e.displacement([u*i,l,u,c],[l,f*i,h,f]),m=v[0],w=v[1],y=v[2],b=v[3],S=e.displacement([a+p*i,s,u,c],[a,s+g*i,h,f]),C=S[0],z=S[1],x=S[2],k=S[3];e.drawImage(r,e._offscreenCanvas,m,w,y,b,C,z,x,k)}))}},e.prototype.carveOnGunwaleOfAMovingBoat=function(){var t=this,e=this,i=e._defaultConfig,n=e.prizeFlag,r=e.cellAndSpacing;this.endTime=Date.now(),this.slots.forEach((function(e,o){var a=e.order;if(a.length)for(var s=e.speed||i.speed,h=e.direction||i.direction,c=a.findIndex((function(t){return t===n[o]})),l=r*a.length,u=t.stopScroll[o]=t.scroll[o],f=0;++f;){var d=r*c+l*f*h-u,p=_(t.FPS,u,d,i.decelerationTime)-u;if(Math.abs(p)>s){t.endScroll[o]=d;break}}}))},e.prototype.play=function(){var t,e;0===this.step&&(this.startTime=Date.now(),this.prizeFlag=void 0,this.step=1,null===(e=(t=this.config).afterStart)||void 0===e||e.call(t),this.run())},e.prototype.stop=function(t){var e;if(0!==this.step&&3!==this.step){if("number"==typeof t)this.prizeFlag=new Array(this.slots.length).fill(t);else{if(!s(t,"array"))return this.stop(-1),console.error("stop() 无法识别的参数类型 "+typeof t);if(t.length!==this.slots.length)return this.stop(-1),console.error("stop(["+t+"]) 参数长度的不正确");this.prizeFlag=t}(null===(e=this.prizeFlag)||void 0===e?void 0:e.includes(-1))?(this.prizeFlag=[],this.step=0):this.step=2}},e.prototype.run=function(t){var e,i,n=this;void 0===t&&(t=0);var r=this,o=r.rAF,a=r.step,s=r.prizeFlag,h=r._defaultConfig,c=r.cellAndSpacing,l=r.slots,u=h.accelerationTime,f=h.decelerationTime;if(0!==this.step||(null==s?void 0:s.length)!==l.length){if(void 0===s||s.length){3!==this.step||this.endScroll.length||this.carveOnGunwaleOfAMovingBoat();var d=Date.now()-this.startTime,p=Date.now()-this.endTime;l.forEach((function(e,i){var r=e.order;if(r&&r.length){var o=c*r.length,g=Math.abs(e.speed||h.speed),v=e.direction||h.direction,m=0,w=n.scroll[i];if(1===a||d=f&&(n.step=0)}n.scroll[i]=m}})),this.draw(),o(this.run.bind(this,t+1))}}else{for(var g=s[0],v=0;v= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","/**\n * 由于部分低版本下的某些 app 可能会缺少某些原型方法, 这里增加兼容\n */\n\n// ie11 不兼容 includes 方法\nif (!Array.prototype.includes) {\n Object.defineProperty(Array.prototype, 'includes', {\n value: function(valueToFind, fromIndex) {\n\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n // 1. Let O be ? ToObject(this value).\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x, y) {\n return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(valueToFind, elementK) is true, return true.\n if (sameValueZero(o[k], valueToFind)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n }\n });\n}\n\n// vivo x7 下网易云游戏 app 缺少 includes 方法\nif (!String.prototype.includes) {\n String.prototype.includes = function(search, start) {\n 'use strict';\n if (typeof start !== 'number') {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n } else {\n return this.indexOf(search, start) !== -1;\n }\n };\n}\n\n// vivo x7 下网易云游戏 app 缺少 find 方法\nif (!Array.prototype.find) {\n Object.defineProperty(Array.prototype, 'find', {\n value: function(predicate) {\n // 1. Let O be ? ToObject(this value).\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n var o = Object(this);\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n var thisArg = arguments[1];\n // 5. Let k be 0.\n var k = 0;\n // 6. Repeat, while k < len\n while (k < len) {\n // a. Let Pk be ! ToString(k).\n // b. Let kValue be ? Get(O, Pk).\n // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).\n // d. If testResult is true, return kValue.\n var kValue = o[k];\n if (predicate.call(thisArg, kValue, k, o)) {\n return kValue;\n }\n // e. Increase k by 1.\n k++;\n }\n // 7. Return undefined.\n return void 0;\n }\n });\n}\n","/**\n * 判断是否是期望的类型\n * @param { unknown } param 将要判断的变量\n * @param { ...string } types 期望的类型\n * @return { boolean } 返回期望是否正确\n */\nexport const isExpectType = (param: unknown, ...types: string[]): boolean => {\n return types.some(type => Object.prototype.toString.call(param).slice(8, -1).toLowerCase() === type)\n}\n\nexport const get = (data: object, strKeys: string) => {\n const keys = strKeys.split('.')\n for (let key of keys) {\n const res = data[key]\n if (!isExpectType(res, 'object', 'array')) return res\n data = res\n }\n return data\n}\n\nexport const has = (data: object, key: string | number): boolean => {\n return Object.prototype.hasOwnProperty.call(data, key)\n}\n\n/**\n * 移除\\n\n * @param { string } str 将要处理的字符串\n * @return { string } 返回新的字符串\n */\nexport const removeEnter = (str: string): string => {\n return [].filter.call(str, s => s !== '\\n').join('')\n}\n\n/**\n * 把任何数据类型转成数字\n * @param num \n */\nexport const getNumber = (num: unknown): number => {\n if (num === null) return 0\n if (typeof num === 'object') return NaN\n if (typeof num === 'number') return num\n if (typeof num === 'string') {\n if (num[num.length - 1] === '%') {\n return Number(num.slice(0, -1)) / 100\n }\n return Number(num)\n }\n return NaN\n}\n\n/**\n * 判断颜色是否有效 (透明色 === 无效)\n * @param color 颜色\n */\nexport const hasBackground = (color: string | undefined | null): boolean => {\n if (typeof color !== 'string') return false\n color = color.toLocaleLowerCase().trim()\n if (color === 'transparent') return false\n if (/^rgba/.test(color)) {\n const alpha = /([^\\s,]+)\\)$/.exec(color)\n if (getNumber(alpha) === 0) return false\n }\n return true\n}\n\n/**\n * 通过padding计算\n * @return { object } block 边框信息\n */\nexport const computePadding = (\n block: { padding?: string },\n getLength: Function\n): [number, number, number, number] => {\n let padding = block.padding?.split(' ').map(n => getLength(n)) || [0],\n paddingTop = 0,\n paddingBottom = 0,\n paddingLeft = 0,\n paddingRight = 0\n switch (padding.length) {\n case 1:\n paddingTop = paddingBottom = paddingLeft = paddingRight = padding[0]\n break\n case 2:\n paddingTop = paddingBottom = padding[0]\n paddingLeft = paddingRight = padding[1]\n break\n case 3:\n paddingTop = padding[0]\n paddingLeft = paddingRight = padding[1]\n paddingBottom = padding[2]\n break\n default:\n paddingTop = padding[0]\n paddingBottom = padding[1]\n paddingLeft = padding[2]\n paddingRight = padding[3]\n }\n // 检查是否单独传入值, 并且不是0\n const res = { paddingTop, paddingBottom, paddingLeft, paddingRight }\n for (let key in res) {\n // 是否含有这个属性, 并且是数字或字符串\n res[key] = has(block, key) && isExpectType(block[key], 'string', 'number')\n ? getLength(block[key])\n : res[key]\n }\n return [paddingTop, paddingBottom, paddingLeft, paddingRight]\n}\n\n/**\n * 节流函数\n * @param fn 将要处理的函数\n * @param wait 时间, 单位为毫秒\n * @returns 包装好的节流函数\n */\nexport const throttle = (fn: Function, wait = 300) => {\n let timeId = null as any\n return function (this: any, ...args: any[]) {\n if (timeId) return\n timeId = setTimeout(() => {\n fn.apply(this, args)\n clearTimeout(timeId)\n timeId = null\n }, wait)\n }\n}\n\n/**\n * 通过概率计算出一个奖品索引\n * @param { Array } rangeArr 概率\n * @returns { number } 中奖索引\n */\nexport const computeRange = (rangeArr: Array): number => {\n const ascendingArr: number[] = []\n // 额外增加 map 来优化 ts 的类型推断\n const sum = rangeArr.map(num => Number(num)).reduce((prev, curr) => {\n if (curr > 0) { // 大于0\n const res = prev + curr\n ascendingArr.push(res)\n return res\n } else { // 小于等于0或NaN\n ascendingArr.push(NaN)\n return prev\n }\n }, 0)\n const random = Math.random() * sum\n return ascendingArr.findIndex(num => random <= num)\n}\n\n/**\n * 根据宽度分割字符串, 来达到换行的效果\n * @param text \n * @param maxWidth \n * @returns \n */\nexport const splitText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n getWidth: (lines: string[]) => number,\n lineClamp: number = Infinity\n): string[] => {\n // 如果 lineClamp 设置不正确, 则忽略该属性\n if (lineClamp <= 0) lineClamp = Infinity\n let str = ''\n const lines = []\n const EndWidth = ctx.measureText('...').width\n for (let i = 0; i < text.length; i++) {\n str += text[i]\n let currWidth = ctx.measureText(str).width\n const maxWidth = getWidth(lines)\n // 如果正在计算最后一行, 则加上三个小点的宽度\n if (lineClamp === lines.length + 1) currWidth += EndWidth\n // 如果已经没有宽度了, 就没有必要再计算了\n if (maxWidth < 0) return lines\n // 如果当前一行的宽度不够了, 则处理下一行\n if (currWidth > maxWidth) {\n lines.push(str.slice(0, -1))\n str = text[i]\n }\n // 如果现在是最后一行, 则加上三个小点并跳出\n if (lineClamp === lines.length) {\n lines[lines.length - 1] += '...'\n return lines\n }\n }\n if (str) lines.push(str)\n if (!lines.length) lines.push(text)\n return lines\n}\n\n// 获取一个重新排序的数组\nexport const getSortedArrayByIndex = (arr: T[], order: number[]): T[] => {\n const map: { [key: number]: T } = {}, res = []\n for (let i = 0; i < arr.length; i++) {\n map[i] = arr[i]\n }\n for (let i = 0; i < order.length; i++) {\n const curr = map[order[i]]\n if (curr) (res[i] = curr)\n }\n return res\n}\n","import Watcher from './watcher'\n\nexport default class Dep {\n static target: Watcher | null\n private subs: Array\n\n /**\n * 订阅中心构造器\n */\n constructor () {\n this.subs = []\n }\n\n /**\n * 收集依赖\n * @param {*} sub \n */\n public addSub (sub: Watcher) {\n // 此处临时使用includes防重复添加\n if (!this.subs.includes(sub)) {\n this.subs.push(sub)\n }\n }\n\n /**\n * 派发更新\n */\n public notify () {\n this.subs.forEach(sub => {\n sub.update()\n })\n }\n}\n","\nimport { isExpectType } from '../utils'\n\nexport const hasProto = '__proto__' in {}\n\nexport function def (obj: object, key: string | number, val: any, enumerable?: boolean) {\n Object.defineProperty(obj, key, {\n value: val,\n enumerable: !!enumerable,\n writable: true,\n configurable: true\n })\n}\n\nexport function parsePath (path: string) {\n path += '.'\n let segments: string[] = [], segment = ''\n for (let i = 0; i < path.length; i++) {\n let curr = path[i]\n if (/\\[|\\./.test(curr)) {\n segments.push(segment)\n segment = ''\n } else if (/\\W/.test(curr)) {\n continue\n } else {\n segment += curr\n }\n }\n return function (data: object | any[]) {\n return segments.reduce((data, key) => {\n return data[key]\n }, data)\n }\n}\n\nexport function traverse (value: any) {\n // const seenObjects = new Set()\n const dfs = (data: any) => {\n if (!isExpectType(data, 'array', 'object')) return\n Object.keys(data).forEach(key => {\n const value = data[key]\n dfs(value)\n })\n }\n dfs(value)\n // seenObjects.clear()\n}","/**\n * 重写数组的原型方法\n */\nconst oldArrayProto = Array.prototype\nconst newArrayProto = Object.create(oldArrayProto)\nconst methods = ['push', 'pop', 'shift', 'unshift', 'sort', 'splice', 'reverse']\nmethods.forEach(method => {\n newArrayProto[method] = function (...args: any[]) {\n const res = oldArrayProto[method].apply(this, args)\n const luckyOb = this['__luckyOb__']\n if (['push', 'unshift', 'splice'].includes(method)) luckyOb.walk(this)\n luckyOb.dep.notify()\n return res\n }\n})\n\nexport { newArrayProto }\n","import Dep from './dep'\nimport { hasProto, def } from './utils'\nimport { newArrayProto } from './array'\n\nexport default class Observer {\n value: any\n dep: Dep\n\n /**\n * 观察者构造器\n * @param value \n */\n constructor (value: any) {\n // this.value = value\n this.dep = new Dep()\n // 将响应式对象代理到当前value上面, 并且将当前的enumerable设置为false\n def(value, '__luckyOb__', this)\n if (Array.isArray(value)) { // 如果是数组, 则重写原型方法\n if (hasProto) {\n value['__proto__'] = newArrayProto\n } else {\n Object.getOwnPropertyNames(newArrayProto).forEach(key => {\n def(value, key, newArrayProto[key])\n })\n }\n }\n this.walk(value)\n }\n\n walk (data: object | any[]) {\n Object.keys(data).forEach(key => {\n defineReactive(data, key, data[key])\n })\n }\n}\n\n/**\n * 处理响应式\n * @param { Object | Array } data\n */\nexport function observe (data: any): Observer | void {\n if (!data || typeof data !== 'object') return\n let luckyOb: Observer | void\n if ('__luckyOb__' in data) {\n luckyOb = data['__luckyOb__']\n } else {\n luckyOb = new Observer(data)\n }\n return luckyOb\n}\n\n/**\n * 重写 setter / getter\n * @param {*} data \n * @param {*} key \n * @param {*} val \n */\nexport function defineReactive (data: any, key: string | number, val: any) {\n const dep = new Dep()\n const property = Object.getOwnPropertyDescriptor(data, key)\n if (property && property.configurable === false) {\n return\n }\n const getter = property && property.get\n const setter = property && property.set\n if ((!getter || setter) && arguments.length === 2) {\n val = data[key]\n }\n let childOb = observe(val)\n Object.defineProperty(data, key, {\n get: () => {\n const value = getter ? getter.call(data) : val\n if (Dep.target) {\n dep.addSub(Dep.target)\n if (childOb) {\n childOb.dep.addSub(Dep.target)\n }\n }\n return value\n },\n set: (newVal) => {\n if (newVal === val) return\n val = newVal\n if (getter && !setter) return\n if (setter) {\n setter.call(data, newVal)\n } else {\n val = newVal\n }\n childOb = observe(newVal)\n dep.notify()\n }\n })\n}\n","import Lucky from '../lib/lucky'\nimport Dep from './dep'\nimport { parsePath, traverse } from './utils'\n\nexport interface WatchOptType {\n handler?: () => Function\n immediate?: boolean\n deep?: boolean\n}\n\nlet uid = 0\nexport default class Watcher {\n id: number\n $lucky: Lucky\n expr: string | Function\n cb: Function\n deep: boolean\n getter: Function\n value: any\n\n /**\n * 观察者构造器\n * @param {*} $lucky \n * @param {*} expr \n * @param {*} cb \n */\n constructor ($lucky: Lucky, expr: string | Function, cb: Function, options: WatchOptType = {}) {\n this.id = uid++\n this.$lucky = $lucky\n this.expr = expr\n this.deep = !!options.deep\n if (typeof expr === 'function') {\n this.getter = expr\n } else {\n this.getter = parsePath(expr)\n }\n this.cb = cb\n this.value = this.get()\n }\n\n /**\n * 根据表达式获取新值\n */\n get () {\n Dep.target = this\n const value = this.getter.call(this.$lucky, this.$lucky)\n // 处理深度监听\n if (this.deep) {\n traverse(value)\n }\n Dep.target = null\n return value\n }\n\n /**\n * 触发 watcher 更新\n */\n update () {\n // get获取新值\n const newVal = this.get()\n // 读取之前存储的旧值\n const oldVal = this.value\n this.value = newVal\n // 触发 watch 回调\n this.cb.call(this.$lucky, newVal, oldVal)\n }\n}\n","import '../utils/polyfill'\nimport { has, isExpectType, throttle } from '../utils/index'\nimport { name, version } from '../../package.json'\nimport { ConfigType, UserConfigType, ImgItemType, ImgType, Tuple } from '../types/index'\nimport { defineReactive } from '../observer'\nimport Watcher, { WatchOptType } from '../observer/watcher'\n\nexport default class Lucky {\n static version: string = version\n protected readonly version: string = version\n protected readonly config: ConfigType\n protected readonly ctx: CanvasRenderingContext2D\n protected htmlFontSize: number = 16\n protected rAF: Function = function () {}\n protected boxWidth: number = 0\n protected boxHeight: number = 0\n protected data: {\n width: string | number,\n height: string | number\n }\n\n /**\n * 公共构造器\n * @param config\n */\n constructor (\n config: string | HTMLDivElement | UserConfigType,\n data: {\n width: string | number,\n height: string | number\n }\n ) {\n // 兼容代码开始: 为了处理 v1.0.6 版本在这里传入了一个 dom\n if (typeof config === 'string') config = { el: config } as UserConfigType\n else if (config.nodeType === 1) config = { el: '', divElement: config } as UserConfigType\n // 这里先野蛮的处理, 等待后续优化, 对外暴露的类型是UserConfigType, 但内部期望是ConfigType\n config = config as UserConfigType\n this.config = config as ConfigType\n this.data = data\n // 开始初始化\n if (!config.flag) config.flag = 'WEB'\n if (config.el) config.divElement = document.querySelector(config.el) as HTMLDivElement\n // 如果存在父盒子, 就创建canvas标签\n if (config.divElement) {\n // 无论盒子内有没有canvas都执行覆盖逻辑\n config.canvasElement = document.createElement('canvas')\n config.divElement.appendChild(config.canvasElement)\n }\n // 获取 canvas 上下文\n if (config.canvasElement) {\n config.ctx = config.canvasElement.getContext('2d')!\n // 添加版本信息到标签上, 方便定位版本问题\n config.canvasElement.setAttribute('package', `${name}@${version}`)\n config.canvasElement.addEventListener('click', e => this.handleClick(e))\n }\n this.ctx = config.ctx as CanvasRenderingContext2D\n // 初始化 window 方法\n this.initWindowFunction()\n // 如果最后得不到 canvas 上下文那就无法进行绘制\n if (!this.config.ctx) {\n console.error('无法获取到 CanvasContext2D')\n }\n // 监听 window 触发 resize 时重置\n if (window && typeof window.addEventListener === 'function') {\n window.addEventListener('resize', throttle(() => this.resize(), 300))\n }\n // 监听异步设置 html 的 fontSize 并重新绘制\n if (window && typeof window.MutationObserver === 'function') {\n new window.MutationObserver(() => {\n this.resize()\n }).observe(document.documentElement, { attributes: true })\n }\n }\n\n /**\n * 初始化组件大小/单位\n */\n protected resize(): void {\n this.config.beforeResize?.()\n // 先初始化 fontSize 以防后面有 rem 单位\n this.setHTMLFontSize()\n // 拿到 config 即可设置 dpr\n this.setDpr()\n // 初始化宽高\n this.resetWidthAndHeight()\n // 根据 dpr 来缩放 canvas\n this.zoomCanvas()\n }\n\n /**\n * 初始化方法\n */\n protected initLucky () {\n this.resize()\n if (!this.boxWidth || !this.boxHeight) {\n return console.error('无法获取到宽度或高度')\n }\n }\n\n /**\n * 鼠标点击事件\n * @param e 事件参数\n */\n protected handleClick (e: MouseEvent): void {}\n\n /**\n * 根标签的字体大小\n */\n protected setHTMLFontSize (): void {\n if (!window) return\n this.htmlFontSize = +window.getComputedStyle(document.documentElement).fontSize.slice(0, -2)\n }\n\n // 清空画布\n public clearCanvas (): void {\n const [width, height] = [this.boxWidth, this.boxHeight]\n this.ctx.clearRect(-width, -height, width * 2, height * 2)\n }\n\n /**\n * 设备像素比\n * window 环境下自动获取, 其余环境手动传入\n */\n protected setDpr (): void {\n const { config } = this\n if (config.dpr) {\n // 优先使用 config 传入的 dpr\n } else if (window) {\n window['dpr'] = config.dpr = window.devicePixelRatio || 1\n } else if (!config.dpr) {\n console.error(config, '未传入 dpr 可能会导致绘制异常')\n }\n }\n\n /**\n * 重置盒子和canvas的宽高\n */\n private resetWidthAndHeight (): void {\n const { config, data } = this\n // 如果是浏览器环境并且存在盒子\n let boxWidth = 0, boxHeight = 0\n if (config.divElement) {\n boxWidth = config.divElement.offsetWidth\n boxHeight = config.divElement.offsetHeight\n }\n // 先从 data 里取宽高, 如果 config 上面没有, 就从 style 上面取\n this.boxWidth = this.getLength(data.width || config['width']) || boxWidth\n this.boxHeight = this.getLength(data.height || config['height']) || boxHeight\n // 重新把宽高赋给盒子\n if (config.divElement) {\n config.divElement.style.overflow = 'hidden'\n config.divElement.style.width = this.boxWidth + 'px'\n config.divElement.style.height = this.boxHeight + 'px'\n }\n }\n\n /**\n * 根据 dpr 缩放 canvas 并处理位移\n */\n protected zoomCanvas (): void {\n const { config, ctx } = this\n const { canvasElement, dpr } = config\n const [width, height] = [this.boxWidth * dpr, this.boxHeight * dpr]\n if (!canvasElement) return\n canvasElement.width = width\n canvasElement.height = height\n canvasElement.style.width = `${width}px`\n canvasElement.style.height = `${height}px`\n canvasElement.style['transform-origin'] = 'left top'\n canvasElement.style.transform = `scale(${1 / dpr})`\n ctx.scale(dpr, dpr)\n }\n\n /**\n * 从 window 对象上获取一些方法\n */\n private initWindowFunction (): void {\n const { config } = this\n if (window) {\n this.rAF = window.requestAnimationFrame ||\n window['webkitRequestAnimationFrame'] ||\n window['mozRequestAnimationFrame'] ||\n function (callback: Function) {\n window.setTimeout(callback, 1000 / 60)\n }\n config.setTimeout = window.setTimeout\n config.setInterval = window.setInterval\n config.clearTimeout = window.clearTimeout\n config.clearInterval = window.clearInterval\n return\n }\n if (config.rAF) {\n // 优先使用帧动画\n this.rAF = config.rAF\n } else if (config.setTimeout) {\n // 其次使用定时器\n const timeout = config.setTimeout\n this.rAF = (callback: Function): number => timeout(callback, 16.7)\n } else {\n // 如果config里面没有提供, 那就假设全局方法存在setTimeout\n this.rAF = (callback: Function): number => setTimeout(callback, 16.7)\n }\n }\n\n public isWeb () {\n return ['WEB', 'UNI-H5', 'TARO-H5'].includes(this.config.flag)\n }\n\n /**\n * 异步加载图片并返回图片的几何信息\n * @param src 图片路径\n * @param info 图片信息\n */\n protected loadImg (\n src: string,\n info: ImgItemType,\n resolveName = '$resolve'\n ): Promise {\n return new Promise((resolve, reject) => {\n if (!src) reject(`=> '${info.src}' 不能为空或不合法`)\n if (this.config.flag === 'WEB') {\n let imgObj = new Image()\n imgObj['crossorigin'] = 'anonymous'\n imgObj.onload = () => resolve(imgObj)\n imgObj.onerror = () => reject(`=> '${info.src}' 图片加载失败`)\n imgObj.src = src\n } else {\n // 其余平台向外暴露, 交给外部自行处理\n info[resolveName] = resolve\n info['$reject'] = reject\n return\n }\n })\n }\n\n /**\n * 公共绘制图片的方法\n * @param imgObj 图片对象\n * @param rectInfo: [x轴位置, y轴位置, 渲染宽度, 渲染高度] \n */\n protected drawImage(\n ctx: CanvasRenderingContext2D,\n imgObj: ImgType,\n ...rectInfo: [...Tuple, ...Partial>]\n ): void {\n let drawImg\n const { flag, dpr } = this.config\n if (['WEB', 'MP-WX'].includes(flag)) {\n // 浏览器和新版小程序中直接绘制即可\n drawImg = imgObj\n } else if (['UNI-H5', 'UNI-MP', 'TARO-H5', 'TARO-MP'].includes(flag)) {\n // 旧版本的小程序需要绘制 path, 这里特殊处理一下\n type OldImageType = ImgType & { path: CanvasImageSource }\n drawImg = (imgObj as OldImageType).path\n } else {\n // 如果传入了未知的标识\n return console.error('意料之外的 flag, 该平台尚未兼容!')\n }\n const miniProgramOffCtx = (drawImg['canvas'] || drawImg).getContext?.('2d')\n if (miniProgramOffCtx && !this.isWeb()) {\n rectInfo = rectInfo.map(val => val! * dpr) as Tuple\n const temp = miniProgramOffCtx.getImageData(...rectInfo.slice(0, 4))\n ctx.putImageData(temp, ...(rectInfo.slice(4, 6) as Tuple))\n } else {\n if (rectInfo.length === 8) {\n rectInfo = rectInfo.map((val, index) => index < 4 ? val! * dpr : val) as Tuple\n }\n // 尝试捕获错误\n try {\n ctx.drawImage(drawImg, ...rectInfo as Tuple)\n } catch (err) {\n /**\n * TODO: safari浏览器下, init() 会出现奇怪的报错\n * IndexSizeError: The index is not in the allowed range\n * 但是这个报错并不影响实际的绘制, 目前先放一放, 等待有缘人\n */\n // console.log(err)\n }\n }\n }\n\n /**\n * 计算图片的渲染宽高\n * @param imgObj 图片标签元素\n * @param imgInfo 图片信息\n * @param maxWidth 最大宽度\n * @param maxHeight 最大高度\n * @return [渲染宽度, 渲染高度]\n */\n protected computedWidthAndHeight (\n imgObj: ImgType,\n imgInfo: ImgItemType,\n maxWidth: number,\n maxHeight: number\n ): [number, number] {\n // 根据配置的样式计算图片的真实宽高\n if (!imgInfo.width && !imgInfo.height) {\n // 如果没有配置宽高, 则使用图片本身的宽高\n return [imgObj.width, imgObj.height]\n } else if (imgInfo.width && !imgInfo.height) {\n // 如果只填写了宽度, 没填写高度\n let trueWidth = this.getLength(imgInfo.width, maxWidth)\n // 那高度就随着宽度进行等比缩放\n return [trueWidth, imgObj.height * (trueWidth / imgObj.width)]\n } else if (!imgInfo.width && imgInfo.height) {\n // 如果只填写了宽度, 没填写高度\n let trueHeight = this.getLength(imgInfo.height, maxHeight)\n // 那宽度就随着高度进行等比缩放\n return [imgObj.width * (trueHeight / imgObj.height), trueHeight]\n }\n // 如果宽度和高度都填写了, 就如实计算\n return [\n this.getLength(imgInfo.width, maxWidth),\n this.getLength(imgInfo.height, maxHeight)\n ]\n }\n\n /**\n * 转换单位\n * @param { string } value 将要转换的值\n * @param { number } denominator 分子\n * @return { number } 返回新的字符串\n */\n protected changeUnits (value: string, denominator = 1): number {\n const { config } = this\n return Number(value.replace(/^([-]*[0-9.]*)([a-z%]*)$/, (val, num, unit) => {\n const handleCssUnit = {\n '%': (n: number) => n * (denominator / 100),\n 'px': (n: number) => n * 1,\n 'rem': (n: number) => n * this.htmlFontSize,\n 'vw': (n: number) => n / 100 * window.innerWidth,\n }[unit]\n if (handleCssUnit) return handleCssUnit(num)\n // 如果找不到默认单位, 就交给外面处理\n const otherHandleCssUnit = config.handleCssUnit || config['unitFunc']\n return otherHandleCssUnit ? otherHandleCssUnit(num, unit) : num\n }))\n }\n\n /**\n * 获取长度\n * @param length 将要转换的长度\n * @param maxLength 最大长度\n * @return 返回长度\n */\n protected getLength (length: string | number | undefined, maxLength?: number): number {\n if (isExpectType(length, 'number')) return length as number\n if (isExpectType(length, 'string')) return this.changeUnits(length as string, maxLength)\n return 0\n }\n\n /**\n * 获取相对(居中)X坐标\n * @param width\n * @param col\n */\n protected getOffsetX (width: number, maxWidth: number = 0): number {\n return (maxWidth - width) / 2\n }\n\n protected getOffscreenCanvas (width: number, height: number): {\n _offscreenCanvas: HTMLCanvasElement,\n _ctx: CanvasRenderingContext2D\n } | void {\n if (!has(this, '_offscreenCanvas')) {\n if (window && window.document && this.config.flag === 'WEB') {\n this['_offscreenCanvas'] = document.createElement('canvas')\n } else {\n this['_offscreenCanvas'] = this.config['offscreenCanvas']\n }\n if (!this['_offscreenCanvas']) return console.error('离屏 Canvas 无法渲染!')\n }\n const dpr = this.config.dpr\n const _offscreenCanvas = this['_offscreenCanvas'] as HTMLCanvasElement\n _offscreenCanvas.width = (width || 300) * dpr\n _offscreenCanvas.height = (height || 150) * dpr\n const _ctx = _offscreenCanvas.getContext('2d')!\n _ctx.clearRect(0, 0, width, height)\n _ctx.scale(dpr, dpr)\n _ctx['dpr'] = dpr\n return { _offscreenCanvas, _ctx }\n }\n\n /**\n * 添加一个新的响应式数据 (临时)\n * @param data 数据\n * @param key 属性\n * @param value 新值\n */\n public $set (data: object, key: string | number, value: any) {\n if (!data || typeof data !== 'object') return\n defineReactive(data, key, value)\n }\n\n /**\n * 添加一个属性计算 (临时)\n * @param data 源数据\n * @param key 属性名\n * @param callback 回调函数\n */\n protected $computed (data: object, key: string, callback: Function) {\n Object.defineProperty(data, key, {\n get: () => {\n return callback.call(this)\n }\n })\n }\n\n /**\n * 添加一个观察者 create user watcher\n * @param expr 表达式\n * @param handler 回调函数\n * @param watchOpt 配置参数\n * @return 卸载当前观察者的函数 (暂未返回)\n */\n protected $watch (\n expr: string | Function,\n handler: Function | WatchOptType,\n watchOpt: WatchOptType = {}\n ): Function {\n if (typeof handler === 'object') {\n watchOpt = handler\n handler = watchOpt.handler!\n }\n // 创建 user watcher\n const watcher = new Watcher(this, expr, handler, watchOpt)\n // 判断是否需要初始化时触发回调\n if (watchOpt.immediate) {\n handler.call(this, watcher.value)\n }\n // 返回一个卸载当前观察者的函数\n return function unWatchFn () {}\n }\n}\n","/**\n * 转换为运算角度\n * @param { number } deg 数学角度\n * @return { number } 运算角度\n */\nexport const getAngle = (deg: number): number => {\n return Math.PI / 180 * deg\n}\n\n/**\n * 根据角度计算圆上的点\n * @param { number } deg 运算角度\n * @param { number } r 半径\n * @return { Array } 坐标[x, y]\n */\nexport const getArcPointerByDeg = (deg: number, r: number): [number, number] => {\n return [+(Math.cos(deg) * r).toFixed(8), +(Math.sin(deg) * r).toFixed(8)]\n}\n\n/**\n * 根据点计算切线方程\n * @param { number } x 横坐标\n * @param { number } y 纵坐标\n * @return { Array } [斜率, 常数]\n */\nexport const getTangentByPointer = (x: number, y: number): Array => {\n let k = - x / y\n let b = -k * x + y\n return [k, b]\n}\n\n// 使用 arc 绘制扇形\nexport const fanShapedByArc = (\n ctx: CanvasRenderingContext2D,\n minRadius: number,\n maxRadius: number,\n start: number,\n end: number,\n gutter: number,\n): void => {\n ctx.beginPath()\n let maxGutter = getAngle(90 / Math.PI / maxRadius * gutter)\n let minGutter = getAngle(90 / Math.PI / minRadius * gutter)\n let maxStart = start + maxGutter\n let maxEnd = end - maxGutter\n let minStart = start + minGutter\n let minEnd = end - minGutter\n ctx.arc(0, 0, maxRadius, maxStart, maxEnd, false)\n // 如果 getter 比按钮短就绘制圆弧, 反之计算新的坐标点\n // if (minEnd > minStart) {\n // ctx.arc(0, 0, minRadius, minEnd, minStart, true)\n // } else {\n ctx.lineTo(\n ...getArcPointerByDeg(\n (start + end) / 2,\n gutter / 2 / Math.abs(Math.sin((start - end) / 2))\n )\n )\n // }\n ctx.closePath()\n}\n\n// 使用 arc 绘制圆角矩形\nexport const roundRectByArc = (\n ctx: CanvasRenderingContext2D,\n ...[x, y, w, h, r]: number[]\n) => {\n const min = Math.min(w, h), PI = Math.PI\n if (r > min / 2) r = min / 2\n ctx.beginPath()\n ctx.moveTo(x + r, y)\n ctx.lineTo(x + r, y)\n ctx.lineTo(x + w - r, y)\n ctx.arc(x + w - r, y + r, r, -PI / 2, 0)\n ctx.lineTo(x + w, y + h - r)\n ctx.arc(x + w - r, y + h - r, r, 0, PI / 2)\n ctx.lineTo(x + r, y + h)\n ctx.arc(x + r, y + h - r, r, PI / 2, PI)\n ctx.lineTo(x, y + r)\n ctx.arc(x + r, y + r, r, PI, -PI / 2)\n ctx.closePath()\n}\n\n/**\n * 创建线性渐变色\n */\nexport const getLinearGradient = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n background: string\n) => {\n const context = (/linear-gradient\\((.+)\\)/.exec(background) as Array)[1]\n .split(',') // 根据逗号分割\n .map((text: string) => text.trim()) // 去除两边空格\n let deg = context.shift(), direction: [number, number, number, number] = [0, 0, 0, 0]\n // 通过起始点和角度计算渐变终点的坐标点, 这里感谢泽宇大神提醒我使用勾股定理....\n if (deg.includes('deg')) {\n deg = deg.slice(0, -3) % 360\n // 根据4个象限定义起点坐标, 根据45度划分8个区域计算终点坐标\n const getLenOfTanDeg = (deg: number) => Math.tan(deg / 180 * Math.PI)\n if (deg >= 0 && deg < 45) direction = [x, y + h, x + w, y + h - w * getLenOfTanDeg(deg - 0)]\n else if (deg >= 45 && deg < 90) direction = [x, y + h, (x + w) - h * getLenOfTanDeg(deg - 45), y]\n else if (deg >= 90 && deg < 135) direction = [x + w, y + h, (x + w) - h * getLenOfTanDeg(deg - 90), y]\n else if (deg >= 135 && deg < 180) direction = [x + w, y + h, x, y + w * getLenOfTanDeg(deg - 135)]\n else if (deg >= 180 && deg < 225) direction = [x + w, y, x, y + w * getLenOfTanDeg(deg - 180)]\n else if (deg >= 225 && deg < 270) direction = [x + w, y, x + h * getLenOfTanDeg(deg - 225), y + h]\n else if (deg >= 270 && deg < 315) direction = [x, y, x + h * getLenOfTanDeg(deg - 270), y + h]\n else if (deg >= 315 && deg < 360) direction = [x, y, x + w, y + h - w * getLenOfTanDeg(deg - 315)]\n }\n // 创建四个简单的方向坐标\n else if (deg.includes('top')) direction = [x, y + h, x, y]\n else if (deg.includes('bottom')) direction = [x, y, x, y + h]\n else if (deg.includes('left')) direction = [x + w, y, x, y]\n else if (deg.includes('right')) direction = [x, y, x + w, y]\n // 创建线性渐变必须使用整数坐标\n const gradient = ctx.createLinearGradient(...(direction.map(n => n >> 0) as typeof direction))\n // 这里后期重构, 先用any代替\n return context.reduce((gradient: any, item: any, index: any) => {\n const info = item.split(' ')\n if (info.length === 1) gradient.addColorStop(index, info[0])\n else if (info.length === 2) gradient.addColorStop(...info)\n return gradient\n }, gradient)\n}\n\n// // 根据三点画圆弧\n// export const drawRadian = (\n// ctx: CanvasRenderingContext2D,\n// r: number,\n// start: number,\n// end: number,\n// direction: boolean = true\n// ) => {\n// // 如果角度大于等于180度, 则分两次绘制, 因为 arcTo 无法绘制180度的圆弧\n// if (Math.abs(end - start).toFixed(8) >= getAngle(180).toFixed(8)) {\n// let middle = (end + start) / 2\n// if (direction) {\n// drawRadian(ctx, r, start, middle, direction)\n// drawRadian(ctx, r, middle, end, direction)\n// } else {\n// drawRadian(ctx, r, middle, end, direction)\n// drawRadian(ctx, r, start, middle, direction)\n// }\n// return false\n// }\n// // 如果方法相反, 则交换起点和终点\n// if (!direction) [start, end] = [end, start]\n// const [x1, y1] = getArcPointerByDeg(start, r)\n// const [x2, y2] = getArcPointerByDeg(end, r)\n// const [k1, b1] = getTangentByPointer(x1, y1)\n// const [k2, b2] = getTangentByPointer(x2, y2)\n// // 计算两条切线的交点\n// let x0 = (b2 - b1) / (k1 - k2)\n// let y0 = (k2 * b1 - k1 * b2) / (k2 - k1)\n// // 如果有任何一条切线垂直于x轴, 则斜率不存在\n// if (isNaN(x0)) {\n// Math.abs(x1) === +r.toFixed(8) && (x0 = x1)\n// Math.abs(x2) === +r.toFixed(8) && (x0 = x2)\n// }\n// if (k1 === Infinity || k1 === -Infinity) {\n// y0 = k2 * x0 + b2\n// }\n// else if (k2 === Infinity || k2 === -Infinity) {\n// y0 = k1 * x0 + b1\n// }\n// ctx.lineTo(x1, y1)\n// // 微信小程序下 arcTo 在安卓真机下绘制有 bug\n// ctx.arcTo(x0, y0, x2, y2, r)\n// }\n\n// // 使用 arcTo 绘制扇形 (弃用)\n// export const drawSectorByArcTo = (\n// ctx: CanvasRenderingContext2D,\n// minRadius: number,\n// maxRadius: number,\n// start: number,\n// end: number,\n// gutter: number,\n// ) => {\n// if (!minRadius) minRadius = gutter\n// // 内外圆弧分别进行等边缩放\n// let maxGutter = getAngle(90 / Math.PI / maxRadius * gutter)\n// let minGutter = getAngle(90 / Math.PI / minRadius * gutter)\n// let maxStart = start + maxGutter\n// let maxEnd = end - maxGutter\n// let minStart = start + minGutter\n// let minEnd = end - minGutter\n// ctx.beginPath()\n// ctx.moveTo(...getArcPointerByDeg(maxStart, maxRadius))\n// drawRadian(ctx, maxRadius, maxStart, maxEnd, true)\n// // 如果 getter 比按钮短就绘制圆弧, 反之计算新的坐标点\n// if (minEnd > minStart) {\n// drawRadian(ctx, minRadius, minStart, minEnd, false)\n// } else {\n// ctx.lineTo(\n// ...getArcPointerByDeg(\n// (start + end) / 2,\n// gutter / 2 / Math.abs(Math.sin((start - end) / 2))\n// )\n// )\n// }\n// ctx.closePath()\n// }\n\n// // 使用 arcTo 绘制圆角矩形 (弃用)\n// export const roundRectByArcTo = (\n// ctx: CanvasRenderingContext2D,\n// ...[x, y, w, h, r]: number[]\n// ) => {\n// let min = Math.min(w, h)\n// if (r > min / 2) r = min / 2\n// ctx.beginPath()\n// ctx.moveTo(x + r, y)\n// ctx.lineTo(x + r, y)\n// ctx.lineTo(x + w - r, y)\n// ctx.arcTo(x + w, y, x + w, y + r, r)\n// ctx.lineTo(x + w, y + h - r)\n// ctx.arcTo(x + w, y + h, x + w - r, y + h, r)\n// ctx.lineTo(x + r, y + h)\n// ctx.arcTo(x, y + h, x, y + h - r, r)\n// ctx.lineTo(x, y + r)\n// ctx.arcTo(x, y, x + r, y, r)\n// }\n","/**\n * 缓动函数\n * t: current time(当前时间)\n * b: beginning value(初始值)\n * c: change in value(变化量)\n * d: duration(持续时间)\n * \n * 感谢张鑫旭大佬 https://github.com/zhangxinxu/Tween\n */\n\ninterface SpeedType {\n easeIn: (...arr: number[]) => number\n easeOut: (...arr: number[]) => number\n}\n\n// 二次方的缓动\nexport const quad: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return c * (t /= d) * t + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return -c * (t /= d) * (t - 2) + b\n }\n}\n\n// 三次方的缓动\nexport const cubic: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return c * (t /= d) * t * t + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return c * ((t = t / d - 1) * t * t + 1) + b\n }\n}\n\n// 四次方的缓动\nexport const quart: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return c * (t /= d) * t * t * t + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return -c * ((t = t / d - 1) * t * t * t - 1) + b\n }\n}\n\n// 五次方的缓动\nexport const quint: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return c * (t /= d) * t * t * t * t + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b\n }\n}\n\n// 正弦曲线的缓动\nexport const sine: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return c * Math.sin(t / d * (Math.PI / 2)) + b\n }\n}\n\n// 指数曲线的缓动\nexport const expo: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b\n }\n}\n\n// 圆形曲线的缓动\nexport const circ: SpeedType = {\n easeIn: function (t, b, c, d) {\n if (t >= d) t = d\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b\n },\n easeOut: function (t, b, c, d) {\n if (t >= d) t = d\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b\n }\n}\n","import Lucky from './lucky'\nimport { UserConfigType, FontItemType, ImgType } from '../types/index'\nimport LuckyWheelConfig, {\n BlockType,\n PrizeType,\n ButtonType,\n DefaultConfigType,\n DefaultStyleType,\n StartCallbackType,\n EndCallbackType\n} from '../types/wheel'\nimport {\n removeEnter,\n hasBackground,\n computeRange,\n splitText,\n has,\n} from '../utils/index'\nimport { getAngle, fanShapedByArc } from '../utils/math'\nimport { quad } from '../utils/tween'\n\nexport default class LuckyWheel extends Lucky {\n private blocks: Array = []\n private prizes: Array = []\n private buttons: Array = []\n private defaultConfig: DefaultConfigType = {}\n private defaultStyle: DefaultStyleType = {}\n private _defaultConfig: Required = {} as Required\n private _defaultStyle: Required = {} as Required\n private startCallback?: StartCallbackType\n private endCallback?: EndCallbackType\n private Radius = 0 // 大转盘半径\n private prizeRadius = 0 // 奖品区域半径\n private prizeDeg = 0 // 奖品数学角度\n private prizeAng = 0 // 奖品运算角度\n private rotateDeg = 0 // 转盘旋转角度\n private maxBtnRadius = 0 // 最大按钮半径\n private startTime = 0 // 开始时间戳\n private endTime = 0 // 停止时间戳\n private stopDeg = 0 // 刻舟求剑\n private endDeg = 0 // 停止角度\n private FPS = 16.6 // 屏幕刷新率\n /**\n * 游戏当前的阶段\n * step = 0 时, 游戏尚未开始\n * step = 1 时, 此时处于加速阶段\n * step = 2 时, 此时处于匀速阶段\n * step = 3 时, 此时处于减速阶段\n */\n private step: 0 | 1 | 2 | 3 = 0\n /**\n * 中奖索引\n * prizeFlag = undefined 时, 处于开始抽奖阶段, 正常旋转\n * prizeFlag >= 0 时, 说明stop方法被调用, 并且传入了中奖索引\n * prizeFlag === -1 时, 说明stop方法被调用, 并且传入了负值, 本次抽奖无效\n */\n private prizeFlag: number | undefined\n private ImageCache = new Map()\n\n /**\n * 大转盘构造器\n * @param config 配置项\n * @param data 抽奖数据\n */\n constructor (config: UserConfigType, data: LuckyWheelConfig) {\n super(config, {\n width: data.width,\n height: data.height\n })\n this.initData(data)\n this.initWatch()\n this.initComputed()\n // 创建前回调函数\n config.beforeCreate?.call(this)\n // 首次初始化\n this.init()\n }\n\n protected resize(): void {\n super.resize()\n this.Radius = Math.min(this.boxWidth, this.boxHeight) / 2\n this.ctx.translate(this.Radius, this.Radius)\n this.draw()\n this.config.afterResize?.()\n }\n\n protected initLucky (): void {\n this.Radius = 0\n this.prizeRadius = 0\n this.prizeDeg = 0\n this.prizeAng = 0\n this.rotateDeg = 0\n this.maxBtnRadius = 0\n this.startTime = 0\n this.endTime = 0\n this.stopDeg = 0\n this.endDeg = 0\n this.FPS = 16.6\n this.prizeFlag = -1\n this.step = 0\n super.initLucky()\n }\n\n /**\n * 初始化数据\n * @param data\n */\n private initData (data: LuckyWheelConfig): void {\n this.$set(this, 'width', data.width)\n this.$set(this, 'height', data.height)\n this.$set(this, 'blocks', data.blocks || [])\n this.$set(this, 'prizes', data.prizes || [])\n this.$set(this, 'buttons', data.buttons || [])\n this.$set(this, 'defaultConfig', data.defaultConfig || {})\n this.$set(this, 'defaultStyle', data.defaultStyle || {})\n this.$set(this, 'startCallback', data.start)\n this.$set(this, 'endCallback', data.end)\n }\n\n /**\n * 初始化属性计算\n */\n private initComputed () {\n // 默认配置\n this.$computed(this, '_defaultConfig', () => {\n const config = {\n gutter: '0px',\n offsetDegree: 0,\n speed: 20,\n speedFunction: 'quad',\n accelerationTime: 2500,\n decelerationTime: 2500,\n stopRange: 0,\n ...this.defaultConfig\n }\n return config\n })\n // 默认样式\n this.$computed(this, '_defaultStyle', () => {\n const style = {\n fontSize: '18px',\n fontColor: '#000',\n fontStyle: 'sans-serif',\n fontWeight: '400',\n background: 'rgba(0,0,0,0)',\n wordWrap: true,\n lengthLimit: '90%',\n ...this.defaultStyle\n }\n return style\n })\n }\n\n /**\n * 初始化观察者\n */\n private initWatch () {\n // 重置宽度\n this.$watch('width', (newVal: string | number) => {\n this.data.width = newVal\n this.resize()\n })\n // 重置高度\n this.$watch('height', (newVal: string | number) => {\n this.data.height = newVal\n this.resize()\n })\n // 观察 blocks 变化收集图片\n this.$watch('blocks', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 观察 prizes 变化收集图片\n this.$watch('prizes', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 观察 buttons 变化收集图片\n this.$watch('buttons', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n this.$watch('defaultConfig', () => this.draw(), { deep: true })\n this.$watch('defaultStyle', () => this.draw(), { deep: true })\n this.$watch('startCallback', () => this.init())\n this.$watch('endCallback', () => this.init())\n }\n\n /**\n * 初始化 canvas 抽奖\n */\n public async init (): Promise {\n this.initLucky()\n const { config } = this\n // 初始化前回调函数\n config.beforeInit?.call(this)\n this.draw() // 先画一次, 防止闪烁\n this.draw() // 再画一次, 拿到正确的按钮轮廓\n // 异步加载图片\n await this.initImageCache()\n // 初始化后回调函数\n config.afterInit?.call(this)\n }\n\n private initImageCache (): Promise {\n return new Promise((resolve) => {\n const willUpdateImgs = {\n blocks: this.blocks.map(block => block.imgs),\n prizes: this.prizes.map(prize => prize.imgs),\n buttons: this.buttons.map(btn => btn.imgs),\n }\n ;(<(keyof typeof willUpdateImgs)[]>Object.keys(willUpdateImgs)).forEach(imgName => {\n const willUpdate = willUpdateImgs[imgName]\n // 循环遍历所有图片\n const allPromise: Promise[] = []\n willUpdate && willUpdate.forEach((imgs, cellIndex) => {\n imgs && imgs.forEach((imgInfo, imgIndex) => {\n allPromise.push(this.loadAndCacheImg(imgName, cellIndex, imgIndex))\n })\n })\n Promise.all(allPromise).then(() => {\n this.draw()\n resolve()\n })\n })\n })\n }\n\n /**\n * canvas点击事件\n * @param e 事件参数\n */\n protected handleClick (e: MouseEvent): void {\n const { ctx } = this\n ctx.beginPath()\n ctx.arc(0, 0, this.maxBtnRadius, 0, Math.PI * 2, false)\n if (!ctx.isPointInPath(e.offsetX, e.offsetY)) return\n if (this.step !== 0) return\n this.startCallback?.(e)\n }\n\n /**\n * 根据索引单独加载指定图片并缓存\n * @param cellName 模块名称\n * @param cellIndex 模块索引\n * @param imgName 模块对应的图片缓存\n * @param imgIndex 图片索引\n */\n private async loadAndCacheImg (\n cellName: 'blocks' | 'prizes' | 'buttons',\n cellIndex: number,\n imgIndex: number,\n ): Promise {\n return new Promise((resolve, reject) => {\n // 获取图片信息\n const cell: BlockType | PrizeType | ButtonType = this[cellName][cellIndex]\n if (!cell || !cell.imgs) return\n const imgInfo = cell.imgs[imgIndex]\n if (!imgInfo) return\n // 异步加载图片\n this.loadImg(imgInfo.src, imgInfo).then(async currImg => {\n if (typeof imgInfo.formatter === 'function') {\n currImg = await Promise.resolve(imgInfo.formatter.call(this, currImg))\n }\n this.ImageCache.set(imgInfo['src'], currImg)\n resolve()\n }).catch(err => {\n console.error(`${cellName}[${cellIndex}].imgs[${imgIndex}] ${err}`)\n reject()\n })\n })\n }\n\n private drawBlock (radius: number, block: BlockType, blockIndex: number): void {\n const { ctx } = this\n if (hasBackground(block.background)) {\n ctx.beginPath()\n ctx.fillStyle = block.background!\n ctx.arc(0, 0, radius, 0, Math.PI * 2, false)\n ctx.fill()\n }\n block.imgs && block.imgs.forEach((imgInfo, imgIndex) => {\n const blockImg = this.ImageCache.get(imgInfo.src)\n if (!blockImg) return\n // 绘制图片\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(blockImg, imgInfo, radius * 2, radius * 2)\n const [xAxis, yAxis] = [this.getOffsetX(trueWidth) + this.getLength(imgInfo.left, radius * 2), this.getLength(imgInfo.top, radius * 2) - radius]\n ctx.save()\n imgInfo.rotate && ctx.rotate(getAngle(this.rotateDeg))\n this.drawImage(ctx, blockImg, xAxis, yAxis, trueWidth, trueHeight)\n ctx.restore()\n })\n }\n\n /**\n * 开始绘制\n */\n protected draw (): void {\n const { config, ctx, _defaultConfig, _defaultStyle } = this\n // 触发绘制前回调\n config.beforeDraw?.call(this, ctx)\n // 清空画布\n ctx.clearRect(-this.Radius, -this.Radius, this.Radius * 2, this.Radius * 2)\n // 计算 padding 并绘制 blocks 边框\n this.prizeRadius = this.blocks.reduce((radius, block, blockIndex) => {\n this.drawBlock(radius, block, blockIndex)\n return radius - this.getLength(block.padding && block.padding.split(' ')[0])\n }, this.Radius)\n // 计算起始弧度\n this.prizeDeg = 360 / this.prizes.length\n this.prizeAng = getAngle(this.prizeDeg)\n const shortSide = this.prizeRadius * Math.sin(this.prizeAng / 2) * 2\n // 起始角度调整到正上方, 并且减去半个扇形角度\n let start = getAngle(this.rotateDeg - 90 + this.prizeDeg / 2 + _defaultConfig.offsetDegree)\n // 计算文字横坐标\n const getFontX = (font: FontItemType, line: string) => {\n return this.getOffsetX(ctx.measureText(line).width) + this.getLength(font.left, shortSide)\n }\n // 计算文字纵坐标\n const getFontY = (font: FontItemType, height: number, lineIndex: number) => {\n // 优先使用字体行高, 要么使用默认行高, 其次使用字体大小, 否则使用默认字体大小\n const lineHeight = font.lineHeight || _defaultStyle.lineHeight || font.fontSize || _defaultStyle.fontSize\n return this.getLength(font.top, height) + (lineIndex + 1) * this.getLength(lineHeight)\n }\n ctx.save()\n // 绘制prizes奖品区域\n this.prizes.forEach((prize, prizeIndex) => {\n // 计算当前奖品区域中间坐标点\n let currMiddleDeg = start + prizeIndex * this.prizeAng\n // 奖品区域可见高度\n let prizeHeight = this.prizeRadius - this.maxBtnRadius\n // 绘制背景\n const background = prize.background || _defaultStyle.background\n if (hasBackground(background)) {\n ctx.fillStyle = background\n fanShapedByArc(\n ctx, this.maxBtnRadius, this.prizeRadius,\n currMiddleDeg - this.prizeAng / 2,\n currMiddleDeg + this.prizeAng / 2,\n this.getLength(_defaultConfig.gutter),\n )\n ctx.fill()\n }\n // 计算临时坐标并旋转文字\n let x = Math.cos(currMiddleDeg) * this.prizeRadius\n let y = Math.sin(currMiddleDeg) * this.prizeRadius\n ctx.translate(x, y)\n ctx.rotate(currMiddleDeg + getAngle(90))\n // 绘制图片\n prize.imgs && prize.imgs.forEach((imgInfo, imgIndex) => {\n const prizeImg = this.ImageCache.get(imgInfo.src)\n if (!prizeImg) return\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(\n prizeImg,\n imgInfo,\n this.prizeAng * this.prizeRadius,\n prizeHeight\n )\n const [xAxis, yAxis] = [\n this.getOffsetX(trueWidth) + this.getLength(imgInfo.left, shortSide),\n this.getLength(imgInfo.top, prizeHeight)\n ]\n this.drawImage(ctx, prizeImg, xAxis, yAxis, trueWidth, trueHeight)\n })\n // 逐行绘制文字\n prize.fonts && prize.fonts.forEach(font => {\n const fontColor = font.fontColor || _defaultStyle.fontColor\n const fontWeight = font.fontWeight || _defaultStyle.fontWeight\n const fontSize = this.getLength(font.fontSize || _defaultStyle.fontSize)\n const fontStyle = font.fontStyle || _defaultStyle.fontStyle\n const wordWrap = has(font, 'wordWrap') ? font.wordWrap : _defaultStyle.wordWrap\n const lengthLimit = font.lengthLimit || _defaultStyle.lengthLimit\n const lineClamp = font.lineClamp || _defaultStyle.lineClamp\n ctx.fillStyle = fontColor\n ctx.font = `${fontWeight} ${fontSize >> 0}px ${fontStyle}`\n let lines = [], text = String(font.text)\n if (wordWrap) {\n lines = splitText(ctx, removeEnter(text), (lines) => {\n // 三角形临边\n const adjacentSide = this.prizeRadius - getFontY(font, prizeHeight, lines.length)\n // 三角形短边\n const shortSide = adjacentSide * Math.tan(this.prizeAng / 2)\n // 最大宽度\n let maxWidth = shortSide * 2 - this.getLength(_defaultConfig.gutter)\n return this.getLength(lengthLimit, maxWidth)\n }, lineClamp)\n } else {\n lines = text.split('\\n')\n }\n lines.filter(line => !!line).forEach((line, lineIndex) => {\n ctx.fillText(line, getFontX(font, line), getFontY(font, prizeHeight, lineIndex))\n })\n })\n // 修正旋转角度和原点坐标\n ctx.rotate(getAngle(360) - currMiddleDeg - getAngle(90))\n ctx.translate(-x, -y)\n })\n ctx.restore()\n // 绘制按钮\n this.buttons.forEach((btn, btnIndex) => {\n let radius = this.getLength(btn.radius, this.prizeRadius)\n // 绘制背景颜色\n this.maxBtnRadius = Math.max(this.maxBtnRadius, radius)\n if (hasBackground(btn.background)) {\n ctx.beginPath()\n ctx.fillStyle = btn.background as string\n ctx.arc(0, 0, radius, 0, Math.PI * 2, false)\n ctx.fill()\n }\n // 绘制指针\n if (btn.pointer && hasBackground(btn.background)) {\n ctx.beginPath()\n ctx.fillStyle = btn.background as string\n ctx.moveTo(-radius, 0)\n ctx.lineTo(radius, 0)\n ctx.lineTo(0, -radius * 2)\n ctx.closePath()\n ctx.fill()\n }\n // 绘制按钮图片\n btn.imgs && btn.imgs.forEach((imgInfo, imgIndex) => {\n const btnImg = this.ImageCache.get(imgInfo.src)\n if (!btnImg) return\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(btnImg, imgInfo, radius * 2, radius * 2)\n const [xAxis, yAxis] = [this.getOffsetX(trueWidth) + this.getLength(imgInfo.left, radius), this.getLength(imgInfo.top, radius)]\n this.drawImage(ctx, btnImg, xAxis, yAxis, trueWidth, trueHeight)\n })\n // 绘制按钮文字\n btn.fonts && btn.fonts.forEach(font => {\n let fontColor = font.fontColor || _defaultStyle.fontColor\n let fontWeight = font.fontWeight || _defaultStyle.fontWeight\n let fontSize = this.getLength(font.fontSize || _defaultStyle.fontSize)\n let fontStyle = font.fontStyle || _defaultStyle.fontStyle\n ctx.fillStyle = fontColor\n ctx.font = `${fontWeight} ${fontSize >> 0}px ${fontStyle}`\n String(font.text).split('\\n').forEach((line, lineIndex) => {\n ctx.fillText(line, getFontX(font, line), getFontY(font, radius, lineIndex))\n })\n })\n })\n // 触发绘制后回调\n config.afterDraw?.call(this, ctx)\n }\n\n /**\n * 刻舟求剑\n */\n private carveOnGunwaleOfAMovingBoat (): void {\n const { _defaultConfig, prizeFlag, prizeDeg, rotateDeg } = this\n this.endTime = Date.now()\n const stopDeg = this.stopDeg = rotateDeg\n const speed = _defaultConfig.speed\n const stopRange = (Math.random() * prizeDeg - prizeDeg / 2) * this.getLength(_defaultConfig.stopRange)\n let i = 0, prevSpeed = 0, prevDeg = 0\n while (++i) {\n const endDeg = 360 * i - prizeFlag! * prizeDeg - rotateDeg - _defaultConfig.offsetDegree + stopRange - prizeDeg / 2\n let currSpeed = quad.easeOut(this.FPS, stopDeg, endDeg, _defaultConfig.decelerationTime) - stopDeg\n if (currSpeed > speed) {\n this.endDeg = (speed - prevSpeed > currSpeed - speed) ? endDeg : prevDeg\n break\n }\n prevDeg = endDeg\n prevSpeed = currSpeed\n }\n }\n\n /**\n * 对外暴露: 开始抽奖方法\n */\n public play (): void {\n if (this.step !== 0) return\n // 记录游戏开始时间\n this.startTime = Date.now()\n // 重置中奖索引\n this.prizeFlag = void 0\n // 加速阶段\n this.step = 1\n // 触发回调\n this.config.afterStart?.()\n // 开始游戏\n this.run()\n }\n\n /**\n * 对外暴露: 缓慢停止方法\n * @param index 中奖索引\n */\n public stop (index?: number): void {\n if (this.step === 0 || this.step === 3) return\n // 如果没有传递中奖索引, 则通过range属性计算一个\n if (!index && index !== 0) {\n const rangeArr = this.prizes.map(item => item.range)\n index = computeRange(rangeArr)\n }\n // 如果index是负数则停止游戏, 反之则传递中奖索引\n if (index < 0) {\n this.step = 0\n this.prizeFlag = -1\n } else {\n this.step = 2\n this.prizeFlag = index % this.prizes.length\n }\n }\n\n /**\n * 实际开始执行方法\n * @param num 记录帧动画执行多少次\n */\n private run (num: number = 0): void {\n const { rAF, step, prizeFlag, _defaultConfig } = this\n const { accelerationTime, decelerationTime, speed } = _defaultConfig\n // 游戏结束\n if (step === 0) {\n this.endCallback?.(this.prizes.find((prize, index) => index === prizeFlag) || {})\n return\n }\n // 如果等于 -1 就直接停止游戏\n if (prizeFlag === -1) return\n // 计算结束位置\n if (step === 3 && !this.endDeg) this.carveOnGunwaleOfAMovingBoat()\n // 计算时间间隔\n const startInterval = Date.now() - this.startTime\n const endInterval = Date.now() - this.endTime\n let rotateDeg = this.rotateDeg\n // \n if (step === 1 || startInterval < accelerationTime) { // 加速阶段\n // 记录帧率\n this.FPS = startInterval / num\n const currSpeed = quad.easeIn(startInterval, 0, speed, accelerationTime)\n // 加速到峰值后, 进入匀速阶段\n if (currSpeed === speed) {\n this.step = 2\n }\n rotateDeg = rotateDeg + currSpeed % 360\n } else if (step === 2) { // 匀速阶段\n // 速度保持不变\n rotateDeg = rotateDeg + speed % 360\n // 如果 prizeFlag 有值, 则进入减速阶段\n if (prizeFlag !== void 0 && prizeFlag >= 0) {\n this.step = 3\n // 清空上一次的位置信息\n this.stopDeg = 0\n this.endDeg = 0\n }\n } else if (step === 3) { // 减速阶段\n // 开始缓慢停止\n rotateDeg = quad.easeOut(endInterval, this.stopDeg, this.endDeg, decelerationTime)\n if (endInterval >= decelerationTime) {\n this.step = 0\n }\n } else {\n // 出现异常\n this.stop(-1)\n }\n this.rotateDeg = rotateDeg\n this.draw()\n rAF(this.run.bind(this, num + 1))\n }\n\n /**\n * 换算渲染坐标\n * @param x\n * @param y\n */\n protected conversionAxis (x: number, y: number): [number, number] {\n const { config } = this\n return [x / config.dpr - this.Radius, y / config.dpr - this.Radius]\n }\n}\n","import Lucky from './lucky'\nimport { UserConfigType, ImgType } from '../types/index'\nimport LuckyGridConfig, {\n BlockType,\n PrizeType,\n ButtonType,\n CellFontType,\n CellImgType,\n RowsType,\n ColsType,\n CellType,\n DefaultConfigType,\n DefaultStyleType,\n ActiveStyleType,\n StartCallbackType,\n EndCallbackType,\n} from '../types/grid'\nimport {\n has,\n isExpectType,\n removeEnter,\n computePadding,\n hasBackground,\n computeRange,\n splitText\n} from '../utils/index'\nimport { roundRectByArc, getLinearGradient } from '../utils/math'\nimport { quad } from '../utils/tween'\n\nexport default class LuckyGrid extends Lucky {\n private rows: RowsType = 3\n private cols: ColsType = 3\n private blocks: Array = []\n private prizes: Array = []\n private buttons: Array = []\n private button?: ButtonType\n private defaultConfig: DefaultConfigType = {}\n private defaultStyle: DefaultStyleType = {}\n private activeStyle: ActiveStyleType = {}\n private _defaultConfig: Required = {} as Required\n private _defaultStyle: Required = {} as Required\n private _activeStyle: Required = {} as Required\n private startCallback?: StartCallbackType\n private endCallback?: EndCallbackType\n private cellWidth = 0 // 格子宽度\n private cellHeight = 0 // 格子高度\n private startTime = 0 // 开始时间戳\n private endTime = 0 // 结束时间戳\n private currIndex = 0 // 当前index累加\n private stopIndex = 0 // 刻舟求剑\n private endIndex = 0 // 停止索引\n private demo = false // 是否自动游走\n private timer = 0 // 游走定时器\n private FPS = 16.6 // 屏幕刷新率\n /**\n * 游戏当前的阶段\n * step = 0 时, 游戏尚未开始\n * step = 1 时, 此时处于加速阶段\n * step = 2 时, 此时处于匀速阶段\n * step = 3 时, 此时处于减速阶段\n */\n private step: 0 | 1 | 2 | 3 = 0\n /**\n * 中奖索引\n * prizeFlag = undefined 时, 处于开始抽奖阶段, 正常旋转\n * prizeFlag >= 0 时, 说明stop方法被调用, 并且传入了中奖索引\n * prizeFlag === -1 时, 说明stop方法被调用, 并且传入了负值, 本次抽奖无效\n */\n private prizeFlag: number | undefined = -1\n // 所有格子\n private cells: CellType[] = []\n // 奖品区域几何信息\n private prizeArea: { x: number, y: number, w: number, h: number } | undefined\n // 图片缓存\n private ImageCache = new Map()\n\n /**\n * 九宫格构造器\n * @param config 配置项\n * @param data 抽奖数据\n */\n constructor (config: UserConfigType, data: LuckyGridConfig) {\n super(config, {\n width: data.width,\n height: data.height\n })\n this.initData(data)\n this.initWatch()\n this.initComputed()\n // 创建前回调函数\n config.beforeCreate?.call(this)\n // 首次初始化\n this.init()\n }\n\n protected resize(): void {\n super.resize()\n this.draw()\n this.config.afterResize?.()\n }\n\n protected initLucky (): void {\n this.cellWidth = 0\n this.cellHeight = 0\n this.startTime = 0\n this.endTime = 0\n this.currIndex = 0\n this.stopIndex = 0\n this.endIndex = 0\n this.demo = false\n this.timer = 0\n this.FPS = 16.6\n this.prizeFlag = -1\n this.step = 0\n super.initLucky()\n }\n\n /**\n * 初始化数据\n * @param data\n */\n private initData (data: LuckyGridConfig): void {\n this.$set(this, 'width', data.width)\n this.$set(this, 'height', data.height)\n this.$set(this, 'rows', Number(data.rows) || 3)\n this.$set(this, 'cols', Number(data.cols) || 3)\n this.$set(this, 'blocks', data.blocks || [])\n this.$set(this, 'prizes', data.prizes || [])\n this.$set(this, 'buttons', data.buttons || [])\n // 临时过渡代码, 升级到2.x即可删除\n this.$set(this, 'button', data.button)\n this.$set(this, 'defaultConfig', data.defaultConfig || {})\n this.$set(this, 'defaultStyle', data.defaultStyle || {})\n this.$set(this, 'activeStyle', data.activeStyle || {})\n this.$set(this, 'startCallback', data.start)\n this.$set(this, 'endCallback', data.end)\n }\n\n /**\n * 初始化属性计算\n */\n private initComputed (): void {\n // 默认配置\n this.$computed(this, '_defaultConfig', () => {\n const config = {\n gutter: 5,\n speed: 20,\n accelerationTime: 2500,\n decelerationTime: 2500,\n ...this.defaultConfig\n }\n config.gutter = this.getLength(config.gutter)\n config.speed = config.speed / 40\n return config\n })\n // 默认样式\n this.$computed(this, '_defaultStyle', () => {\n return {\n borderRadius: 20,\n fontColor: '#000',\n fontSize: '18px',\n fontStyle: 'sans-serif',\n fontWeight: '400',\n background: 'rgba(0,0,0,0)',\n shadow: '',\n wordWrap: true,\n lengthLimit: '90%',\n ...this.defaultStyle\n }\n })\n // 中奖样式\n this.$computed(this, '_activeStyle', () => {\n return {\n background: '#ffce98',\n shadow: '',\n ...this.activeStyle\n }\n })\n }\n\n /**\n * 初始化观察者\n */\n private initWatch (): void {\n // 重置宽度\n this.$watch('width', (newVal: string | number) => {\n this.data.width = newVal\n this.resize()\n })\n // 重置高度\n this.$watch('height', (newVal: string | number) => {\n this.data.height = newVal\n this.resize()\n })\n // 监听 blocks 数据的变化\n this.$watch('blocks', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 监听 prizes 数据的变化\n this.$watch('prizes', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 监听 button 数据的变化\n this.$watch('buttons', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n this.$watch('rows', () => this.init())\n this.$watch('cols', () => this.init())\n this.$watch('defaultConfig', () => this.draw(), { deep: true })\n this.$watch('defaultStyle', () => this.draw(), { deep: true })\n this.$watch('activeStyle', () => this.draw(), { deep: true })\n this.$watch('startCallback', () => this.init())\n this.$watch('endCallback', () => this.init())\n }\n\n /**\n * 初始化 canvas 抽奖\n */\n public async init (): Promise {\n this.initLucky()\n const { config } = this\n // 初始化前回调函数\n config.beforeInit?.call(this)\n // 先画一次防止闪烁\n this.draw()\n // 异步加载图片\n await this.initImageCache()\n // 初始化后回调函数\n config.afterInit?.call(this)\n }\n\n private initImageCache (): Promise {\n return new Promise((resolve) => {\n const btnImgs = this.buttons.map(btn => btn.imgs)\n if (this.button) btnImgs.push(this.button.imgs)\n const willUpdateImgs = {\n blocks: this.blocks.map(block => block.imgs),\n prizes: this.prizes.map(prize => prize.imgs),\n buttons: btnImgs,\n }\n ;(<(keyof typeof willUpdateImgs)[]>Object.keys(willUpdateImgs)).forEach(imgName => {\n const willUpdate = willUpdateImgs[imgName]\n // 循环遍历所有图片\n const allPromise: Promise[] = []\n willUpdate && willUpdate.forEach((imgs, cellIndex) => {\n imgs && imgs.forEach((imgInfo, imgIndex) => {\n allPromise.push(this.loadAndCacheImg(imgName, cellIndex, imgIndex))\n })\n })\n Promise.all(allPromise).then(() => {\n this.draw()\n resolve()\n })\n })\n })\n }\n\n /**\n * canvas点击事件\n * @param e 事件参数\n */\n protected handleClick (e: MouseEvent): void {\n const { ctx } = this\n ;[\n ...this.buttons,\n this.button\n ].forEach(btn => {\n if (!btn) return\n const [x, y, width, height] = this.getGeometricProperty([\n btn.x, btn.y, btn.col || 1, btn.row || 1\n ])\n ctx.beginPath()\n ctx.rect(x, y, width, height)\n if (!ctx.isPointInPath(e.offsetX, e.offsetY)) return\n if (this.step !== 0) return\n // 如果btn里有单独的回调方法, 优先触发\n if (typeof btn.callback === 'function') btn.callback.call(this, btn)\n // 最后触发公共回调\n this.startCallback?.(e, btn)\n })\n }\n\n /**\n * 根据索引单独加载指定图片并缓存\n * @param cellName 模块名称\n * @param cellIndex 模块索引\n * @param imgName 模块对应的图片缓存\n * @param imgIndex 图片索引\n */\n private async loadAndCacheImg (\n cellName: 'blocks' | 'prizes' | 'buttons',\n cellIndex: number,\n imgIndex: number\n ): Promise {\n return new Promise((resolve, reject) => {\n let cell: BlockType | PrizeType | ButtonType = this[cellName][cellIndex]\n // 临时过渡代码, 升级到2.x即可删除\n if (cellName === 'buttons' && !this.buttons.length && this.button) {\n cell = this.button\n }\n if (!cell || !cell.imgs) return\n const imgInfo = cell.imgs[imgIndex]\n if (!imgInfo) return\n // 异步加载图片\n const request = [\n this.loadImg(imgInfo.src, imgInfo),\n imgInfo['activeSrc'] && this.loadImg(imgInfo['activeSrc'], imgInfo, '$activeResolve')\n ]\n Promise.all(request).then(async ([defaultImg, activeImg]) => {\n const formatter = imgInfo.formatter\n // 对图片进行处理\n if (typeof formatter === 'function') {\n defaultImg = await Promise.resolve(formatter.call(this, defaultImg))\n if (activeImg) {\n activeImg = await Promise.resolve(formatter.call(this, activeImg))\n }\n }\n this.ImageCache.set(imgInfo['src'], defaultImg)\n activeImg && this.ImageCache.set(imgInfo['activeSrc'], activeImg)\n resolve()\n }).catch(err => {\n console.error(`${cellName}[${cellIndex}].imgs[${imgIndex}] ${err}`)\n reject()\n })\n })\n }\n\n /**\n * 绘制九宫格抽奖\n */\n protected draw (): void {\n const { config, ctx, _defaultConfig, _defaultStyle, _activeStyle } = this\n // 触发绘制前回调\n config.beforeDraw?.call(this, ctx)\n // 清空画布\n ctx.clearRect(0, 0, this.boxWidth, this.boxHeight)\n // 合并奖品和按钮\n this.cells = [\n ...this.prizes,\n ...this.buttons\n ]\n if (this.button) this.cells.push(this.button)\n this.cells.forEach(cell => {\n cell.col = cell.col || 1\n cell.row = cell.row || 1\n })\n // 计算获取奖品区域的几何信息\n this.prizeArea = this.blocks.reduce(({x, y, w, h}, block, blockIndex) => {\n const [paddingTop, paddingBottom, paddingLeft, paddingRight] = computePadding(block, this.getLength.bind(this))\n const r = block.borderRadius ? this.getLength(block.borderRadius) : 0\n // 绘制边框\n const background = block.background\n if (hasBackground(background)) {\n ctx.fillStyle = this.handleBackground(x, y, w, h, background!)\n roundRectByArc(ctx, x, y, w, h, r)\n ctx.fill()\n }\n // 绘制图片\n block.imgs && block.imgs.forEach((imgInfo, imgIndex) => {\n const blockImg = this.ImageCache.get(imgInfo.src)\n if (!blockImg) return\n // 绘制图片\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(blockImg, imgInfo, w, h)\n const [xAxis, yAxis] = [\n this.getOffsetX(trueWidth, w) + this.getLength(imgInfo.left, w),\n this.getLength(imgInfo.top, h)\n ]\n this.drawImage(ctx, blockImg, x + xAxis, y + yAxis, trueWidth, trueHeight)\n })\n return {\n x: x + paddingLeft,\n y: y + paddingTop,\n w: w - paddingLeft - paddingRight,\n h: h - paddingTop - paddingBottom\n }\n }, { x: 0, y: 0, w: this.boxWidth, h: this.boxHeight })\n // 计算单一奖品格子的宽度和高度\n this.cellWidth = (this.prizeArea.w - _defaultConfig.gutter * (this.cols - 1)) / this.cols\n this.cellHeight = (this.prizeArea.h - _defaultConfig.gutter * (this.rows - 1)) / this.rows\n // 绘制所有格子\n this.cells.forEach((cell, cellIndex) => {\n let [x, y, width, height] = this.getGeometricProperty([cell.x, cell.y, cell.col!, cell.row!])\n // 默认不显示中奖标识\n let isActive = false\n // 只要 prizeFlag 不是负数, 就显示中奖标识\n if (this.prizeFlag === void 0 || this.prizeFlag > -1) {\n isActive = cellIndex === this.currIndex % this.prizes.length >> 0\n }\n // 绘制背景色\n const background = isActive ? _activeStyle.background : (cell.background || _defaultStyle.background)\n if (hasBackground(background)) {\n // 处理阴影 (暂时先用any, 这里后续要优化)\n const shadow: any = (\n isActive ? _activeStyle.shadow : (cell.shadow || _defaultStyle.shadow)\n )\n .replace(/px/g, '') // 清空px字符串\n .split(',')[0].split(' ') // 防止有人声明多个阴影, 截取第一个阴影\n .map((n, i) => i < 3 ? Number(n) : n) // 把数组的前三个值*像素比\n // 绘制阴影\n if (shadow.length === 4) {\n ctx.shadowColor = shadow[3]\n ctx.shadowOffsetX = shadow[0] * config.dpr\n ctx.shadowOffsetY = shadow[1] * config.dpr\n ctx.shadowBlur = shadow[2]\n // 修正(格子+阴影)的位置, 这里使用逗号运算符\n shadow[0] > 0 ? (width -= shadow[0]) : (width += shadow[0], x -= shadow[0])\n shadow[1] > 0 ? (height -= shadow[1]) : (height += shadow[1], y -= shadow[1])\n }\n // 绘制背景\n ctx.fillStyle = this.handleBackground(x, y, width, height, background)\n const borderRadius = this.getLength(cell.borderRadius ? cell.borderRadius : _defaultStyle.borderRadius)\n roundRectByArc(ctx, x, y, width, height, borderRadius)\n ctx.fill()\n // 清空阴影\n ctx.shadowColor = 'rgba(0, 0, 0, 0)'\n ctx.shadowOffsetX = 0\n ctx.shadowOffsetY = 0\n ctx.shadowBlur = 0\n }\n // 修正图片缓存\n let cellName = 'prizes'\n if (cellIndex >= this.prizes.length) {\n cellName = 'buttons'\n cellIndex -= this.prizes.length\n }\n // 绘制图片\n cell.imgs && cell.imgs.forEach((imgInfo, imgIndex) => {\n const cellImg = this.ImageCache.get(imgInfo.src)\n const activeImg = this.ImageCache.get(imgInfo['activeSrc'])\n if (!cellImg) return\n const renderImg = (isActive && activeImg) || cellImg\n if (!renderImg) return\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(renderImg, imgInfo, width, height)\n const [xAxis, yAxis] = [\n x + this.getOffsetX(trueWidth, width) + this.getLength(imgInfo.left, width),\n y + this.getLength(imgInfo.top, height)\n ]\n this.drawImage(ctx, renderImg, xAxis, yAxis, trueWidth, trueHeight)\n })\n // 绘制文字\n cell.fonts && cell.fonts.forEach(font => {\n // 字体样式\n const style = isActive && _activeStyle.fontStyle\n ? _activeStyle.fontStyle\n : (font.fontStyle || _defaultStyle.fontStyle)\n // 字体加粗\n const fontWeight = isActive && _activeStyle.fontWeight\n ? _activeStyle.fontWeight\n : (font.fontWeight || _defaultStyle.fontWeight)\n // 字体大小\n const size = isActive && _activeStyle.fontSize\n ? this.getLength(_activeStyle.fontSize)\n : this.getLength(font.fontSize || _defaultStyle.fontSize)\n // 字体行高\n const lineHeight = isActive && _activeStyle.lineHeight\n ? _activeStyle.lineHeight\n : font.lineHeight || _defaultStyle.lineHeight || font.fontSize || _defaultStyle.fontSize\n const wordWrap = has(font, 'wordWrap') ? font.wordWrap : _defaultStyle.wordWrap\n const lengthLimit = font.lengthLimit || _defaultStyle.lengthLimit\n const lineClamp = font.lineClamp || _defaultStyle.lineClamp\n ctx.font = `${fontWeight} ${size >> 0}px ${style}`\n ctx.fillStyle = (isActive && _activeStyle.fontColor) ? _activeStyle.fontColor : (font.fontColor || _defaultStyle.fontColor)\n let lines = [], text = String(font.text)\n // 计算文字换行\n if (wordWrap) {\n // 最大宽度\n let maxWidth = this.getLength(lengthLimit, width)\n lines = splitText(ctx, removeEnter(text), () => maxWidth, lineClamp)\n } else {\n lines = text.split('\\n')\n }\n lines.forEach((line, lineIndex) => {\n ctx.fillText(\n line,\n x + this.getOffsetX(ctx.measureText(line).width, width) + this.getLength(font.left, width),\n y + this.getLength(font.top, height) + (lineIndex + 1) * this.getLength(lineHeight)\n )\n })\n })\n })\n // 触发绘制后回调\n config.afterDraw?.call(this, ctx)\n }\n\n /**\n * 处理背景色\n * @param x\n * @param y\n * @param width\n * @param height\n * @param background\n * @param isActive\n */\n private handleBackground (\n x: number,\n y: number,\n width: number,\n height: number,\n background: string,\n ) {\n const { ctx } = this\n // 处理线性渐变\n if (background.includes('linear-gradient')) {\n background = getLinearGradient(ctx, x, y, width, height, background)\n }\n return background\n }\n\n /**\n * 刻舟求剑\n */\n private carveOnGunwaleOfAMovingBoat (): void {\n const { _defaultConfig, prizeFlag, currIndex } = this\n this.endTime = Date.now()\n const stopIndex = this.stopIndex = currIndex\n const speed = _defaultConfig.speed\n let i = 0, prevSpeed = 0, prevIndex = 0\n while (++i) {\n const endIndex = this.prizes.length * i + prizeFlag! - (stopIndex)\n const currSpeed = quad.easeOut(this.FPS, stopIndex, endIndex, _defaultConfig.decelerationTime) - stopIndex\n if (currSpeed > speed) {\n this.endIndex = (speed - prevSpeed > currSpeed - speed) ? endIndex : prevIndex\n break\n }\n prevIndex = endIndex\n prevSpeed = currSpeed\n }\n }\n\n /**\n * 对外暴露: 开始抽奖方法\n */\n public play (): void {\n if (this.step !== 0) return\n // 记录游戏开始的时间\n this.startTime = Date.now()\n // 重置中奖索引\n this.prizeFlag = void 0\n // 开始加速\n this.step = 1\n // 触发回调\n this.config.afterStart?.()\n // 开始运行\n this.run()\n }\n\n /**\n * 对外暴露: 缓慢停止方法\n * @param index 中奖索引\n */\n public stop (index?: number): void {\n if (this.step === 0 || this.step === 3) return\n // 如果没有传递中奖索引, 则通过range属性计算一个\n if (!index && index !== 0) {\n const rangeArr = this.prizes.map(item => item.range)\n index = computeRange(rangeArr)\n }\n // 如果index是负数则停止游戏, 反之则传递中奖索引\n if (index < 0) {\n this.step = 0\n this.prizeFlag = -1\n } else {\n this.step = 2\n this.prizeFlag = index % this.prizes.length\n }\n }\n\n /**\n * 实际开始执行方法\n * @param num 记录帧动画执行多少次\n */\n private run (num: number = 0): void {\n const { rAF, step, prizes, prizeFlag, _defaultConfig } = this\n const { accelerationTime, decelerationTime, speed } = _defaultConfig\n // 结束游戏\n if (step === 0) {\n this.endCallback?.(this.prizes.find((prize, index) => index === prizeFlag) || {})\n return\n }\n // 如果等于 -1 就直接停止游戏\n if (prizeFlag === -1) return\n // 计算结束位置\n if (step === 3 && !this.endIndex) this.carveOnGunwaleOfAMovingBoat()\n // 计算时间间隔\n const startInterval = Date.now() - this.startTime\n const endInterval = Date.now() - this.endTime\n let currIndex = this.currIndex\n // \n if (step === 1 || startInterval < accelerationTime) { // 加速阶段\n // 记录帧率\n this.FPS = startInterval / num\n const currSpeed = quad.easeIn(startInterval, 0.1, speed - 0.1, accelerationTime)\n // 加速到峰值后, 进入匀速阶段\n if (currSpeed === speed) {\n this.step = 2\n }\n currIndex = currIndex + currSpeed % prizes.length\n } else if (step === 2) { // 匀速阶段\n // 速度保持不变\n currIndex = currIndex + speed % prizes.length\n // 如果 prizeFlag 有值, 则进入减速阶段\n if (prizeFlag !== void 0 && prizeFlag >= 0) {\n this.step = 3\n // 清空上一次的位置信息\n this.stopIndex = 0\n this.endIndex = 0\n }\n } else if (step === 3) { // 减速阶段\n // 开始缓慢停止\n currIndex = quad.easeOut(endInterval, this.stopIndex, this.endIndex, decelerationTime)\n if (endInterval >= decelerationTime) {\n this.step = 0\n }\n } else {\n // 出现异常\n this.stop(-1)\n }\n this.currIndex = currIndex\n this.draw()\n rAF(this.run.bind(this, num + 1))\n }\n\n /**\n * 计算奖品格子的几何属性\n * @param { array } [...矩阵坐标, col, row]\n * @return { array } [...真实坐标, width, height]\n */\n private getGeometricProperty ([x, y, col = 1, row = 1]: number[]) {\n const { cellWidth, cellHeight } = this\n const gutter = this._defaultConfig.gutter\n let res = [\n this.prizeArea!.x + (cellWidth + gutter) * x,\n this.prizeArea!.y + (cellHeight + gutter) * y\n ]\n col && row && res.push(\n cellWidth * col + gutter * (col - 1),\n cellHeight * row + gutter * (row - 1),\n )\n return res\n }\n\n /**\n * 换算渲染坐标\n * @param x\n * @param y\n */\n protected conversionAxis (x: number, y: number): [number, number] {\n const { config } = this\n return [x / config.dpr, y / config.dpr]\n }\n}\n","import Lucky from './lucky'\nimport { UserConfigType, ImgType, ImgItemType, Tuple } from '../types/index'\nimport SlotMachineConfig, {\n BlockType,\n PrizeType,\n SlotType,\n DefaultConfigType,\n DefaultStyleType,\n EndCallbackType,\n} from '../types/slot'\nimport {\n get, has,\n isExpectType,\n removeEnter,\n computePadding,\n hasBackground,\n computeRange,\n splitText,\n getSortedArrayByIndex\n} from '../utils/index'\nimport { roundRectByArc } from '../utils/math'\nimport { quad } from '../utils/tween'\n\nexport default class SlotMachine extends Lucky {\n // 背景\n private blocks: Array = []\n // 奖品列表\n private prizes: Array = []\n // 插槽列表\n private slots: Array = []\n // 默认配置\n private defaultConfig: DefaultConfigType = {}\n private _defaultConfig: Required = {} as Required\n // 默认样式\n private defaultStyle: DefaultStyleType = {}\n private _defaultStyle: Required = {} as Required\n private endCallback: EndCallbackType = () => {}\n // 离屏canvas\n private _offscreenCanvas?: HTMLCanvasElement\n private cellWidth = 0 // 格子宽度\n private cellHeight = 0 // 格子高度\n private cellAndSpacing = 0 // 格子+间距\n private widthAndSpacing = 0 // 格子宽度+列间距\n private heightAndSpacing = 0 // 格子高度+行间距\n private FPS = 16.6 // 屏幕刷新率\n private scroll: number[] = [] // 滚动的长度\n private stopScroll: number[] = [] // 刻舟求剑\n private endScroll: number[] = [] // 最终停止的长度\n private startTime = 0 // 开始游戏的时间\n private endTime = 0 // 开始停止的时间\n /**\n * 游戏当前的阶段\n * step = 0 时, 游戏尚未开始\n * step = 1 时, 此时处于加速阶段\n * step = 2 时, 此时处于匀速阶段\n * step = 3 时, 此时处于减速阶段\n */\n private step: 0 | 1 | 2 | 3 = 0\n /**\n * 中奖索引\n * prizeFlag = undefined 时, 处于开始抽奖阶段, 正常旋转\n * prizeFlag >= 0 时, 说明stop方法被调用, 并且传入了中奖索引\n * prizeFlag === -1 时, 说明stop方法被调用, 并且传入了负值, 本次抽奖无效\n */\n private prizeFlag: number[] | undefined = void 0\n // 奖品区域几何信息\n private prizeArea?: { x: number, y: number, w: number, h: number }\n // 图片缓存\n private ImageCache = new Map()\n\n /**\n * 老虎机构造器\n * @param config 配置项\n * @param data 抽奖数据\n */\n constructor (config: UserConfigType, data: SlotMachineConfig) {\n super(config, {\n width: data.width,\n height: data.height\n })\n this.initData(data)\n this.initWatch()\n this.initComputed()\n // 创建前回调函数\n config.beforeCreate?.call(this)\n // 首次初始化\n this.init()\n }\n\n protected resize(): void {\n super.resize()\n this.draw()\n this.config.afterResize?.()\n }\n\n protected initLucky (): void {\n this.cellWidth = 0\n this.cellHeight = 0\n this.cellAndSpacing = 0\n this.widthAndSpacing = 0\n this.heightAndSpacing = 0\n this.FPS = 16.6\n this.scroll = []\n this.stopScroll = []\n this.endScroll = []\n this.startTime = 0\n this.endTime = 0\n this.prizeFlag = void 0\n this.step = 0\n super.initLucky()\n }\n\n /**\n * 初始化数据\n * @param data\n */\n private initData (data: SlotMachineConfig): void {\n this.$set(this, 'width', data.width)\n this.$set(this, 'height', data.height)\n this.$set(this, 'blocks', data.blocks || [])\n this.$set(this, 'prizes', data.prizes || [])\n this.$set(this, 'slots', data.slots || [])\n this.$set(this, 'defaultConfig', data.defaultConfig || {})\n this.$set(this, 'defaultStyle', data.defaultStyle || {})\n this.$set(this, 'endCallback', data.end)\n }\n\n /**\n * 初始化属性计算\n */\n private initComputed (): void {\n // 默认配置\n this.$computed(this, '_defaultConfig', () => {\n const config = {\n mode: 'vertical',\n rowSpacing: 0,\n colSpacing: 5,\n speed: 20,\n direction: 1,\n accelerationTime: 2500,\n decelerationTime: 2500,\n ...this.defaultConfig\n }\n config.rowSpacing = this.getLength(config.rowSpacing)\n config.colSpacing = this.getLength(config.colSpacing)\n return config\n })\n // 默认样式\n this.$computed(this, '_defaultStyle', () => {\n return {\n borderRadius: 0,\n fontColor: '#000',\n fontSize: '18px',\n fontStyle: 'sans-serif',\n fontWeight: '400',\n background: 'rgba(0,0,0,0)',\n wordWrap: true,\n lengthLimit: '90%',\n ...this.defaultStyle\n }\n })\n }\n\n /**\n * 初始化观察者\n */\n private initWatch (): void {\n // 重置宽度\n this.$watch('width', (newVal: string | number) => {\n this.data.width = newVal\n this.resize()\n })\n // 重置高度\n this.$watch('height', (newVal: string | number) => {\n this.data.height = newVal\n this.resize()\n })\n // 监听 blocks 数据的变化\n this.$watch('blocks', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 监听 prizes 数据的变化\n this.$watch('prizes', (newData: Array) => {\n this.initImageCache()\n }, { deep: true })\n // 监听 prizes 数据的变化\n this.$watch('slots', (newData: Array) => {\n this.drawOffscreenCanvas()\n this.draw()\n }, { deep: true })\n this.$watch('defaultConfig', () => this.draw(), { deep: true })\n this.$watch('defaultStyle', () => this.draw(), { deep: true })\n this.$watch('endCallback', () => this.init())\n }\n\n /**\n * 初始化 canvas 抽奖\n */\n public async init (): Promise {\n this.initLucky()\n const { config } = this\n // 初始化前回调函数\n config.beforeInit?.call(this)\n // 先绘制一次\n this.drawOffscreenCanvas()\n this.draw()\n // 异步加载图片\n await this.initImageCache()\n // 初始化后回调函数\n config.afterInit?.call(this)\n }\n\n private initImageCache (): Promise {\n return new Promise((resolve) => {\n const willUpdateImgs = {\n blocks: this.blocks.map(block => block.imgs),\n prizes: this.prizes.map(prize => prize.imgs),\n }\n ;(<(keyof typeof willUpdateImgs)[]>Object.keys(willUpdateImgs)).forEach(imgName => {\n const willUpdate = willUpdateImgs[imgName]\n // 循环遍历所有图片\n const allPromise: Promise[] = []\n willUpdate && willUpdate.forEach((imgs, cellIndex) => {\n imgs && imgs.forEach((imgInfo, imgIndex) => {\n allPromise.push(this.loadAndCacheImg(imgName, cellIndex, imgIndex))\n })\n })\n Promise.all(allPromise).then(() => {\n this.drawOffscreenCanvas()\n this.draw()\n resolve()\n })\n })\n })\n }\n\n /**\n * 根据索引单独加载指定图片并缓存\n * @param cellName 模块名称\n * @param cellIndex 模块索引\n * @param imgName 模块对应的图片缓存\n * @param imgIndex 图片索引\n */\n private async loadAndCacheImg (\n cellName: 'blocks' | 'prizes',\n cellIndex: number,\n imgIndex: number\n ): Promise {\n return new Promise((resolve, reject) => {\n let cell: BlockType | PrizeType = this[cellName][cellIndex]\n if (!cell || !cell.imgs) return\n const imgInfo = cell.imgs[imgIndex]\n if (!imgInfo) return\n // 异步加载图片\n this.loadImg(imgInfo.src, imgInfo).then(async currImg => {\n if (typeof imgInfo.formatter === 'function') {\n currImg = await Promise.resolve(imgInfo.formatter.call(this, currImg))\n }\n this.ImageCache.set(imgInfo['src'], currImg)\n resolve()\n }).catch(err => {\n console.error(`${cellName}[${cellIndex}].imgs[${imgIndex}] ${err}`)\n reject()\n })\n })\n }\n\n /**\n * 绘制离屏canvas\n */\n protected drawOffscreenCanvas (): void {\n const { _defaultConfig, _defaultStyle } = this\n const { w, h } = this.drawBlocks()!\n // 计算单一奖品格子的宽度和高度\n const prizesLen = this.prizes.length\n const { cellWidth, cellHeight, widthAndSpacing, heightAndSpacing } = this.displacementWidthOrHeight()\n const defaultOrder = new Array(prizesLen).fill(void 0).map((v, i) => i)\n let maxOrderLen = 0, maxOffWidth = 0, maxOffHeight = 0\n this.slots.forEach((slot, slotIndex) => {\n // 初始化 scroll 的值\n if (this.scroll[slotIndex] === void 0) this.scroll[slotIndex] = 0\n // 如果没有order属性, 就填充prizes\n slot.order = slot.order || defaultOrder\n // 计算最大值\n const currLen = slot.order.length\n maxOrderLen = Math.max(maxOrderLen, currLen)\n maxOffWidth = Math.max(maxOffWidth, w + widthAndSpacing * currLen)\n maxOffHeight = Math.max(maxOffHeight, h + heightAndSpacing * currLen)\n })\n // 创建一个离屏Canvas来存储画布的内容\n const { _offscreenCanvas, _ctx } = this.getOffscreenCanvas(maxOffWidth, maxOffHeight)!\n this._offscreenCanvas = _offscreenCanvas\n // 绘制插槽\n this.slots.forEach((slot, slotIndex) => {\n const cellX = cellWidth * slotIndex\n const cellY = cellHeight * slotIndex\n let lengthOfCopy = 0\n // 绘制奖品\n const newPrizes = getSortedArrayByIndex(this.prizes, slot.order!)\n // 如果没有奖品则打断逻辑\n if (!newPrizes.length) return\n newPrizes.forEach((cell, cellIndex) => {\n if (!cell) return\n const orderIndex = slot.order![cellIndex]\n const prizesX = widthAndSpacing * cellIndex + _defaultConfig.colSpacing / 2\n const prizesY = heightAndSpacing * cellIndex + _defaultConfig.rowSpacing / 2\n const [_x, _y, spacing] = this.displacement(\n [cellX, prizesY, heightAndSpacing],\n [prizesX, cellY, widthAndSpacing]\n )\n lengthOfCopy += spacing\n // 绘制背景\n const background = cell.background || _defaultStyle.background\n if (hasBackground(background)) {\n const borderRadius = this.getLength(has(cell, 'borderRadius') ? cell.borderRadius : _defaultStyle.borderRadius)\n roundRectByArc(_ctx, _x, _y, cellWidth, cellWidth, borderRadius)\n _ctx.fillStyle = background\n _ctx.fill()\n }\n // 绘制图片\n cell.imgs && cell.imgs.forEach((imgInfo, imgIndex) => {\n const cellImg = this.ImageCache.get(imgInfo.src)\n if (!cellImg) return\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(cellImg, imgInfo, cellWidth, cellHeight)\n const [xAxis, yAxis] = [\n _x + this.getOffsetX(trueWidth, cellWidth) + this.getLength(imgInfo.left, cellWidth),\n _y + this.getLength(imgInfo.top, cellHeight)\n ]\n this.drawImage(_ctx, cellImg, xAxis, yAxis, trueWidth, trueHeight)\n })\n // 绘制文字\n cell.fonts && cell.fonts.forEach(font => {\n // 字体样式\n const style = font.fontStyle || _defaultStyle.fontStyle\n // 字体加粗\n const fontWeight = font.fontWeight || _defaultStyle.fontWeight\n // 字体大小\n const size = this.getLength(font.fontSize || _defaultStyle.fontSize)\n // 字体行高\n const lineHeight = font.lineHeight || _defaultStyle.lineHeight || font.fontSize || _defaultStyle.fontSize\n const wordWrap = has(font, 'wordWrap') ? font.wordWrap : _defaultStyle.wordWrap\n const lengthLimit = font.lengthLimit || _defaultStyle.lengthLimit\n const lineClamp = font.lineClamp || _defaultStyle.lineClamp\n _ctx.font = `${fontWeight} ${size >> 0}px ${style}`\n _ctx.fillStyle = font.fontColor || _defaultStyle.fontColor\n let lines = [], text = String(font.text)\n // 计算文字换行\n if (wordWrap) {\n // 最大宽度\n let maxWidth = this.getLength(lengthLimit, cellWidth)\n lines = splitText(_ctx, removeEnter(text), () => maxWidth, lineClamp)\n } else {\n lines = text.split('\\n')\n }\n lines.forEach((line, lineIndex) => {\n _ctx.fillText(\n line,\n _x + this.getOffsetX(_ctx.measureText(line).width, cellWidth) + this.getLength(font.left, cellWidth),\n _y + this.getLength(font.top, cellHeight) + (lineIndex + 1) * this.getLength(lineHeight)\n )\n })\n })\n })\n const [_x, _y, _w, _h] = this.displacement(\n [cellX, 0, cellWidth, lengthOfCopy],\n [0, cellY, lengthOfCopy, cellHeight]\n )\n let drawLen = lengthOfCopy\n while (drawLen < maxOffHeight + lengthOfCopy) {\n const [drawX, drawY] = this.displacement([_x, drawLen], [drawLen, _y])\n this.drawImage(\n _ctx, _offscreenCanvas,\n _x, _y, _w, _h,\n drawX, drawY, _w, _h\n )\n drawLen += lengthOfCopy\n }\n })\n }\n\n /**\n * 绘制背景区域\n */\n protected drawBlocks (): SlotMachine['prizeArea'] {\n const { config, ctx, _defaultConfig, _defaultStyle } = this\n // 绘制背景区域, 并计算奖品区域\n return this.prizeArea = this.blocks.reduce(({x, y, w, h}, block, blockIndex) => {\n const [paddingTop, paddingBottom, paddingLeft, paddingRight] = computePadding(block, this.getLength.bind(this))\n const r = block.borderRadius ? this.getLength(block.borderRadius) : 0\n // 绘制边框\n const background = block.background || _defaultStyle.background\n if (hasBackground(background)) {\n roundRectByArc(ctx, x, y, w, h, r)\n ctx.fillStyle = background\n ctx.fill()\n }\n // 绘制图片\n block.imgs && block.imgs.forEach((imgInfo, imgIndex) => {\n const blockImg = this.ImageCache.get(imgInfo.src)\n if (!blockImg) return\n // 绘制图片\n const [trueWidth, trueHeight] = this.computedWidthAndHeight(blockImg, imgInfo, w, h)\n const [xAxis, yAxis] = [this.getOffsetX(trueWidth, w) + this.getLength(imgInfo.left, w), this.getLength(imgInfo.top, h)]\n this.drawImage(ctx, blockImg, x + xAxis, y + yAxis, trueWidth, trueHeight)\n })\n return {\n x: x + paddingLeft,\n y: y + paddingTop,\n w: w - paddingLeft - paddingRight,\n h: h - paddingTop - paddingBottom\n }\n }, { x: 0, y: 0, w: this.boxWidth, h: this.boxHeight })\n }\n\n /**\n * 绘制老虎机抽奖\n */\n protected draw (): void {\n const { config, ctx, _defaultConfig, _defaultStyle } = this\n // 触发绘制前回调\n config.beforeDraw?.call(this, ctx)\n // 清空画布\n ctx.clearRect(0, 0, this.boxWidth, this.boxHeight)\n // 绘制背景\n const { x, y, w, h } = this.drawBlocks()!\n // 绘制插槽\n if (!this._offscreenCanvas) return\n const { cellWidth, cellHeight, cellAndSpacing, widthAndSpacing, heightAndSpacing } = this\n this.slots.forEach((slot, slotIndex) => {\n // 绘制临界点\n const _p = cellAndSpacing * slot.order!.length\n // 调整奖品垂直居中\n const start = this.displacement(-(h - heightAndSpacing) / 2, -(w - widthAndSpacing) / 2)\n let scroll = this.scroll[slotIndex] + start\n // scroll 会无限累加 1 / -1\n if (scroll < 0) {\n scroll = scroll % _p + _p\n }\n if (scroll > _p) {\n scroll = scroll % _p\n }\n const [sx, sy, sw, sh] = this.displacement(\n [cellWidth * slotIndex, scroll, cellWidth, h],\n [scroll, cellHeight * slotIndex, w, cellHeight]\n )\n const [dx, dy, dw, dh] = this.displacement(\n [x + widthAndSpacing * slotIndex, y, cellWidth, h],\n [x, y + heightAndSpacing * slotIndex, w, cellHeight]\n )\n this.drawImage(ctx, this._offscreenCanvas!, sx, sy, sw, sh, dx, dy, dw, dh)\n })\n }\n\n /**\n * 刻舟求剑\n */\n private carveOnGunwaleOfAMovingBoat (): void {\n const { _defaultConfig, prizeFlag, cellAndSpacing } = this\n // 记录开始停止的时间戳\n this.endTime = Date.now()\n this.slots.forEach((slot, slotIndex) => {\n const order = slot.order!\n if (!order.length) return\n const speed = slot.speed || _defaultConfig.speed\n const direction = slot.direction || _defaultConfig.direction\n const orderIndex = order.findIndex(prizeIndex => prizeIndex === prizeFlag![slotIndex])\n const _p = cellAndSpacing * order.length\n const stopScroll = this.stopScroll[slotIndex] = this.scroll[slotIndex]\n let i = 0\n while (++i) {\n const endScroll = cellAndSpacing * orderIndex + (_p * i * direction) - stopScroll\n const currSpeed = quad.easeOut(this.FPS, stopScroll, endScroll, _defaultConfig.decelerationTime) - stopScroll\n if (Math.abs(currSpeed) > speed) {\n this.endScroll[slotIndex] = endScroll\n break\n }\n }\n })\n }\n\n /**\n * 对外暴露: 开始抽奖方法\n */\n public play (): void {\n if (this.step !== 0) return\n // 记录开始游戏的时间\n this.startTime = Date.now()\n // 清空中奖索引\n this.prizeFlag = void 0\n // 开始加速\n this.step = 1\n // 触发回调\n this.config.afterStart?.()\n // 开始渲染\n this.run()\n }\n\n public stop (index: number | number[]): void {\n if (this.step === 0 || this.step === 3) return\n // 设置中奖索引\n if (typeof index === 'number') {\n this.prizeFlag = new Array(this.slots.length).fill(index)\n } else if (isExpectType(index, 'array')) {\n if (index.length === this.slots.length) {\n this.prizeFlag = index\n } else {\n this.stop(-1)\n return console.error(`stop([${index}]) 参数长度的不正确`)\n }\n } else {\n this.stop(-1)\n return console.error(`stop() 无法识别的参数类型 ${typeof index}`)\n }\n // 如果包含负数则停止游戏, 反之则继续游戏\n if (this.prizeFlag?.includes(-1)) {\n this.prizeFlag = []\n // 停止游戏\n this.step = 0\n } else {\n // 进入匀速\n this.step = 2\n }\n }\n\n /**\n * 让游戏动起来\n * @param num 记录帧动画执行多少次\n */\n private run (num: number = 0): void {\n const { rAF, step, prizeFlag, _defaultConfig, cellAndSpacing, slots } = this\n const { accelerationTime, decelerationTime } = _defaultConfig\n // 游戏结束\n if (this.step === 0 && prizeFlag?.length === slots.length) {\n let flag = prizeFlag[0]\n for (let i = 0; i < slots.length; i++) {\n const slot = slots[i], currFlag = prizeFlag[i]\n if (!slot.order?.includes(currFlag) || flag !== currFlag) {\n flag = -1\n break\n }\n }\n this.endCallback?.(this.prizes.find((prize, index) => index === flag) || void 0)\n return\n }\n // 如果长度为 0 就直接停止游戏\n if (prizeFlag !== void 0 && !prizeFlag.length) return\n // 计算最终停止的位置\n if (this.step === 3 && !this.endScroll.length) this.carveOnGunwaleOfAMovingBoat()\n // 计算时间间隔\n const startInterval = Date.now() - this.startTime\n const endInterval = Date.now() - this.endTime\n // 分别计算对应插槽的加速度\n slots.forEach((slot, slotIndex) => {\n const order = slot.order\n if (!order || !order.length) return\n const _p = cellAndSpacing * order.length\n const speed = Math.abs(slot.speed || _defaultConfig.speed)\n const direction = slot.direction || _defaultConfig.direction\n let scroll = 0, prevScroll = this.scroll[slotIndex]\n if (step === 1 || startInterval < accelerationTime) { // 加速阶段\n // 记录帧率\n this.FPS = startInterval / num\n const currSpeed = quad.easeIn(startInterval, 0, speed, accelerationTime)\n // 加速到最大速度后, 即可进入匀速阶段\n if (currSpeed === speed) {\n this.step = 2\n }\n scroll = (prevScroll + (currSpeed * direction)) % _p\n } else if (step === 2) { // 匀速阶段\n // 速度保持不变\n scroll = (prevScroll + (speed * direction)) % _p\n // 如果有 prizeFlag 有值, 则进入减速阶段\n if (prizeFlag?.length === slots.length) {\n this.step = 3\n // 清空上一轮的位置信息\n this.stopScroll = []\n this.endScroll = []\n }\n } else if (step === 3 && endInterval) { // 减速阶段\n // 开始缓慢停止\n const stopScroll = this.stopScroll[slotIndex]\n const endScroll = this.endScroll[slotIndex]\n scroll = quad.easeOut(endInterval, stopScroll, endScroll, decelerationTime)\n if (endInterval >= decelerationTime) {\n this.step = 0\n }\n }\n this.scroll[slotIndex] = scroll\n })\n this.draw()\n rAF(this.run.bind(this, num + 1))\n }\n\n // 根据mode置换数值\n private displacement (a: T, b: T): T {\n return this._defaultConfig.mode === 'horizontal' ? b : a\n }\n\n // 根据mode计算宽高\n private displacementWidthOrHeight () {\n const mode = this._defaultConfig.mode\n const slotsLen = this.slots.length\n const { colSpacing, rowSpacing } = this._defaultConfig\n const { x, y, w, h } = this.prizeArea || this.drawBlocks()!\n let cellWidth = 0, cellHeight = 0, widthAndSpacing = 0, heightAndSpacing = 0\n if (mode === 'horizontal') {\n cellHeight = this.cellHeight = (h - rowSpacing * (slotsLen - 1)) / slotsLen\n cellWidth = this.cellWidth = cellHeight\n } else {\n cellWidth = this.cellWidth = (w - colSpacing * (slotsLen - 1)) / slotsLen\n cellHeight = this.cellHeight = cellWidth\n }\n widthAndSpacing = this.widthAndSpacing = this.cellWidth + colSpacing\n heightAndSpacing = this.heightAndSpacing = this.cellHeight + rowSpacing\n if (mode === 'horizontal') {\n this.cellAndSpacing = widthAndSpacing\n } else {\n this.cellAndSpacing = heightAndSpacing\n }\n return {\n cellWidth,\n cellHeight,\n widthAndSpacing,\n heightAndSpacing,\n }\n }\n}\n","import { ImgType } from '../types/index'\nimport { roundRectByArc } from './math'\n\n/**\n * 根据路径获取图片对象\n * @param { string } src 图片路径\n * @returns { Promise } 图片标签\n */\nexport const getImage = (src: string): Promise => {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => resolve(img)\n img.onerror = err => reject(err)\n img.src = src\n })\n}\n\n/**\n * 切割圆角\n * @param img 将要裁剪的图片对象\n * @param radius 裁剪的圆角半径\n * @returns 返回一个离屏 canvas 用于渲染\n */\nexport const cutRound = (img: ImgType, radius: number): ImgType => {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')!\n const { width, height } = img\n canvas.width = width\n canvas.height = height\n roundRectByArc(ctx, 0, 0, width, height, radius)\n ctx.clip()\n ctx.drawImage(img, 0, 0, width, height)\n return canvas\n}\n\n/**\n * 透明度\n * @param img 将要处理的图片对象\n * @param opacity 透明度\n * @returns 返回一个离屏 canvas 用于渲染\n */\nexport const opacity = (\n img: ImgType,\n opacity: number\n): ImgType => {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')!\n const { width, height } = img\n canvas.width = width\n canvas.height = height\n // 绘制图片, 部分浏览器不支持 filter 属性, 需要处理兼容\n if (typeof ctx.filter === 'string') {\n ctx.filter = `opacity(${opacity * 100}%)`\n ctx.drawImage(img, 0, 0, width, height)\n } else {\n ctx.drawImage(img, 0, 0, width, height)\n const imageData = ctx.getImageData(0, 0, width, height)\n const { data } = imageData\n const len = data.length\n for (let i = 0; i < len; i += 4) {\n const alpha = data[i + 3]\n if (alpha !== 0) data[i + 3] = alpha * opacity\n }\n ctx.putImageData(imageData, 0, 0)\n }\n return canvas\n}\n\n/**\n * 权重矩阵\n * @param radius 模糊半径\n * @param sigma \n * @returns 返回一个权重和为1的矩阵\n */\nconst getMatrix = (radius: number, sigma?: number): number[] => {\n sigma = sigma || radius / 3\n const r = Math.ceil(radius)\n const sigma_2 = sigma * sigma\n const sigma2_2 = 2 * sigma_2\n const denominator = 1 / (2 * Math.PI * sigma_2)\n const matrix = []\n let total = 0\n // 计算权重矩阵\n for (let x = -r; x <= r; x++) {\n for (let y = -r; y <= r; y++) {\n // 套用二维高斯函数得到每个点的权重\n const res = denominator * Math.exp(-(x * x + y * y) / sigma2_2)\n matrix.push(res)\n total += res\n }\n }\n // 让矩阵中所有权重的和等于1\n for (let i = 0; i < matrix.length; i++) {\n matrix[i] /= total\n }\n return matrix\n}\n\n/**\n * 高斯模糊\n * @param img 将要处理的图片对象\n * @param radius 模糊半径\n * @returns 返回一个离屏 canvas 用于渲染\n */\nexport const blur = (\n img: ImgType,\n radius: number\n): ImgType => {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')!\n const { width, height } = img\n // 设置图片宽高\n canvas.width = width\n canvas.height = height\n ctx.drawImage(img, 0, 0, width, height)\n const ImageData = ctx.getImageData(0, 0, width, height)\n const { data } = ImageData\n const matrix = getMatrix(radius)\n const r = Math.ceil(radius)\n const w = width * 4\n const cols = r * 2 + 1\n const len = data.length, matrixLen = matrix.length\n for (let i = 0; i < len; i += 4) {\n // 处理\n }\n console.log(ImageData)\n ctx.putImageData(ImageData, 0, 0)\n return canvas\n}\n\nexport const getBase64Image = () => {\n\n}\n"],"names":["Array","prototype","includes","Object","defineProperty","value","valueToFind","fromIndex","TypeError","o","len","length","n","k","Math","max","abs","sameValueZero","x","y","isNaN","String","search","start","indexOf","find","predicate","thisArg","arguments","kValue","call"],"mappings":"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"} \ No newline at end of file diff --git a/components/lucky-canvas/dist/lucky-canvas.js b/components/lucky-canvas/dist/lucky-canvas.js new file mode 100644 index 0000000..46e8d4e --- /dev/null +++ b/components/lucky-canvas/dist/lucky-canvas.js @@ -0,0 +1,16 @@ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +var t=function(e,i){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i])},t(e,i)};function e(e,i){if("function"!=typeof i&&null!==i)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");function n(){this.constructor=e}t(e,i),e.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}var i=function(){return i=Object.assign||function(t){for(var e,i=1,n=arguments.length;i0&&r[r.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!r||o[1]>r[0]&&o[1]0&&c[0]<4?1:+(c[0]+c[1])),!u&&H&&(!(c=H.match(/Edge\/(\d+)/))||c[1]>=74)&&(c=H.match(/Chrome\/(\d+)/))&&(u=+c[1]);var X=u,G=!!Object.getOwnPropertySymbols&&!f((function(){var t=Symbol();return!String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&X&&X<41})),U=G&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,q=l.Object,Y=U?function(t){return"symbol"==typeof t}:function(t){var e=F("Symbol");return $(e)&&D(e.prototype,q(t))},K=l.String,V=l.TypeError,J=function(t){if($(t))return t;throw V(function(t){try{return K(t)}catch(t){return"Object"}}(t)+" is not a function")},Q=l.TypeError,Z=Object.defineProperty,tt=function(t,e){try{Z(l,t,{value:e,configurable:!0,writable:!0})}catch(i){l[t]=e}return e},et=l["__core-js_shared__"]||tt("__core-js_shared__",{}),it=s((function(t){(t.exports=function(t,e){return et[t]||(et[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.19.2",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})})),nt=l.Object,rt=function(t){return nt(_(t))},ot=x({}.hasOwnProperty),at=Object.hasOwn||function(t,e){return ot(rt(t),e)},st=0,ct=Math.random(),ut=x(1..toString),ht=function(t){return"Symbol("+(void 0===t?"":t)+")_"+ut(++st+ct,36)},lt=it("wks"),ft=l.Symbol,dt=ft&&ft.for,pt=U?ft:ft&&ft.withoutSetter||ht,gt=function(t){if(!at(lt,t)||!G&&"string"!=typeof lt[t]){var e="Symbol."+t;G&&at(ft,t)?lt[t]=ft[t]:lt[t]=U&&dt?dt(e):pt(e)}return lt[t]},vt=l.TypeError,mt=gt("toPrimitive"),yt=function(t,e){if(!j(t)||Y(t))return t;var i,n,r=null==(i=t[mt])?void 0:J(i);if(r){if(void 0===e&&(e="default"),n=g(r,t,e),!j(n)||Y(n))return n;throw vt("Can't convert object to primitive value")}return void 0===e&&(e="number"),function(t,e){var i,n;if("string"===e&&$(i=t.toString)&&!j(n=g(i,t)))return n;if($(i=t.valueOf)&&!j(n=g(i,t)))return n;if("string"!==e&&$(i=t.toString)&&!j(n=g(i,t)))return n;throw Q("Can't convert object to primitive value")}(t,e)},wt=function(t){var e=yt(t,"string");return Y(e)?e:e+""},bt=l.document,St=j(bt)&&j(bt.createElement),Ct=function(t){return St?bt.createElement(t):{}},zt=!d&&!f((function(){return 7!=Object.defineProperty(Ct("div"),"a",{get:function(){return 7}}).a})),xt=Object.getOwnPropertyDescriptor,Ot={f:d?xt:function(t,e){if(t=W(t),e=wt(e),zt)try{return xt(t,e)}catch(t){}if(at(t,e))return w(!g(y.f,t,e),t[e])}},kt=l.String,It=l.TypeError,Et=function(t){if(j(t))return t;throw It(kt(t)+" is not an object")},Tt=l.TypeError,At=Object.defineProperty,Pt={f:d?At:function(t,e,i){if(Et(t),e=wt(e),Et(i),zt)try{return At(t,e,i)}catch(t){}if("get"in i||"set"in i)throw Tt("Accessors not supported");return"value"in i&&(t[e]=i.value),t}},_t=d?function(t,e,i){return Pt.f(t,e,w(1,i))}:function(t,e,i){return t[e]=i,t},Wt=x(Function.toString);$(et.inspectSource)||(et.inspectSource=function(t){return Wt(t)});var $t,jt,Rt,Ft=et.inspectSource,Dt=l.WeakMap,Ht=$(Dt)&&/native code/.test(Ft(Dt)),Lt=it("keys"),Mt=function(t){return Lt[t]||(Lt[t]=ht(t))},Bt={},Nt=l.TypeError,Xt=l.WeakMap;if(Ht||et.state){var Gt=et.state||(et.state=new Xt),Ut=x(Gt.get),qt=x(Gt.has),Yt=x(Gt.set);$t=function(t,e){if(qt(Gt,t))throw new Nt("Object already initialized");return e.facade=t,Yt(Gt,t,e),e},jt=function(t){return Ut(Gt,t)||{}},Rt=function(t){return qt(Gt,t)}}else{var Kt=Mt("state");Bt[Kt]=!0,$t=function(t,e){if(at(t,Kt))throw new Nt("Object already initialized");return e.facade=t,_t(t,Kt,e),e},jt=function(t){return at(t,Kt)?t[Kt]:{}},Rt=function(t){return at(t,Kt)}}var Vt,Jt={set:$t,get:jt,has:Rt,enforce:function(t){return Rt(t)?jt(t):$t(t,{})},getterFor:function(t){return function(e){var i;if(!j(e)||(i=jt(e)).type!==t)throw Nt("Incompatible receiver, "+t+" required");return i}}},Qt=Function.prototype,Zt=d&&Object.getOwnPropertyDescriptor,te=at(Qt,"name"),ee={EXISTS:te,PROPER:te&&"something"===function(){}.name,CONFIGURABLE:te&&(!d||d&&Zt(Qt,"name").configurable)},ie=s((function(t){var e=ee.CONFIGURABLE,i=Jt.get,n=Jt.enforce,r=String(String).split("String");(t.exports=function(t,i,o,a){var s,c=!!a&&!!a.unsafe,u=!!a&&!!a.enumerable,h=!!a&&!!a.noTargetGet,f=a&&void 0!==a.name?a.name:i;$(o)&&("Symbol("===String(f).slice(0,7)&&(f="["+String(f).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!at(o,"name")||e&&o.name!==f)&&_t(o,"name",f),(s=n(o)).source||(s.source=r.join("string"==typeof f?f:""))),t!==l?(c?!h&&t[i]&&(u=!0):delete t[i],u?t[i]=o:_t(t,i,o)):u?t[i]=o:tt(i,o)})(Function.prototype,"toString",(function(){return $(this)&&i(this).source||Ft(this)}))})),ne=Math.ceil,re=Math.floor,oe=function(t){var e=+t;return e!=e||0===e?0:(e>0?re:ne)(e)},ae=Math.max,se=Math.min,ce=Math.min,ue=function(t){return(e=t.length)>0?ce(oe(e),9007199254740991):0;var e},he=function(t){return function(e,i,n){var r,o=W(e),a=ue(o),s=function(t,e){var i=oe(t);return i<0?ae(i+e,0):se(i,e)}(n,a);if(t&&i!=i){for(;a>s;)if((r=o[s++])!=r)return!0}else for(;a>s;s++)if((t||s in o)&&o[s]===i)return t||s||0;return!t&&-1}},le={includes:he(!0),indexOf:he(!1)},fe=le.indexOf,de=x([].push),pe=function(t,e){var i,n=W(t),r=0,o=[];for(i in n)!at(Bt,i)&&at(n,i)&&de(o,i);for(;e.length>r;)at(n,i=e[r++])&&(~fe(o,i)||de(o,i));return o},ge=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],ve=ge.concat("length","prototype"),me={f:Object.getOwnPropertyNames||function(t){return pe(t,ve)}},ye={f:Object.getOwnPropertySymbols},we=x([].concat),be=F("Reflect","ownKeys")||function(t){var e=me.f(Et(t)),i=ye.f;return i?we(e,i(t)):e},Se=function(t,e){for(var i=be(e),n=Pt.f,r=Ot.f,o=0;oa;)Pt.f(t,i=r[a++],n[i]);return t},We=F("document","documentElement"),$e=Mt("IE_PROTO"),je=function(){},Re=function(t){return" + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ba92e6c..dcbb3bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,15 +5,29 @@ "packages": { "": { "dependencies": { + "@lucky-canvas/uni": "^0.0.14", "js-md5": "^0.8.3", "uqrcodejs": "^4.0.7" } }, + "node_modules/@lucky-canvas/uni": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@lucky-canvas/uni/-/uni-0.0.14.tgz", + "integrity": "sha512-QSPMrYj5gxVxehHc9XwpL9vVoSLJd7RS70sHGO12QNHJ7t6hztgXdecMRel9/dvLlo9fRwOBdnthF332qgWeLA==", + "dependencies": { + "lucky-canvas": "~1.7.19" + } + }, "node_modules/js-md5": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz", "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==" }, + "node_modules/lucky-canvas": { + "version": "1.7.27", + "resolved": "https://registry.npmjs.org/lucky-canvas/-/lucky-canvas-1.7.27.tgz", + "integrity": "sha512-Ftz6qD+863bI7xijBmZg3dw3cNEc7odPr70EZQcGA14y3TgTAzH65HPosOCd6kKUlMwhntBaHMx3onoj9MtJRQ==" + }, "node_modules/uqrcodejs": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/uqrcodejs/-/uqrcodejs-4.0.7.tgz", diff --git a/package.json b/package.json index ae74e5f..0686126 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "@lucky-canvas/uni": "^0.0.14", "js-md5": "^0.8.3", "uqrcodejs": "^4.0.7" } diff --git a/pages.json b/pages.json index 675efc3..662eb79 100644 --- a/pages.json +++ b/pages.json @@ -389,6 +389,18 @@ "style": { "navigationStyle": "custom" } + }, + { + "path" : "pages/shouye/prize-wheel-demo", + "style": { + "navigationStyle": "custom" + } + }, + { + "path" : "pages/shouye/canvas-prize-demo", + "style": { + "navigationStyle": "custom" + } } ], "subPackages": [{ diff --git a/pages/shouye/canvas-prize-demo.vue b/pages/shouye/canvas-prize-demo.vue new file mode 100644 index 0000000..70ec637 --- /dev/null +++ b/pages/shouye/canvas-prize-demo.vue @@ -0,0 +1,223 @@ + + + + + \ No newline at end of file diff --git a/pages/shouye/index.vue b/pages/shouye/index.vue index f4682b4..123c587 100644 --- a/pages/shouye/index.vue +++ b/pages/shouye/index.vue @@ -8,7 +8,7 @@ - + diff --git a/pages/shouye/prize-wheel-demo.vue b/pages/shouye/prize-wheel-demo.vue new file mode 100644 index 0000000..e147560 --- /dev/null +++ b/pages/shouye/prize-wheel-demo.vue @@ -0,0 +1,202 @@ + + + + + \ No newline at end of file diff --git a/pages/shouye/slots.vue b/pages/shouye/slots.vue index f626b67..1ea95ab 100644 --- a/pages/shouye/slots.vue +++ b/pages/shouye/slots.vue @@ -1,175 +1,312 @@ \ No newline at end of file