微信小游戏1

作者: 魔王哪吒 | 来源:发表于2019-07-25 22:34 被阅读50次
    ## quickstart
    
    ## 源码目录介绍
    
    ./js
    ├── base                                   // 定义游戏开发基础类
    │   ├── animatoin.js                       // 帧动画的简易实现
    │   ├── pool.js                            // 对象池的简易实现
    │   └── sprite.js                          // 游戏基本元素精灵类
    ├── libs
    │   ├── symbol.js                          // ES6 Symbol简易兼容
    │   └── weapp-adapter.js                   // 小游戏适配器
    ├── npc
    │   └── enemy.js                           // 敌机类
    ├── player
    │   ├── bullet.js                          // 子弹类
    │   └── index.js                           // 玩家类
    ├── runtime
    │   ├── background.js                      // 背景类
    │   ├── gameinfo.js                        // 用于展示分数和结算界面
    │   └── music.js                           // 全局音效管理器
    ├── databus.js                             // 管控游戏状态
    └── main.js                                // 游戏入口主函数
    

    创建画布:

    const canvas = wx.createCanvas()
    

    游戏内容介绍
    游戏作品内容准确介绍〔包括但不限于:游戏背景、扮演角色、游戏角色(NPC)、场景、主要情节、玩法、功能(系统)、主要特点、游戏使用方法等〕,须逐项详细说明并配必要图片。

    请注意:

    1. 以下内容与所提交上线审核的版本一致,以免影响审核进度

    2. 以下内容所上传的所有图片都不能重复,如游戏内容较简单,建议通过截取不同场景、角色、关卡等以体现区别

    3、以下所有内容所上传图片需为游戏内截图,并请使用同一个机型的手机进行截图以保持图片大小一致

    4、以下所有内容文字描述及所附游戏截图须保持逐一匹配,请注意避免出现截图少于文字描述或无法对应的情况

    {
      "lockfileVersion": 1
    }
    
    image.png image.png image.png
    import './js/libs/weapp-adapter'
    import './js/libs/symbol'
    
    import Main from './js/main'
    
    new Main()
    
    image.png
    {
        "deviceOrientation": "portrait"
    }
    
    image.png
    {
        "description": "项目配置文件。",
        "setting": {
            "urlCheck": false,
            "es6": true,
            "postcss": true,
            "minified": true,
            "newFeature": true
        },
        "compileType": "game",
        "libVersion": "1.9.94",
        "appid": "",
        "projectname": "wxgame",
        "simulatorType": "wechat",
        "simulatorPluginLibVersion": {},
        "condition": {
            "search": {
                "current": -1,
                "list": []
            },
            "conversation": {
                "current": -1,
                "list": []
            },
            "game": {
                "currentL": -1,
                "list": []
            },
            "miniprogram": {
                "current": -1,
                "list": []
            }
        }
    }
    
    import Player     from './player/index'
    import Enemy      from './npc/enemy'
    import BackGround from './runtime/background'
    import GameInfo   from './runtime/gameinfo'
    import Music      from './runtime/music'
    import DataBus    from './databus'
    
    let ctx   = canvas.getContext('2d')
    let databus = new DataBus()
    
    /**
     * 游戏主函数
     */
    export default class Main {
      constructor() {
        // 维护当前requestAnimationFrame的id
        this.aniId    = 0
    
        this.restart()
      }
    
      restart() {
        databus.reset()
    
        canvas.removeEventListener(
          'touchstart',
          this.touchHandler
        )
    
        this.bg       = new BackGround(ctx)
        this.player   = new Player(ctx)
        this.gameinfo = new GameInfo()
        this.music    = new Music()
    
        this.bindLoop     = this.loop.bind(this)
        this.hasEventBind = false
    
        // 清除上一局的动画
        window.cancelAnimationFrame(this.aniId);
    
        this.aniId = window.requestAnimationFrame(
          this.bindLoop,
          canvas
        )
      }
    
      /**
       * 随着帧数变化的敌机生成逻辑
       * 帧数取模定义成生成的频率
       */
      enemyGenerate() {
        if ( databus.frame % 30 === 0 ) {
          let enemy = databus.pool.getItemByClass('enemy', Enemy)
          enemy.init(6)
          databus.enemys.push(enemy)
        }
      }
    
      // 全局碰撞检测
      collisionDetection() {
        let that = this
    
        databus.bullets.forEach((bullet) => {
          for ( let i = 0, il = databus.enemys.length; i < il;i++ ) {
            let enemy = databus.enemys[i]
    
            if ( !enemy.isPlaying && enemy.isCollideWith(bullet) ) {
              enemy.playAnimation()
              that.music.playExplosion()
    
              bullet.visible = false
              databus.score  += 1
    
              break
            }
          }
        })
    
        for ( let i = 0, il = databus.enemys.length; i < il;i++ ) {
          let enemy = databus.enemys[i]
    
          if ( this.player.isCollideWith(enemy) ) {
            databus.gameOver = true
    
            break
          }
        }
      }
    
      // 游戏结束后的触摸事件处理逻辑
      touchEventHandler(e) {
         e.preventDefault()
    
        let x = e.touches[0].clientX
        let y = e.touches[0].clientY
    
        let area = this.gameinfo.btnArea
    
        if (   x >= area.startX
            && x <= area.endX
            && y >= area.startY
            && y <= area.endY  )
          this.restart()
      }
    
      /**
       * canvas重绘函数
       * 每一帧重新绘制所有的需要展示的元素
       */
      render() {
        ctx.clearRect(0, 0, canvas.width, canvas.height)
    
        this.bg.render(ctx)
    
        databus.bullets
              .concat(databus.enemys)
              .forEach((item) => {
                  item.drawToCanvas(ctx)
                })
    
        this.player.drawToCanvas(ctx)
    
        databus.animations.forEach((ani) => {
          if ( ani.isPlaying ) {
            ani.aniRender(ctx)
          }
        })
    
        this.gameinfo.renderGameScore(ctx, databus.score)
    
        // 游戏结束停止帧循环
        if ( databus.gameOver ) {
          this.gameinfo.renderGameOver(ctx, databus.score)
    
          if ( !this.hasEventBind ) {
            this.hasEventBind = true
            this.touchHandler = this.touchEventHandler.bind(this)
            canvas.addEventListener('touchstart', this.touchHandler)
          }
        }
      }
    
      // 游戏逻辑更新主函数
      update() {
        if ( databus.gameOver )
          return;
    
        this.bg.update()
    
        databus.bullets
               .concat(databus.enemys)
               .forEach((item) => {
                  item.update()
                })
    
        this.enemyGenerate()
    
        this.collisionDetection()
    
        if ( databus.frame % 20 === 0 ) {
          this.player.shoot()
          this.music.playShoot()
        }
      }
    
      // 实现游戏帧循环
      loop() {
        databus.frame++
    
        this.update()
        this.render()
    
        this.aniId = window.requestAnimationFrame(
          this.bindLoop,
          canvas
        )
      }
    }
    
    image.png
    import Pool from './base/pool'
    
    let instance
    
    /**
     * 全局状态管理器
     */
    export default class DataBus {
      constructor() {
        if ( instance )
          return instance
    
        instance = this
    
        this.pool = new Pool()
    
        this.reset()
      }
    
      reset() {
        this.frame      = 0
        this.score      = 0
        this.bullets    = []
        this.enemys     = []
        this.animations = []
        this.gameOver   = false
      }
    
      /**
       * 回收敌人,进入对象池
       * 此后不进入帧循环
       */
      removeEnemey(enemy) {
        let temp = this.enemys.shift()
    
        temp.visible = false
    
        this.pool.recover('enemy', enemy)
      }
    
      /**
       * 回收子弹,进入对象池
       * 此后不进入帧循环
       */
      removeBullets(bullet) {
        let temp = this.bullets.shift()
    
        temp.visible = false
    
        this.pool.recover('bullet', bullet)
      }
    }
    
    image.png
    import Sprite from '../base/sprite'
    
    const screenWidth  = window.innerWidth
    const screenHeight = window.innerHeight
    
    const BG_IMG_SRC   = 'images/bg.jpg'
    const BG_WIDTH     = 512
    const BG_HEIGHT    = 512
    
    /**
     * 游戏背景类
     * 提供update和render函数实现无限滚动的背景功能
     */
    export default class BackGround extends Sprite {
      constructor(ctx) {
        super(BG_IMG_SRC, BG_WIDTH, BG_HEIGHT)
    
        this.top = 0
    
        this.render(ctx)
      }
    
      update() {
        this.top += 2
    
        if ( this.top >= screenHeight )
          this.top = 0
      }
    
      /**
       * 背景图重绘函数
       * 绘制两张图片,两张图片大小和屏幕一致
       * 第一张漏出高度为top部分,其余的隐藏在屏幕上面
       * 第二张补全除了top高度之外的部分,其余的隐藏在屏幕下面
       */
      render(ctx) {
        ctx.drawImage(
          this.img,
          0,
          0,
          this.width,
          this.height,
          0,
          -screenHeight + this.top,
          screenWidth,
          screenHeight
        )
    
        ctx.drawImage(
          this.img,
          0,
          0,
          this.width,
          this.height,
          0,
          this.top,
          screenWidth,
          screenHeight
        )
      }
    }
    
    const screenWidth  = window.innerWidth
    const screenHeight = window.innerHeight
    
    let atlas = new Image()
    atlas.src = 'images/Common.png'
    
    export default class GameInfo {
      renderGameScore(ctx, score) {
        ctx.fillStyle = "#ffffff"
        ctx.font      = "20px Arial"
    
        ctx.fillText(
          score,
          10,
          30
        )
      }
    
      renderGameOver(ctx, score) {
        ctx.drawImage(atlas, 0, 0, 119, 108, screenWidth / 2 - 150, screenHeight / 2 - 100, 300, 300)
    
        ctx.fillStyle = "#ffffff"
        ctx.font    = "20px Arial"
    
        ctx.fillText(
          '游戏结束',
          screenWidth / 2 - 40,
          screenHeight / 2 - 100 + 50
        )
    
        ctx.fillText(
          '得分: ' + score,
          screenWidth / 2 - 40,
          screenHeight / 2 - 100 + 130
        )
    
        ctx.drawImage(
          atlas,
          120, 6, 39, 24,
          screenWidth / 2 - 60,
          screenHeight / 2 - 100 + 180,
          120, 40
        )
    
        ctx.fillText(
          '重新开始',
          screenWidth / 2 - 40,
          screenHeight / 2 - 100 + 205
        )
    
        /**
         * 重新开始按钮区域
         * 方便简易判断按钮点击
         */
        this.btnArea = {
          startX: screenWidth / 2 - 40,
          startY: screenHeight / 2 - 100 + 180,
          endX  : screenWidth / 2  + 50,
          endY  : screenHeight / 2 - 100 + 255
        }
      }
    }
    
    let instance
    
    /**
     * 统一的音效管理器
     */
    export default class Music {
      constructor() {
        if ( instance )
          return instance
    
        instance = this
    
        this.bgmAudio = new Audio()
        this.bgmAudio.loop = true
        this.bgmAudio.src  = 'audio/bgm.mp3'
    
        this.shootAudio     = new Audio()
        this.shootAudio.src = 'audio/bullet.mp3'
    
        this.boomAudio     = new Audio()
        this.boomAudio.src = 'audio/boom.mp3'
    
        this.playBgm()
      }
    
      playBgm() {
        this.bgmAudio.play()
      }
    
      playShoot() {
        this.shootAudio.currentTime = 0
        this.shootAudio.play()
      }
    
      playExplosion() {
        this.boomAudio.currentTime = 0
        this.boomAudio.play()
      }
    }
    
    image.png
    import Sprite   from '../base/sprite'
    import DataBus  from '../databus'
    
    const BULLET_IMG_SRC = 'images/bullet.png'
    const BULLET_WIDTH   = 16
    const BULLET_HEIGHT  = 30
    
    const __ = {
      speed: Symbol('speed')
    }
    
    let databus = new DataBus()
    
    export default class Bullet extends Sprite {
      constructor() {
        super(BULLET_IMG_SRC, BULLET_WIDTH, BULLET_HEIGHT)
      }
    
      init(x, y, speed) {
        this.x = x
        this.y = y
    
        this[__.speed] = speed
    
        this.visible = true
      }
    
      // 每一帧更新子弹位置
      update() {
        this.y -= this[__.speed]
    
        // 超出屏幕外回收自身
        if ( this.y < -this.height )
          databus.removeBullets(this)
      }
    }
    
    import Sprite   from '../base/sprite'
    import Bullet   from './bullet'
    import DataBus  from '../databus'
    
    const screenWidth    = window.innerWidth
    const screenHeight   = window.innerHeight
    
    // 玩家相关常量设置
    const PLAYER_IMG_SRC = 'images/hero.png'
    const PLAYER_WIDTH   = 80
    const PLAYER_HEIGHT  = 80
    
    let databus = new DataBus()
    
    export default class Player extends Sprite {
      constructor() {
        super(PLAYER_IMG_SRC, PLAYER_WIDTH, PLAYER_HEIGHT)
    
        // 玩家默认处于屏幕底部居中位置
        this.x = screenWidth / 2 - this.width / 2
        this.y = screenHeight - this.height - 30
    
        // 用于在手指移动的时候标识手指是否已经在飞机上了
        this.touched = false
    
        this.bullets = []
    
        // 初始化事件监听
        this.initEvent()
      }
    
      /**
       * 当手指触摸屏幕的时候
       * 判断手指是否在飞机上
       * @param {Number} x: 手指的X轴坐标
       * @param {Number} y: 手指的Y轴坐标
       * @return {Boolean}: 用于标识手指是否在飞机上的布尔值
       */
      checkIsFingerOnAir(x, y) {
        const deviation = 30
    
        return !!(   x >= this.x - deviation
                  && y >= this.y - deviation
                  && x <= this.x + this.width + deviation
                  && y <= this.y + this.height + deviation  )
      }
    
      /**
       * 根据手指的位置设置飞机的位置
       * 保证手指处于飞机中间
       * 同时限定飞机的活动范围限制在屏幕中
       */
      setAirPosAcrossFingerPosZ(x, y) {
        let disX = x - this.width / 2
        let disY = y - this.height / 2
    
        if ( disX < 0 )
          disX = 0
    
        else if ( disX > screenWidth - this.width )
          disX = screenWidth - this.width
    
        if ( disY <= 0 )
          disY = 0
    
        else if ( disY > screenHeight - this.height )
          disY = screenHeight - this.height
    
        this.x = disX
        this.y = disY
      }
    
      /**
       * 玩家响应手指的触摸事件
       * 改变战机的位置
       */
      initEvent() {
        canvas.addEventListener('touchstart', ((e) => {
          e.preventDefault()
    
          let x = e.touches[0].clientX
          let y = e.touches[0].clientY
    
          //
          if ( this.checkIsFingerOnAir(x, y) ) {
            this.touched = true
    
            this.setAirPosAcrossFingerPosZ(x, y)
          }
    
        }).bind(this))
    
        canvas.addEventListener('touchmove', ((e) => {
          e.preventDefault()
    
          let x = e.touches[0].clientX
          let y = e.touches[0].clientY
    
          if ( this.touched )
            this.setAirPosAcrossFingerPosZ(x, y)
    
        }).bind(this))
    
        canvas.addEventListener('touchend', ((e) => {
          e.preventDefault()
    
          this.touched = false
        }).bind(this))
      }
    
      /**
       * 玩家射击操作
       * 射击时机由外部决定
       */
      shoot() {
        let bullet = databus.pool.getItemByClass('bullet', Bullet)
    
        bullet.init(
          this.x + this.width / 2 - bullet.width / 2,
          this.y - 10,
          10
        )
    
        databus.bullets.push(bullet)
      }
    }
    
    import Animation from '../base/animation'
    import DataBus   from '../databus'
    
    const ENEMY_IMG_SRC = 'images/enemy.png'
    const ENEMY_WIDTH   = 60
    const ENEMY_HEIGHT  = 60
    
    const __ = {
      speed: Symbol('speed')
    }
    
    let databus = new DataBus()
    
    function rnd(start, end){
      return Math.floor(Math.random() * (end - start) + start)
    }
    
    export default class Enemy extends Animation {
      constructor() {
        super(ENEMY_IMG_SRC, ENEMY_WIDTH, ENEMY_HEIGHT)
    
        this.initExplosionAnimation()
      }
    
      init(speed) {
        this.x = rnd(0, window.innerWidth - ENEMY_WIDTH)
        this.y = -this.height
    
        this[__.speed] = speed
    
        this.visible = true
      }
    
      // 预定义爆炸的帧动画
      initExplosionAnimation() {
        let frames = []
    
        const EXPLO_IMG_PREFIX  = 'images/explosion'
        const EXPLO_FRAME_COUNT = 19
    
        for ( let i = 0;i < EXPLO_FRAME_COUNT;i++ ) {
          frames.push(EXPLO_IMG_PREFIX + (i + 1) + '.png')
        }
    
        this.initFrames(frames)
      }
    
      // 每一帧更新子弹位置
      update() {
        this.y += this[__.speed]
    
        // 对象回收
        if ( this.y > window.innerHeight + this.height )
          databus.removeEnemey(this)
      }
    }
    
    /**
     * 对于ES6中Symbol的极简兼容
     * 方便模拟私有变量
     */
    
    let Symbol  = window.Symbol
    let idCounter = 0
    
    if (!Symbol) {
      Symbol = function Symbol(key) {
        return `__${key}_${Math.floor(Math.random() * 1e9)}_${++idCounter}__`
      }
    
      Symbol.iterator = Symbol('Symbol.iterator')
    }
    
    window.Symbol = Symbol
    
    /******/ (function(modules) { // webpackBootstrap
    /******/    // The module cache
    /******/    var installedModules = {}
    
    /******/    // The require function
    /******/    function __webpack_require__(moduleId) {
    
    /******/        // Check if module is in cache
    /******/        if(installedModules[moduleId])
    /******/            return installedModules[moduleId].exports
    
    /******/        // Create a new module (and put it into the cache)
    /******/        var module = installedModules[moduleId] = {
    /******/            exports: {},
    /******/            id: moduleId,
    /******/            loaded: false
    /******/        }
    
    /******/        // Execute the module function
    /******/        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)
    
    /******/        // Flag the module as loaded
    /******/        module.loaded = true
    
    /******/        // Return the exports of the module
    /******/        return module.exports
    /******/    }
    
    
    /******/    // expose the modules object (__webpack_modules__)
    /******/    __webpack_require__.m = modules
    
    /******/    // expose the module cache
    /******/    __webpack_require__.c = installedModules
    
    /******/    // __webpack_public_path__
    /******/    __webpack_require__.p = ""
    
    /******/    // Load entry module and return exports
    /******/    return __webpack_require__(0)
    /******/ })
    /************************************************************************/
    /******/ ([
    /* 0 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        var _window2 = __webpack_require__(1)
    
        var _window = _interopRequireWildcard(_window2)
    
        function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key] } } newObj.default = obj; return newObj } }
    
        var global = GameGlobal
    
        function inject() {
          _window.addEventListener = _window.canvas.addEventListener = function (type, listener) {
            _window.document.addEventListener(type, listener)
          }
          _window.removeEventListener = _window.canvas.removeEventListener = function (type, listener) {
            _window.document.removeEventListener(type, listener)
          }
    
          var _wx$getSystemInfoSync = wx.getSystemInfoSync(),
              platform = _wx$getSystemInfoSync.platform
    
          // 开发者工具无法重定义 window
    
    
          if (typeof __devtoolssubcontext === 'undefined' && platform === 'devtools') {
            for (var key in _window) {
              var descriptor = Object.getOwnPropertyDescriptor(global, key)
    
              if (!descriptor || descriptor.configurable === true) {
                Object.defineProperty(window, key, {
                  value: _window[key]
                })
              }
            }
    
            for (var _key in _window.document) {
              var _descriptor = Object.getOwnPropertyDescriptor(global.document, _key)
    
              if (!_descriptor || _descriptor.configurable === true) {
                Object.defineProperty(global.document, _key, {
                  value: _window.document[_key]
                })
              }
            }
            window.parent = window
          } else {
            for (var _key2 in _window) {
              global[_key2] = _window[_key2]
            }
            global.window = _window
            window = global
            window.top = window.parent = window
          }
        }
    
        if (!GameGlobal.__isAdapterInjected) {
          GameGlobal.__isAdapterInjected = true
          inject()
        }
    
    /***/ }),
    /* 1 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
        exports.cancelAnimationFrame = exports.requestAnimationFrame = exports.clearInterval = exports.clearTimeout = exports.setInterval = exports.setTimeout = exports.canvas = exports.location = exports.localStorage = exports.HTMLElement = exports.FileReader = exports.Audio = exports.Image = exports.WebSocket = exports.XMLHttpRequest = exports.navigator = exports.document = undefined
    
        var _WindowProperties = __webpack_require__(2)
    
        Object.keys(_WindowProperties).forEach(function (key) {
          if (key === "default" || key === "__esModule") return
          Object.defineProperty(exports, key, {
            enumerable: true,
            get: function get() {
              return _WindowProperties[key]
            }
          })
        })
    
        var _constructor = __webpack_require__(3)
    
        Object.keys(_constructor).forEach(function (key) {
          if (key === "default" || key === "__esModule") return
          Object.defineProperty(exports, key, {
            enumerable: true,
            get: function get() {
              return _constructor[key]
            }
          })
        })
    
        var _Canvas = __webpack_require__(9)
    
        var _Canvas2 = _interopRequireDefault(_Canvas)
    
        var _document2 = __webpack_require__(10)
    
        var _document3 = _interopRequireDefault(_document2)
    
        var _navigator2 = __webpack_require__(17)
    
        var _navigator3 = _interopRequireDefault(_navigator2)
    
        var _XMLHttpRequest2 = __webpack_require__(18)
    
        var _XMLHttpRequest3 = _interopRequireDefault(_XMLHttpRequest2)
    
        var _WebSocket2 = __webpack_require__(19)
    
        var _WebSocket3 = _interopRequireDefault(_WebSocket2)
    
        var _Image2 = __webpack_require__(11)
    
        var _Image3 = _interopRequireDefault(_Image2)
    
        var _Audio2 = __webpack_require__(12)
    
        var _Audio3 = _interopRequireDefault(_Audio2)
    
        var _FileReader2 = __webpack_require__(20)
    
        var _FileReader3 = _interopRequireDefault(_FileReader2)
    
        var _HTMLElement2 = __webpack_require__(4)
    
        var _HTMLElement3 = _interopRequireDefault(_HTMLElement2)
    
        var _localStorage2 = __webpack_require__(21)
    
        var _localStorage3 = _interopRequireDefault(_localStorage2)
    
        var _location2 = __webpack_require__(22)
    
        var _location3 = _interopRequireDefault(_location2)
    
        function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }
    
        exports.document = _document3.default
        exports.navigator = _navigator3.default
        exports.XMLHttpRequest = _XMLHttpRequest3.default
        exports.WebSocket = _WebSocket3.default
        exports.Image = _Image3.default
        exports.Audio = _Audio3.default
        exports.FileReader = _FileReader3.default
        exports.HTMLElement = _HTMLElement3.default
        exports.localStorage = _localStorage3.default
        exports.location = _location3.default
    
    
        // 暴露全局的 canvas
        var canvas = new _Canvas2.default()
    
        exports.canvas = canvas
        exports.setTimeout = setTimeout
        exports.setInterval = setInterval
        exports.clearTimeout = clearTimeout
        exports.clearInterval = clearInterval
        exports.requestAnimationFrame = requestAnimationFrame
        exports.cancelAnimationFrame = cancelAnimationFrame
    
    /***/ }),
    /* 2 */
    /***/ (function(module, exports) {
    
        "use strict"
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        var _wx$getSystemInfoSync = wx.getSystemInfoSync(),
            screenWidth = _wx$getSystemInfoSync.screenWidth,
            screenHeight = _wx$getSystemInfoSync.screenHeight,
            devicePixelRatio = _wx$getSystemInfoSync.devicePixelRatio
    
        var innerWidth = exports.innerWidth = screenWidth
        var innerHeight = exports.innerHeight = screenHeight
        exports.devicePixelRatio = devicePixelRatio
        var screen = exports.screen = {
          availWidth: innerWidth,
          availHeight: innerHeight
        }
        var performance = exports.performance = {
          now: function now() {
            return Date.now() / 1000
          }
        }
        var ontouchstart = exports.ontouchstart = null
        var ontouchmove = exports.ontouchmove = null
        var ontouchend = exports.ontouchend = null
    
    /***/ }),
    /* 3 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
        exports.HTMLCanvasElement = exports.HTMLImageElement = undefined
    
        var _HTMLElement3 = __webpack_require__(4)
    
        var _HTMLElement4 = _interopRequireDefault(_HTMLElement3)
    
        function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }
    
        function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function") } }
    
        function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called") } return call && (typeof call === "object" || typeof call === "function") ? call : self }
    
        function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass) } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass }
    
        var HTMLImageElement = exports.HTMLImageElement = function (_HTMLElement) {
          _inherits(HTMLImageElement, _HTMLElement)
    
          function HTMLImageElement() {
            _classCallCheck(this, HTMLImageElement)
    
            return _possibleConstructorReturn(this, (HTMLImageElement.__proto__ || Object.getPrototypeOf(HTMLImageElement)).call(this, 'img'))
          }
    
          return HTMLImageElement
        }(_HTMLElement4.default)
    
        var HTMLCanvasElement = exports.HTMLCanvasElement = function (_HTMLElement2) {
          _inherits(HTMLCanvasElement, _HTMLElement2)
    
          function HTMLCanvasElement() {
            _classCallCheck(this, HTMLCanvasElement)
    
            return _possibleConstructorReturn(this, (HTMLCanvasElement.__proto__ || Object.getPrototypeOf(HTMLCanvasElement)).call(this, 'canvas'))
          }
    
          return HTMLCanvasElement
        }(_HTMLElement4.default)
    
    /***/ }),
    /* 4 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor) } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor } }()
    
        var _Element2 = __webpack_require__(5)
    
        var _Element3 = _interopRequireDefault(_Element2)
    
        var _util = __webpack_require__(8)
    
        var _WindowProperties = __webpack_require__(2)
    
        function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }
    
        function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function") } }
    
        function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called") } return call && (typeof call === "object" || typeof call === "function") ? call : self }
    
        function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass) } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass }
    
        var HTMLElement = function (_Element) {
          _inherits(HTMLElement, _Element)
    
          function HTMLElement() {
            var tagName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''
    
            _classCallCheck(this, HTMLElement)
    
            var _this = _possibleConstructorReturn(this, (HTMLElement.__proto__ || Object.getPrototypeOf(HTMLElement)).call(this))
    
            _this.className = ''
            _this.childern = []
            _this.style = {
              width: _WindowProperties.innerWidth + 'px',
              height: _WindowProperties.innerHeight + 'px'
            }
            _this.insertBefore = _util.noop
            _this.innerHTML = ''
    
            _this.tagName = tagName.toUpperCase()
            return _this
          }
    
          _createClass(HTMLElement, [{
            key: 'setAttribute',
            value: function setAttribute(name, value) {
              this[name] = value
            }
          }, {
            key: 'getAttribute',
            value: function getAttribute(name) {
              return this[name]
            }
          }, {
            key: 'getBoundingClientRect',
            value: function getBoundingClientRect() {
              return {
                top: 0,
                left: 0,
                width: _WindowProperties.innerWidth,
                height: _WindowProperties.innerHeight
              }
            }
          }, {
            key: 'focus',
            value: function focus() {}
          }, {
            key: 'clientWidth',
            get: function get() {
              var ret = parseInt(this.style.fontSize, 10) * this.innerHTML.length
    
              return Number.isNaN(ret) ? 0 : ret
            }
          }, {
            key: 'clientHeight',
            get: function get() {
              var ret = parseInt(this.style.fontSize, 10)
    
              return Number.isNaN(ret) ? 0 : ret
            }
          }])
    
          return HTMLElement
        }(_Element3.default)
    
        exports.default = HTMLElement
    
    /***/ }),
    /* 5 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        var _Node2 = __webpack_require__(6)
    
        var _Node3 = _interopRequireDefault(_Node2)
    
        function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }
    
        function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function") } }
    
        function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called") } return call && (typeof call === "object" || typeof call === "function") ? call : self }
    
        function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass) } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass }
    
        var ELement = function (_Node) {
          _inherits(ELement, _Node)
    
          function ELement() {
            _classCallCheck(this, ELement)
    
            var _this = _possibleConstructorReturn(this, (ELement.__proto__ || Object.getPrototypeOf(ELement)).call(this))
    
            _this.className = ''
            _this.children = []
            return _this
          }
    
          return ELement
        }(_Node3.default)
    
        exports.default = ELement
    
    /***/ }),
    /* 6 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor) } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor } }()
    
        var _EventTarget2 = __webpack_require__(7)
    
        var _EventTarget3 = _interopRequireDefault(_EventTarget2)
    
        function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }
    
        function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function") } }
    
        function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called") } return call && (typeof call === "object" || typeof call === "function") ? call : self }
    
        function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass) } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass }
    
        var Node = function (_EventTarget) {
          _inherits(Node, _EventTarget)
    
          function Node() {
            _classCallCheck(this, Node)
    
            var _this = _possibleConstructorReturn(this, (Node.__proto__ || Object.getPrototypeOf(Node)).call(this))
    
            _this.childNodes = []
            return _this
          }
    
          _createClass(Node, [{
            key: 'appendChild',
            value: function appendChild(node) {
              if (node instanceof Node) {
                this.childNodes.push(node)
              } else {
                throw new TypeError('Failed to executed \'appendChild\' on \'Node\': parameter 1 is not of type \'Node\'.')
              }
            }
          }, {
            key: 'cloneNode',
            value: function cloneNode() {
              var copyNode = Object.create(this)
    
              Object.assign(copyNode, this)
              return copyNode
            }
          }, {
            key: 'removeChild',
            value: function removeChild(node) {
              var index = this.childNodes.findIndex(function (child) {
                return child === node
              })
    
              if (index > -1) {
                return this.childNodes.splice(index, 1)
              }
              return null
            }
          }])
    
          return Node
        }(_EventTarget3.default)
    
        exports.default = Node
    
    /***/ }),
    /* 7 */
    /***/ (function(module, exports) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor) } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor } }()
    
        function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function") } }
    
        var _events = new WeakMap()
    
        var EventTarget = function () {
          function EventTarget() {
            _classCallCheck(this, EventTarget)
    
            _events.set(this, {})
          }
    
          _createClass(EventTarget, [{
            key: 'addEventListener',
            value: function addEventListener(type, listener) {
              var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}
    
              var events = _events.get(this)
    
              if (!events) {
                events = {}
                _events.set(this, events)
              }
              if (!events[type]) {
                events[type] = []
              }
              events[type].push(listener)
    
              if (options.capture) {
                console.warn('EventTarget.addEventListener: options.capture is not implemented.')
              }
              if (options.once) {
                console.warn('EventTarget.addEventListener: options.once is not implemented.')
              }
              if (options.passive) {
                console.warn('EventTarget.addEventListener: options.passive is not implemented.')
              }
            }
          }, {
            key: 'removeEventListener',
            value: function removeEventListener(type, listener) {
              var listeners = _events.get(this)[type]
    
              if (listeners && listeners.length > 0) {
                for (var i = listeners.length; i--; i > 0) {
                  if (listeners[i] === listener) {
                    listeners.splice(i, 1)
                    break
                  }
                }
              }
            }
          }, {
            key: 'dispatchEvent',
            value: function dispatchEvent() {
              var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}
    
              var listeners = _events.get(this)[event.type]
    
              if (listeners) {
                for (var i = 0; i < listeners.length; i++) {
                  listeners[i](event)
                }
              }
            }
          }])
    
          return EventTarget
        }()
    
        exports.default = EventTarget
    
    /***/ }),
    /* 8 */
    /***/ (function(module, exports) {
    
        "use strict"
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
        exports.noop = noop
        function noop() {}
    
    /***/ }),
    /* 9 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
        exports.default = Canvas
    
        var _constructor = __webpack_require__(3)
    
        var _HTMLElement = __webpack_require__(4)
    
        var _HTMLElement2 = _interopRequireDefault(_HTMLElement)
    
        var _document = __webpack_require__(10)
    
        var _document2 = _interopRequireDefault(_document)
    
        function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }
    
        var hasModifiedCanvasPrototype = false
        var hasInit2DContextConstructor = false
        var hasInitWebGLContextConstructor = false
    
        function Canvas() {
          var canvas = wx.createCanvas()
    
          canvas.type = 'canvas'
    
          canvas.__proto__.__proto__ = new _HTMLElement2.default('canvas')
    
          var _getContext = canvas.getContext
    
          canvas.getBoundingClientRect = function () {
            var ret = {
              top: 0,
              left: 0,
              width: window.innerWidth,
              height: window.innerHeight
            }
            return ret
          }
    
          return canvas
        }
    
    /***/ }),
    /* 10 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        var _window = __webpack_require__(1)
    
        var window = _interopRequireWildcard(_window)
    
        var _HTMLElement = __webpack_require__(4)
    
        var _HTMLElement2 = _interopRequireDefault(_HTMLElement)
    
        var _Image = __webpack_require__(11)
    
        var _Image2 = _interopRequireDefault(_Image)
    
        var _Audio = __webpack_require__(12)
    
        var _Audio2 = _interopRequireDefault(_Audio)
    
        var _Canvas = __webpack_require__(9)
    
        var _Canvas2 = _interopRequireDefault(_Canvas)
    
        __webpack_require__(15)
    
        function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }
    
        function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key] } } newObj.default = obj; return newObj } }
    
        var events = {}
    
        var document = {
          readyState: 'complete',
          visibilityState: 'visible',
          documentElement: window,
          hidden: false,
          style: {},
          location: window.location,
          ontouchstart: null,
          ontouchmove: null,
          ontouchend: null,
    
          head: new _HTMLElement2.default('head'),
          body: new _HTMLElement2.default('body'),
    
          createElement: function createElement(tagName) {
            if (tagName === 'canvas') {
              return new _Canvas2.default()
            } else if (tagName === 'audio') {
              return new _Audio2.default()
            } else if (tagName === 'img') {
              return new _Image2.default()
            }
    
            return new _HTMLElement2.default(tagName)
          },
          getElementById: function getElementById(id) {
            if (id === window.canvas.id) {
              return window.canvas
            }
            return null
          },
          getElementsByTagName: function getElementsByTagName(tagName) {
            if (tagName === 'head') {
              return [document.head]
            } else if (tagName === 'body') {
              return [document.body]
            } else if (tagName === 'canvas') {
              return [window.canvas]
            }
            return []
          },
          querySelector: function querySelector(query) {
            if (query === 'head') {
              return document.head
            } else if (query === 'body') {
              return document.body
            } else if (query === 'canvas') {
              return window.canvas
            } else if (query === '#' + window.canvas.id) {
              return window.canvas
            }
            return null
          },
          querySelectorAll: function querySelectorAll(query) {
            if (query === 'head') {
              return [document.head]
            } else if (query === 'body') {
              return [document.body]
            } else if (query === 'canvas') {
              return [window.canvas]
            }
            return []
          },
          addEventListener: function addEventListener(type, listener) {
            if (!events[type]) {
              events[type] = []
            }
            events[type].push(listener)
          },
          removeEventListener: function removeEventListener(type, listener) {
            var listeners = events[type]
    
            if (listeners && listeners.length > 0) {
              for (var i = listeners.length; i--; i > 0) {
                if (listeners[i] === listener) {
                  listeners.splice(i, 1)
                  break
                }
              }
            }
          },
          dispatchEvent: function dispatchEvent(event) {
            var listeners = events[event.type]
    
            if (listeners) {
              for (var i = 0; i < listeners.length; i++) {
                listeners[i](event)
              }
            }
          }
        }
    
        exports.default = document
    
    /***/ }),
    /* 11 */
    /***/ (function(module, exports) {
    
        "use strict"
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
        exports.default = Image
        function Image() {
          var image = wx.createImage()
    
          return image
        }
    
    /***/ }),
    /* 12 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor) } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor } }()
    
        var _HTMLAudioElement2 = __webpack_require__(13)
    
        var _HTMLAudioElement3 = _interopRequireDefault(_HTMLAudioElement2)
    
        function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }
    
        function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function") } }
    
        function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called") } return call && (typeof call === "object" || typeof call === "function") ? call : self }
    
        function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass) } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass }
    
        var HAVE_NOTHING = 0
        var HAVE_METADATA = 1
        var HAVE_CURRENT_DATA = 2
        var HAVE_FUTURE_DATA = 3
        var HAVE_ENOUGH_DATA = 4
    
        var _innerAudioContext = new WeakMap()
        var _src = new WeakMap()
        var _loop = new WeakMap()
        var _autoplay = new WeakMap()
    
        var Audio = function (_HTMLAudioElement) {
          _inherits(Audio, _HTMLAudioElement)
    
          function Audio(url) {
            _classCallCheck(this, Audio)
    
            var _this = _possibleConstructorReturn(this, (Audio.__proto__ || Object.getPrototypeOf(Audio)).call(this))
    
            _this.HAVE_NOTHING = HAVE_NOTHING
            _this.HAVE_METADATA = HAVE_METADATA
            _this.HAVE_CURRENT_DATA = HAVE_CURRENT_DATA
            _this.HAVE_FUTURE_DATA = HAVE_FUTURE_DATA
            _this.HAVE_ENOUGH_DATA = HAVE_ENOUGH_DATA
            _this.readyState = HAVE_NOTHING
    
    
            _src.set(_this, '')
    
            var innerAudioContext = wx.createInnerAudioContext()
    
            _innerAudioContext.set(_this, innerAudioContext)
    
            innerAudioContext.onCanplay(function () {
              _this.dispatchEvent({ type: 'load' })
              _this.dispatchEvent({ type: 'loadend' })
              _this.dispatchEvent({ type: 'canplay' })
              _this.dispatchEvent({ type: 'canplaythrough' })
              _this.dispatchEvent({ type: 'loadedmetadata' })
              _this.readyState = HAVE_CURRENT_DATA
            })
            innerAudioContext.onPlay(function () {
              _this.dispatchEvent({ type: 'play' })
            })
            innerAudioContext.onPause(function () {
              _this.dispatchEvent({ type: 'pause' })
            })
            innerAudioContext.onEnded(function () {
              _this.dispatchEvent({ type: 'ended' })
              _this.readyState = HAVE_ENOUGH_DATA
            })
            innerAudioContext.onError(function () {
              _this.dispatchEvent({ type: 'error' })
            })
    
            if (url) {
              _innerAudioContext.get(_this).src = url
            }
            return _this
          }
    
          _createClass(Audio, [{
            key: 'load',
            value: function load() {
              console.warn('HTMLAudioElement.load() is not implemented.')
            }
          }, {
            key: 'play',
            value: function play() {
              _innerAudioContext.get(this).play()
            }
          }, {
            key: 'pause',
            value: function pause() {
              _innerAudioContext.get(this).pause()
            }
          }, {
            key: 'canPlayType',
            value: function canPlayType() {
              var mediaType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''
    
              if (typeof mediaType !== 'string') {
                return ''
              }
    
              if (mediaType.indexOf('audio/mpeg') > -1 || mediaType.indexOf('audio/mp4')) {
                return 'probably'
              }
              return ''
            }
          }, {
            key: 'cloneNode',
            value: function cloneNode() {
              var newAudio = new Audio()
              newAudio.loop = _innerAudioContext.get(this).loop
              newAudio.autoplay = _innerAudioContext.get(this).loop
              newAudio.src = this.src
              return newAudio
            }
          }, {
            key: 'currentTime',
            get: function get() {
              return _innerAudioContext.get(this).currentTime
            },
            set: function set(value) {
              _innerAudioContext.get(this).seek(value)
            }
          }, {
            key: 'src',
            get: function get() {
              return _src.get(this)
            },
            set: function set(value) {
              _src.set(this, value)
              _innerAudioContext.get(this).src = value
            }
          }, {
            key: 'loop',
            get: function get() {
              return _innerAudioContext.get(this).loop
            },
            set: function set(value) {
              _innerAudioContext.get(this).loop = value
            }
          }, {
            key: 'autoplay',
            get: function get() {
              return _innerAudioContext.get(this).autoplay
            },
            set: function set(value) {
              _innerAudioContext.get(this).autoplay = value
            }
          }, {
            key: 'paused',
            get: function get() {
              return _innerAudioContext.get(this).paused
            }
          }])
    
          return Audio
        }(_HTMLAudioElement3.default)
    
        exports.default = Audio
    
    /***/ }),
    /* 13 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        var _HTMLMediaElement2 = __webpack_require__(14)
    
        var _HTMLMediaElement3 = _interopRequireDefault(_HTMLMediaElement2)
    
        function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }
    
        function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function") } }
    
        function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called") } return call && (typeof call === "object" || typeof call === "function") ? call : self }
    
        function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass) } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass }
    
        var HTMLAudioElement = function (_HTMLMediaElement) {
          _inherits(HTMLAudioElement, _HTMLMediaElement)
    
          function HTMLAudioElement() {
            _classCallCheck(this, HTMLAudioElement)
    
            return _possibleConstructorReturn(this, (HTMLAudioElement.__proto__ || Object.getPrototypeOf(HTMLAudioElement)).call(this, 'audio'))
          }
    
          return HTMLAudioElement
        }(_HTMLMediaElement3.default)
    
        exports.default = HTMLAudioElement
    
    /***/ }),
    /* 14 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor) } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor } }()
    
        var _HTMLElement2 = __webpack_require__(4)
    
        var _HTMLElement3 = _interopRequireDefault(_HTMLElement2)
    
        function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }
    
        function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function") } }
    
        function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called") } return call && (typeof call === "object" || typeof call === "function") ? call : self }
    
        function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass) } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass }
    
        var HTMLMediaElement = function (_HTMLElement) {
          _inherits(HTMLMediaElement, _HTMLElement)
    
          function HTMLMediaElement(type) {
            _classCallCheck(this, HTMLMediaElement)
    
            return _possibleConstructorReturn(this, (HTMLMediaElement.__proto__ || Object.getPrototypeOf(HTMLMediaElement)).call(this, type))
          }
    
          _createClass(HTMLMediaElement, [{
            key: 'addTextTrack',
            value: function addTextTrack() {}
          }, {
            key: 'captureStream',
            value: function captureStream() {}
          }, {
            key: 'fastSeek',
            value: function fastSeek() {}
          }, {
            key: 'load',
            value: function load() {}
          }, {
            key: 'pause',
            value: function pause() {}
          }, {
            key: 'play',
            value: function play() {}
          }])
    
          return HTMLMediaElement
        }(_HTMLElement3.default)
    
        exports.default = HTMLMediaElement
    
    /***/ }),
    /* 15 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        __webpack_require__(16)
    
    /***/ }),
    /* 16 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        var _window = __webpack_require__(1)
    
        var window = _interopRequireWildcard(_window)
    
        var _document = __webpack_require__(10)
    
        var _document2 = _interopRequireDefault(_document)
    
        var _util = __webpack_require__(8)
    
        function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }
    
        function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key] } } newObj.default = obj; return newObj } }
    
        function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function") } }
    
        var TouchEvent = function TouchEvent(type) {
          _classCallCheck(this, TouchEvent)
    
          this.target = window.canvas
          this.currentTarget = window.canvas
          this.touches = []
          this.targetTouches = []
          this.changedTouches = []
          this.preventDefault = _util.noop
          this.stopPropagation = _util.noop
    
          this.type = type
        }
    
        function touchEventHandlerFactory(type) {
          return function (event) {
            var touchEvent = new TouchEvent(type)
    
            touchEvent.touches = event.touches
            touchEvent.targetTouches = Array.prototype.slice.call(event.touches)
            touchEvent.changedTouches = event.changedTouches
            touchEvent.timeStamp = event.timeStamp
            _document2.default.dispatchEvent(touchEvent)
          }
        }
    
        wx.onTouchStart(touchEventHandlerFactory('touchstart'))
        wx.onTouchMove(touchEventHandlerFactory('touchmove'))
        wx.onTouchEnd(touchEventHandlerFactory('touchend'))
        wx.onTouchCancel(touchEventHandlerFactory('touchcancel'))
    
    /***/ }),
    /* 17 */
    /***/ (function(module, exports, __webpack_require__) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        var _util = __webpack_require__(8)
    
        // TODO 需要 wx.getSystemInfo 获取更详细信息
        var _wx$getSystemInfoSync = wx.getSystemInfoSync(),
            platform = _wx$getSystemInfoSync.platform
    
        var navigator = {
          platform: platform,
          language: 'zh-cn',
          appVersion: '5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1',
          userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E8301 MicroMessenger/6.6.0 MiniGame NetType/WIFI Language/zh_CN',
          onLine: true, // TODO 用 wx.getNetworkStateChange 和 wx.onNetworkStateChange 来返回真实的状态
    
          // TODO 用 wx.getLocation 来封装 geolocation
          geolocation: {
            getCurrentPosition: _util.noop,
            watchPosition: _util.noop,
            clearWatch: _util.noop
          }
        }
    
        exports.default = navigator
    
    /***/ }),
    /* 18 */
    /***/ (function(module, exports) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor) } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor } }()
    
        function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function") } }
    
        var _url = new WeakMap()
        var _method = new WeakMap()
        var _requestHeader = new WeakMap()
        var _responseHeader = new WeakMap()
        var _requestTask = new WeakMap()
    
        function _triggerEvent(type) {
          if (typeof this['on' + type] === 'function') {
            for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
              args[_key - 1] = arguments[_key]
            }
    
            this['on' + type].apply(this, args)
          }
        }
    
        function _changeReadyState(readyState) {
          this.readyState = readyState
          _triggerEvent.call(this, 'readystatechange')
        }
    
        var XMLHttpRequest = function () {
          // TODO 没法模拟 HEADERS_RECEIVED 和 LOADING 两个状态
          function XMLHttpRequest() {
            _classCallCheck(this, XMLHttpRequest)
    
            this.onabort = null
            this.onerror = null
            this.onload = null
            this.onloadstart = null
            this.onprogress = null
            this.ontimeout = null
            this.onloadend = null
            this.onreadystatechange = null
            this.readyState = 0
            this.response = null
            this.responseText = null
            this.responseType = ''
            this.responseXML = null
            this.status = 0
            this.statusText = ''
            this.upload = {}
            this.withCredentials = false
    
            _requestHeader.set(this, {
              'content-type': 'application/x-www-form-urlencoded'
            })
            _responseHeader.set(this, {})
          }
    
          /*
           * TODO 这一批事件应该是在 XMLHttpRequestEventTarget.prototype 上面的
           */
    
    
          _createClass(XMLHttpRequest, [{
            key: 'abort',
            value: function abort() {
              var myRequestTask = _requestTask.get(this)
    
              if (myRequestTask) {
                myRequestTask.abort()
              }
            }
          }, {
            key: 'getAllResponseHeaders',
            value: function getAllResponseHeaders() {
              var responseHeader = _responseHeader.get(this)
    
              return Object.keys(responseHeader).map(function (header) {
                return header + ': ' + responseHeader[header]
              }).join('\n')
            }
          }, {
            key: 'getResponseHeader',
            value: function getResponseHeader(header) {
              return _responseHeader.get(this)[header]
            }
          }, {
            key: 'open',
            value: function open(method, url /* async, user, password 这几个参数在小程序内不支持*/) {
              _method.set(this, method)
              _url.set(this, url)
              _changeReadyState.call(this, XMLHttpRequest.OPENED)
            }
          }, {
            key: 'overrideMimeType',
            value: function overrideMimeType() {}
          }, {
            key: 'send',
            value: function send() {
              var _this = this
    
              var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''
    
              if (this.readyState !== XMLHttpRequest.OPENED) {
                throw new Error("Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED.")
              } else {
                wx.request({
                  data: data,
                  url: _url.get(this),
                  method: _method.get(this),
                  header: _requestHeader.get(this),
                  responseType: this.responseType,
                  success: function success(_ref) {
                    var data = _ref.data,
                        statusCode = _ref.statusCode,
                        header = _ref.header
    
                    if (typeof data !== 'string' && !(data instanceof ArrayBuffer)) {
                      try {
                        data = JSON.stringify(data)
                      } catch (e) {
                        data = data
                      }
                    }
    
                    _this.status = statusCode
                    _responseHeader.set(_this, header)
                    _triggerEvent.call(_this, 'loadstart')
                    _changeReadyState.call(_this, XMLHttpRequest.HEADERS_RECEIVED)
                    _changeReadyState.call(_this, XMLHttpRequest.LOADING)
    
                    _this.response = data
    
                    if (data instanceof ArrayBuffer) {
                      _this.responseText = ''
                      var bytes = new Uint8Array(data)
                      var len = bytes.byteLength
    
                      for (var i = 0; i < len; i++) {
                        _this.responseText += String.fromCharCode(bytes[i])
                      }
                    } else {
                      _this.responseText = data
                    }
                    _changeReadyState.call(_this, XMLHttpRequest.DONE)
                    _triggerEvent.call(_this, 'load')
                    _triggerEvent.call(_this, 'loadend')
                  },
                  fail: function fail(_ref2) {
                    var errMsg = _ref2.errMsg
    
                    // TODO 规范错误
                    if (errMsg.indexOf('abort') !== -1) {
                      _triggerEvent.call(_this, 'abort')
                    } else {
                      _triggerEvent.call(_this, 'error', errMsg)
                    }
                    _triggerEvent.call(_this, 'loadend')
                  }
                })
              }
            }
          }, {
            key: 'setRequestHeader',
            value: function setRequestHeader(header, value) {
              var myHeader = _requestHeader.get(this)
    
              myHeader[header] = value
              _requestHeader.set(this, myHeader)
            }
          }])
    
          return XMLHttpRequest
        }()
    
        XMLHttpRequest.UNSEND = 0
        XMLHttpRequest.OPENED = 1
        XMLHttpRequest.HEADERS_RECEIVED = 2
        XMLHttpRequest.LOADING = 3
        XMLHttpRequest.DONE = 4
        exports.default = XMLHttpRequest
    
    /***/ }),
    /* 19 */
    /***/ (function(module, exports) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor) } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor } }()
    
        function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function") } }
    
        var _socketTask = new WeakMap()
    
        var WebSocket = function () {
          // TODO 更新 binaryType
          // The connection is in the process of closing.
          // The connection is not yet open.
          function WebSocket(url) {
            var _this = this
    
            var protocols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []
    
            _classCallCheck(this, WebSocket)
    
            this.binaryType = ''
            this.bufferedAmount = 0
            this.extensions = ''
            this.onclose = null
            this.onerror = null
            this.onmessage = null
            this.onopen = null
            this.protocol = ''
            this.readyState = 3
    
            if (typeof url !== 'string' || !/(^ws:\/\/)|(^wss:\/\/)/.test(url)) {
              throw new TypeError('Failed to construct \'WebSocket\': The URL \'' + url + '\' is invalid')
            }
    
            this.url = url
            this.readyState = WebSocket.CONNECTING
    
            var socketTask = wx.connectSocket({
              url: url,
              protocols: Array.isArray(protocols) ? protocols : [protocols]
            })
    
            _socketTask.set(this, socketTask)
    
            socketTask.onClose(function (res) {
              _this.readyState = WebSocket.CLOSED
              if (typeof _this.onclose === 'function') {
                _this.onclose(res)
              }
            })
    
            socketTask.onMessage(function (res) {
              if (typeof _this.onmessage === 'function') {
                _this.onmessage(res)
              }
            })
    
            socketTask.onOpen(function () {
              _this.readyState = WebSocket.OPEN
              if (typeof _this.onopen === 'function') {
                _this.onopen()
              }
            })
    
            socketTask.onError(function (res) {
              if (typeof _this.onerror === 'function') {
                _this.onerror(new Error(res.errMsg))
              }
            })
    
            return this
          } // TODO 小程序内目前获取不到,实际上需要根据服务器选择的 sub-protocol 返回
          // TODO 更新 bufferedAmount
          // The connection is closed or couldn't be opened.
    
          // The connection is open and ready to communicate.
    
    
          _createClass(WebSocket, [{
            key: 'close',
            value: function close(code, reason) {
              this.readyState = WebSocket.CLOSING
              var socketTask = _socketTask.get(this)
    
              socketTask.close({
                code: code,
                reason: reason
              })
            }
          }, {
            key: 'send',
            value: function send(data) {
              if (typeof data !== 'string' && !(data instanceof ArrayBuffer)) {
                throw new TypeError('Failed to send message: The data ' + data + ' is invalid')
              }
    
              var socketTask = _socketTask.get(this)
    
              socketTask.send({
                data: data
              })
            }
          }])
    
          return WebSocket
        }()
    
        WebSocket.CONNECTING = 0
        WebSocket.OPEN = 1
        WebSocket.CLOSING = 2
        WebSocket.CLOSED = 3
        exports.default = WebSocket
    
    /***/ }),
    /* 20 */
    /***/ (function(module, exports) {
    
        "use strict"
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
    
        function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function") } }
    
        /*
         * TODO 使用 wx.readFile 来封装 FileReader
         */
        var FileReader = function FileReader() {
          _classCallCheck(this, FileReader)
        }
    
        exports.default = FileReader
    
    /***/ }),
    /* 21 */
    /***/ (function(module, exports) {
    
        "use strict"
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
        var localStorage = {
          get length() {
            var _wx$getStorageInfoSyn = wx.getStorageInfoSync(),
                keys = _wx$getStorageInfoSyn.keys
    
            return keys.length
          },
    
          key: function key(n) {
            var _wx$getStorageInfoSyn2 = wx.getStorageInfoSync(),
                keys = _wx$getStorageInfoSyn2.keys
    
            return keys[n]
          },
          getItem: function getItem(key) {
            return wx.getStorageSync(key)
          },
          setItem: function setItem(key, value) {
            return wx.setStorageSync(key, value)
          },
          removeItem: function removeItem(key) {
            wx.removeStorageSync(key)
          },
          clear: function clear() {
            wx.clearStorageSync()
          }
        }
    
        exports.default = localStorage
    
    /***/ }),
    /* 22 */
    /***/ (function(module, exports) {
    
        'use strict'
    
        Object.defineProperty(exports, "__esModule", {
          value: true
        })
        var location = {
          href: 'game.js',
          reload: function reload() {}
        }
    
        exports.default = location
    
    /***/ })
    /******/ ])
    

    若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理。


    请点赞!因为你们的赞同/鼓励是我写作的最大动力!

    欢迎关注达叔小生的简书!

    这是一个有质量,有态度的博客

    博客

    相关文章

      网友评论

        本文标题:微信小游戏1

        本文链接:https://www.haomeiwen.com/subject/cgokrctx.html