{"version":3,"sources":["src/js/utils.ts","src/js/Game.ts","src/js/Sprite.ts","src/js/sprites/Blast.ts","src/js/sprites/Player.ts","src/js/sprites/PBullet.ts","src/js/sprites/EBullet.ts","src/js/sprites/Bonus.ts","src/js/sprites/Enemy.ts","src/js/StageControl.ts","src/js/progress.ts","src/index.ts"],"names":[],"mappings":"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","file":"src.c3c9baa3.map","sourceRoot":"..","sourcesContent":["import { Rect } from \"./modals\";\n\n/**\n * return time now\n */\nexport function getTimeNow(): number {\n  return (+ new Date())\n}\n\nexport function getGUID(): string {\n  // https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript/8809472#8809472\n  let time: number = (new Date()).getTime()\n  if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n    // 使用更高精度的时间\n    time += performance.now()\n  }\n  let guid: string = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(char) {\n      var rand = (time + (Math.random() * 16)) % 16 | 0;\n      time = Math.floor(time / 16);\n      return (char === 'x' ? rand : ((rand & 0x3) | 0x8)).toString(16);\n  })\n  return guid\n}\n\nexport function is2RectIntersect(rect1: Rect, rect2: Rect): boolean {\n  const maxLeft = Math.max(rect1.left, rect2.left)\n  const maxTop = Math.max(rect1.top, rect2.top)\n  const minRight = Math.min(rect1.left + rect1.width, rect2.left + rect2.width)\n  const minBottom = Math.min(rect1.top + rect1.height, rect2.top + rect2.height)\n  return !(maxLeft > minRight || maxTop > minBottom)\n}\n\n// x, y 与水平夹角 弧度\nexport function getVAngle(x: number, y: number): number {\n  return Math.acos(x / (Math.sqrt(x * x + y * y)))\n}\n\n// 根据两点与 ylen 大小，以及 len 返回 x,y\nexport function getVelocityByLenPoint2Player (x: number, y: number, x1: number, y1: number, len: number) {\n  const L = Math.sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1))\n  const ry = len / L * (y1 - y)\n  const rx = len / L * (x1 - x)\n  return {\n    x: rx,\n    y: ry,\n  }\n}\n\n// 角度转弧度\nexport function angle2radian(d: number) {\n  return d * Math.PI / 180\n}\n\n// 弧度转角度\nexport function radian2angle(d: number) {\n  return d * 180 / Math.PI\n}\n\n// 延迟执行\nexport function delay(fun: Function, time: number, args?: any) {\n  return new Promise((resolve, reject) => {\n    const tmp = setTimeout(() => {\n      try {\n        clearTimeout(tmp)\n        resolve(fun(args))\n      } catch (error) {\n        reject(error)\n      }\n    }, time)\n  })\n}\n","import {\n  getTimeNow\n} from './utils'\nimport { KeyListener, KeyImagePair, Rect } from \"./modals\"\nimport { Sprite } from './Sprite';\n\nexport default class Game {\n  canvas: HTMLCanvasElement\n  W: number\n  H: number\n  _realContext: CanvasRenderingContext2D\n  _buffCanvas: HTMLCanvasElement\n  context: CanvasRenderingContext2D\n  gameName: string\n  sprites: Sprite[]\n  keyListeners: KeyListener[]\n  HIGH_SCORES_SUFFIX: string = '_highscores'\n  score: number\n  images: KeyImagePair\n  imageUrls: string[]\n  imagesLoaded: number\n  imagesFailedToLoad: number\n  imagesIndex: number\n  startTime: number\n  lastTime: number\n  gameTime: number\n  fps: number\n  STRATING_FPS: number = 60\n  paused: boolean\n  startedPauseAt: number\n  // 可看成暂停时的绘制时间间隔\n  PAUSE_TIMEOUT: number = 100\n  soundOn: boolean\n  soundChannels: HTMLAudioElement[]\n  audio: HTMLAudioElement\n  NUM_SOUND_CHANNELS: number = 10\n\n  constructor(gameName: string, canvasId: string) {\n    this.canvas = <HTMLCanvasElement> document.getElementById(canvasId)\n    this.W = this.canvas.width\n    this.H = this.canvas.height\n\n    // real visible canvas context\n    this._realContext = this.canvas.getContext('2d')\n\n    // General\n    this._buffCanvas = document.createElement('canvas')\n    this._buffCanvas.width = this.W\n    this._buffCanvas.height = this.H\n\n    // buff context\n    this.context = this._buffCanvas.getContext('2d')\n\n    this.gameName = gameName\n    this.sprites = []\n    this.keyListeners = []\n\n    this.score = 0\n\n    // image loading\n    // this.imageLoadingProgressCallback = null\n    this.images = {}\n    this.imageUrls = []\n    this.imagesLoaded = 0\n    this.imagesFailedToLoad = 0\n    this.imagesIndex = 0\n\n    // Time\n    this.startTime = 0\n    this.lastTime = 0\n    this.gameTime = 0\n    this.fps = 0\n\n    this.paused = false\n    this.startedPauseAt = 0\n\n    // Sound\n    this.soundOn = true\n    this.soundChannels = []\n    this.audio = new Audio()\n\n    for (let index = 0; index < this.NUM_SOUND_CHANNELS; index++) {\n      let audio = new Audio()\n      this.soundChannels.push(audio)\n    }\n\n    window.onkeyup = (e: KeyboardEvent) => { this.keyPressed(e, false) }\n    window.onkeydown = (e: KeyboardEvent) => { this.keyPressed(e, true) }\n  }\n\n\n  /**\n   * called by key down and key press, init at constructor\n   * @param {KeyboardEvent} e\n   * @param {boolean} status keydown 为 true，keyup 为 false\n   */\n  keyPressed(e: KeyboardEvent, status: boolean) {\n    let listener = null, key: string\n    switch (e.keyCode) {\n      case 32:\n        key = 'space'\n        break\n      case 68:\n        key = 'd'\n        break\n      case 75:\n        key = 'k'\n        break\n      case 83:\n        key = 's'\n        break\n      case 80:\n        key = 'p'\n        break\n      case 37:\n        key = 'left arrow'\n        break\n      case 39:\n        key = 'right arrow'\n        break\n      case 38:\n        key = 'up arrow'\n        break\n      case 40:\n        key = 'down arrow'\n        break\n      case 16:\n        key = 'shift'\n        break\n    }\n\n    listener = this.findKeyListener(key)\n    if (listener) {\n      listener(e, status)\n    }\n  }\n\n  /**\n   * Given a key, return the associated listener\n   * @param {string} key\n   */\n  findKeyListener(key: string): Function | null {\n    let listener = null\n    for (const iterator of this.keyListeners) {\n      if (iterator.key === key) {\n        listener = iterator.listener\n      }\n    }\n    return listener\n  }\n\n  /**\n   * Given a URL, return the associated image\n   * @param {string} imgurl\n   */\n  getImage(imgurl: string): HTMLImageElement {\n    return this.images[imgurl]\n  }\n\n  /**\n   * called by loadImage() when an image loads successfully\n   */\n  private imageLoadedCallback() {\n    this.imagesLoaded += 1\n  }\n\n  /**\n   * called by loadImage() when an image doesn't load successfully\n   */\n  private imageLoadErrorCallback() {\n    this.imagesFailedToLoad += 1\n  }\n\n  /**\n   * loads a particular image\n   * @param {string} imageUrl\n   */\n  loadImage(imageUrl: string) {\n    let img: HTMLImageElement = new Image()\n\n    img.src = imageUrl\n\n    img.addEventListener('load', () => {\n      this.imageLoadedCallback()\n    })\n\n    img.addEventListener('error', () => {\n      this.imageLoadErrorCallback()\n    })\n\n    this.images[imageUrl] = img\n  }\n\n  /**\n   * 加载图片\n   * 返回图片加载进度\n   */\n  loadImages(): number {\n    // if there are images left to load\n    if (this.imagesIndex < this.imageUrls.length) {\n      this.loadImage(this.imageUrls[this.imagesIndex])\n      this.imagesIndex += 1\n    }\n    // return progress\n    return (this.imagesLoaded + this.imagesFailedToLoad) / this.imageUrls.length * 100\n  }\n\n  /**\n   * call this method to add an image to the queue, the image will be loaded by loadImages()\n   * @param {string} imageUrl\n   */\n  queueImage(imageUrl: string) {\n    this.imageUrls.push(imageUrl)\n  }\n\n  // Game loop ...........................................................................\n  /**\n   * start game\n   */\n  start() {\n    this.startTime = getTimeNow()\n\n    window.requestAnimationFrame((time) => {\n      this.animate(time)\n    })\n  }\n\n  /**\n   * 驱动动画\n   * @param {number} time\n   */\n  animate(time: number) {\n    if (this.paused) {\n      setTimeout(() => {\n        this.animate(time)\n      }, this.PAUSE_TIMEOUT)\n    } else {\n      // game is running\n      this.tick(time)           // update fps, game time\n      this.clearScreen()\n\n      this.startAnimate(time)   // 重写\n      this.paintUnderSprites()  // 重写\n\n      this.updateSprites(time)  // invoke sprite behaviors\n      this.paintSprites(time)   // paint sprites in the canvas\n\n      this.paintOverSprites()   // 重写\n      this.endAnimate()         // 重写\n\n      // really draw visible canvas\n      this._realContext.clearRect(0, 0, this.W, this.H)\n      this._realContext.drawImage(this._buffCanvas, 0, 0)\n\n      // keep animate going\n      window.requestAnimationFrame((time) => {\n        this.animate(time)\n      })\n    }\n  }\n\n  /**\n   * 更新 fps、游戏时间\n   * @param {number} time\n   */\n  tick(time: number) {\n    this.updateFrameRate(time)\n    this.gameTime = getTimeNow() - this.startTime\n    this.lastTime = time\n  }\n\n  /**\n   * 更新 fps\n   * @param {number} time\n   */\n  updateFrameRate(time: number) {\n    if (this.lastTime === 0) {\n      this.fps = this.STRATING_FPS\n    } else {\n      this.fps = 1000 / (time - this.lastTime)\n    }\n  }\n\n  /**\n   * 清屏\n   */\n  clearScreen() {\n    this.context.clearRect(0, 0, this.W, this.H)\n  }\n\n  /**\n   * 更新所有精灵的行为，精灵的 update() 会被调用\n   * @param {number} time\n   */\n  updateSprites(time: number) {\n    for (let i = 0; i < this.sprites.length; i++) {\n      let sprite = this.sprites[i]\n      sprite.visible && sprite.update(this.context, time)\n    }\n  }\n\n  /**\n   * 绘制所有可见的精灵\n   * @param {number} time\n   */\n  paintSprites(time: number) {\n    for (let i = 0; i < this.sprites.length; i++) {\n      let sprite = this.sprites[i]\n      if (sprite.visible) {\n        sprite.paint(this.context)\n      }\n    }\n  }\n\n  /**\n   * 切换游戏状态（暂停/开始）\n   */\n  togglePaused() {\n    let now = getTimeNow()\n\n    this.paused = !this.paused\n\n    if (this.paused) {\n      this.startedPauseAt = now\n    } else {\n      // 调整开始时间，让游戏从暂停的时间继续开始\n      this.startTime = this.startTime + now - this.startedPauseAt\n      this.lastTime = now\n    }\n  }\n\n  /**\n   * 返回当前帧某个对象改变的像素\n   * @param {number} time\n   * @param {number} velocity\n   */\n  pixelsPerFrame(time: number, velocity: number) {\n    // pixels per frame\n    return velocity / this.fps\n  }\n\n  /**\n   * get high scores array\n   */\n  getHighScores(): number[] {\n    return JSON.parse(localStorage.getItem(this.gameName + this.HIGH_SCORES_SUFFIX) || '[]')\n  }\n\n  /**\n   * set high score to localStorage\n   * @param {number} highScore\n   */\n  setHighScore(highScore: number) {\n    const key = this.gameName + this.HIGH_SCORES_SUFFIX\n    localStorage.setItem(key, this.getHighScores().unshift(highScore).toString())\n  }\n\n  /**\n   * clear high scores\n   */\n  clearHighScores() {\n    localStorage.setItem(this.gameName + this.HIGH_SCORES_SUFFIX, '[]')\n  }\n\n  // Key listeners ...........................................................................\n  /**\n   * add a (key, listener) pair to the keyListeners array\n   * @param {KeyListener} keyAndListener\n   */\n  addKeyListener(keyAndListener: KeyListener) {\n    this.keyListeners.push(keyAndListener)\n  }\n\n  // Sound ...................................................................................\n  /**\n   * return the first sound available channel\n   */\n  getAvailableSoundChannel(): HTMLAudioElement | null {\n    let audio\n\n    for (let index = 0; index < this.NUM_SOUND_CHANNELS; index++) {\n      audio = this.soundChannels[index]\n      if (audio.played && audio.played.length > 0) {\n        if (audio.ended)\n          return audio\n      } else {\n        if (!audio.ended)\n          return audio\n      }\n    }\n\n    // all channels in use\n    return null\n  }\n\n  /**\n   * XXX: 暂未了解意图\n   * play sound\n   * @param {string} id\n   */\n  playSound(id: string) {\n    let channel = this.getAvailableSoundChannel()\n    let element: HTMLAudioElement = <HTMLAudioElement> document.getElementById(id)\n\n    if (channel && element) {\n      channel.src = element.src === '' ? element.currentSrc : element.src\n      channel.load()\n      channel.play()\n    }\n  }\n\n  // Sprites ..............................................................................\n  /**\n   * add sprite\n   * @param {Sprite} sprite\n   */\n  addSprite(sprite: Sprite) {\n    this.sprites.push(sprite)\n  }\n\n  /**\n   * get sprite by name\n   * @param {string} name\n   */\n  getSprite(name: string): Sprite | null {\n    for (const sprite of this.sprites) {\n      if (sprite.name === name) {\n        return sprite\n      }\n    }\n    return null\n  }\n\n  // startAnimate、paintUnderSprites、paintOverSprites、endAnimate\n  // 构成每帧的生命周期钩子，可自行重写\n  startAnimate(time: number) {\n\n  }\n\n  paintUnderSprites() {\n\n  }\n\n  paintOverSprites() {\n\n  }\n\n  endAnimate() {\n\n  }\n\n  // set a free sprite to a new sprite\n  // return old sprite address\n  setFreeSpriteNew(sprite: Sprite): Sprite|null {\n    for (let index = 0; index < this.sprites.length; index++) {\n      const element = this.sprites[index]\n      if (!element.visible && element.name !== 'player') {\n        this.sprites[index] = sprite\n        return element\n      }\n    }\n    this.addSprite(sprite)\n    return null\n  }\n\n  getRect(): Rect {\n    return {\n      left: 0,\n      top: 0,\n      width: this.W,\n      height: this.H,\n    }\n  }\n}\n\nexport const game = new Game('project', 'canvas')\n","import { Painter, SheetCell, Behavior, Rect, Point } from \"./modals\";\n\n/**\n * 图像绘制器\n */\nexport class ImagePainter implements Painter {\n  image: HTMLImageElement\n\n  constructor(imageUrl: string) {\n    this.image = new Image()\n    this.image.src = imageUrl\n  }\n\n  paint(sprite: Sprite, context: CanvasRenderingContext2D) {\n    if (this.image !== undefined) {\n      if (!this.image.complete) {\n        this.image.onload = (e) => {\n          sprite.width = this.image.width\n          sprite.height = this.image.height\n\n          context.drawImage(<HTMLImageElement> e.target,\n            sprite.left, sprite.top,\n            sprite.width, sprite.height)\n        }\n      } else {\n        sprite.width = this.image.width\n        sprite.height = this.image.height\n        context.drawImage(this.image,\n          sprite.left, sprite.top,\n          sprite.width, sprite.height)\n      }\n    }\n  }\n}\n\n/**\n * 精灵绘制器\n */\nexport class SpriteSheetPainter implements Painter {\n  cells: SheetCell[]\n  spritesheet: HTMLImageElement\n  cellIndex: number\n  constructor(cells: SheetCell[], spritesheet: HTMLImageElement) {\n    this.cells = cells\n    this.spritesheet = spritesheet\n    this.cellIndex = 0\n  }\n\n  advance() {\n    this.cellIndex = (this.cellIndex + 1) % this.cells.length\n  }\n\n  paint(sprite:Sprite, context: CanvasRenderingContext2D) {\n    let cell = this.cells[this.cellIndex]\n    sprite.width = cell.width\n    sprite.height = cell.height\n    context.drawImage(this.spritesheet,\n      cell.left, cell.top,\n      cell.width, cell.height,\n      sprite.left, sprite.top,\n      cell.width, cell.height)\n  }\n}\n\n/**\n * 精灵动画制作器\n * SpriteAnimator 包含两个参数，Painter 数组和回调函数。\n */\nexport class SpriteAnimator {\n  painters: Painter[]\n  elapsedCallback: Function\n  duration: number\n  startTime: number\n  index: number\n\n  constructor(painters: Painter[], elapsedCallback: Function) {\n    this.painters = painters\n    this.elapsedCallback = elapsedCallback\n\n    this.duration = 1000\n    this.startTime = 0\n    this.index = 0\n  }\n\n  end(sprite: Sprite, originalPainter: Painter) {\n    sprite.animating = false\n\n    if (this.elapsedCallback) {\n      this.elapsedCallback(sprite)\n    } else {\n      sprite.painter = originalPainter\n    }\n  }\n\n  start(sprite: Sprite, duration: number) {\n    let endTime = + new Date() + duration,\n      period = duration / (this.painters.length),\n      interval: number|null = null,\n      originalPainter = sprite.painter\n\n    this.index = 0\n    sprite.animating = true\n    sprite.painter = this.painters[this.index]\n\n    interval = setInterval(() => {\n      if (+new Date() < endTime) {\n        this.index += 1\n        sprite.painter = this.painters[this.index] || sprite.painter\n      } else {\n        this.end(sprite, originalPainter);\n        clearInterval(interval);\n      }\n    }, period)\n  }\n}\n\n/**\n * 精灵\n */\nexport class Sprite {\n  name: string\n  painter: Painter\n  behaviors: Behavior[]\n  left: number\n  top: number\n  width: number\n  height: number\n  // 核心区域\n  coreWidth: number\n  coreHeight: number\n  velocityX: number\n  velocityY: number\n  visible: boolean\n  animating: boolean\n\n  constructor(name: string, painter: Painter, behaviors: Behavior[]) {\n    this.name = name\n    this.painter = painter\n    this.behaviors = behaviors\n\n    this.left = 0\n    this.top = 0\n    this.width = 10\n    this.height = 10\n    this.velocityX = 0\n    this.velocityY = 0\n    this.visible = true\n    this.animating = false\n  }\n\n  paint(context: CanvasRenderingContext2D) {\n    if (this.painter && this.visible) {\n      this.painter.paint(this, context)\n    }\n  }\n\n  update(context: CanvasRenderingContext2D, time: number) {\n    for (let index = this.behaviors.length; index > 0; index--) {\n      this.behaviors[index - 1].execute(this, context, time)\n    }\n  }\n\n  getCoreRect(): Rect {\n    const {left, top, width, height, coreWidth, coreHeight} = this\n    return coreWidth > 0 && coreHeight > 0 ? {\n      left: left + (width - coreWidth) / 2,\n      top: top + (height - coreHeight) / 2,\n      width: coreWidth,\n      height: coreHeight,\n    } : {\n      left,\n      top,\n      width,\n      height,\n    }\n  }\n\n  getCenterPoint(): Point {\n    return {\n      left: this.left + this.width / 2,\n      top: this.top + this.height / 2,\n    }\n  }\n}","// 死亡爆炸动画\nimport { Sprite, SpriteSheetPainter } from \"../Sprite\";\nimport { game } from \"../Game\";\nimport { Behavior, SheetCell } from \"../modals\";\nimport { getGUID } from \"../utils\";\nimport arua from '../../assets/arua.png'\n\nconst BLAST_SIZE = 128\nconst blastCells: SheetCell[] = [\n  { left: 0,    top: 0, width: BLAST_SIZE, height: BLAST_SIZE },\n  { left: 128,  top: 0, width: BLAST_SIZE, height: BLAST_SIZE },\n  { left: 256,  top: 0, width: BLAST_SIZE, height: BLAST_SIZE },\n  { left: 384,  top: 0, width: BLAST_SIZE, height: BLAST_SIZE },\n  { left: 512,  top: 0, width: BLAST_SIZE, height: BLAST_SIZE },\n  { left: 640,  top: 0, width: BLAST_SIZE, height: BLAST_SIZE },\n  { left: 768,  top: 0, width: BLAST_SIZE, height: BLAST_SIZE },\n  { left: 896,  top: 0, width: BLAST_SIZE, height: BLAST_SIZE },\n  { left: 640,  top: 0, width: BLAST_SIZE, height: BLAST_SIZE },\n  { left: 384,  top: 0, width: BLAST_SIZE, height: BLAST_SIZE },\n  { left: 128,  top: 0, width: BLAST_SIZE, height: BLAST_SIZE },\n]\n\nexport function showBlast(sprite: Sprite, callBack?: Function) {\n  const normal: Behavior = {\n    lastAdvance: 0,\n    PAGEFLIP_INTERVAL: 100,\n    execute: function (sprite: Sprite, context: CanvasRenderingContext2D, now: number) {\n      if (now - this.lastAdvance > this.PAGEFLIP_INTERVAL) {\n        sprite.painter.advance()\n        this.lastAdvance = now\n      }\n      if ((<SpriteSheetPainter>sprite.painter).cellIndex === blastCells.length - 1) {\n        sprite.visible = false\n        callBack && callBack()\n      }\n    }\n  }\n  const blastSprite = new Sprite(`blast-${getGUID()}`, new SpriteSheetPainter(blastCells, game.getImage(arua)), [normal])\n  const {left, top, width, height} = sprite\n  blastSprite.left = left + (width - BLAST_SIZE) / 2\n  blastSprite.top = top + (height - BLAST_SIZE) / 2\n  game.setFreeSpriteNew(blastSprite)\n}","import { SheetCell, Behavior, Rect } from \"../modals\";\nimport Game, {game} from \"../Game\";\nimport playerSheet from '../../assets/pl00.png'\nimport core from '../../assets/core.png'\nimport { Sprite, SpriteSheetPainter, SpriteAnimator } from \"../Sprite\";\nimport { showBlast } from \"./Blast\";\n\nconst normalCells: SheetCell[] = [\n  { left: 0,   top: 0, width: 32, height: 48 },\n  { left: 32,  top: 0, width: 32, height: 48 },\n  { left: 64,  top: 0, width: 32, height: 48 },\n  { left: 96,  top: 0, width: 32, height: 48 },\n  { left: 128, top: 0, width: 32, height: 48 },\n  { left: 160, top: 0, width: 32, height: 48 },\n  { left: 192, top: 0, width: 32, height: 48 },\n  { left: 224, top: 0, width: 32, height: 48 },\n]\nconst toLeftCells: SheetCell[] = [\n  { left: 0,   top: 48, width: 32, height: 48 },\n  { left: 32,  top: 48, width: 32, height: 48 },\n  { left: 64,  top: 48, width: 32, height: 48 },\n  { left: 96,  top: 48, width: 32, height: 48 },\n  { left: 128, top: 48, width: 32, height: 48 },\n  { left: 160, top: 48, width: 32, height: 48 },\n  { left: 192, top: 48, width: 32, height: 48 },\n  { left: 224, top: 48, width: 32, height: 48 },\n]\nconst leftCells: SheetCell[] = [\n  { left: 224, top: 48, width: 32, height: 48 },\n]\nconst toRightCells: SheetCell[] = [\n  { left: 0,   top: 96, width: 32, height: 48 },\n  { left: 32,  top: 96, width: 32, height: 48 },\n  { left: 64,  top: 96, width: 32, height: 48 },\n  { left: 96,  top: 96, width: 32, height: 48 },\n  { left: 128, top: 96, width: 32, height: 48 },\n  { left: 160, top: 96, width: 32, height: 48 },\n  { left: 192, top: 96, width: 32, height: 48 },\n  { left: 224, top: 96, width: 32, height: 48 },\n]\nconst rightCells: SheetCell[] = [\n  { left: 224, top: 97, width: 32, height: 48 },\n]\nconst normalVelocityX = 220\nconst normalVelocityY = 240\nconst SHIELD_R = 30\n\nexport class Player extends Sprite {\n  toUp: boolean\n  toDown: boolean\n  toLeft: boolean\n  toRight: boolean\n  isShield: boolean = false\n  shieldTimer: number\n  attack: number = 5\n  shift: boolean\n  leftCalled: (status: boolean) => void\n  rightCalled: (status: boolean) => void\n  getShield(duration: number) {\n    this.shieldTimer && clearTimeout(this.shieldTimer)\n\n    this.isShield = true\n    this.shieldTimer = setTimeout(() => {\n      this.isShield = false\n      clearTimeout(this.shieldTimer)\n    }, duration || 10000);\n  }\n\n  setVelocitySlow(status: boolean) {\n    this.shift = status\n    if (status) {\n      this.velocityX = normalVelocityX / 2\n      this.velocityY = normalVelocityY / 2\n    } else {\n      this.velocityX = normalVelocityX\n      this.velocityY = normalVelocityY\n    }\n  }\n\n  getCoreRect(): Rect {\n    const {left, top, width, height, coreWidth, coreHeight, isShield} = this\n    return isShield ? {\n      left: left + width / 2 - SHIELD_R,\n      top: top + height / 2 - SHIELD_R,\n      width: 2 * SHIELD_R,\n      height: 2 * SHIELD_R,\n    } : {\n      left: left + (width - coreWidth) / 2,\n      top: top + (height - coreHeight) / 2,\n      width: coreWidth,\n      height: coreHeight,\n    }\n  }\n\n  beHit() {\n    const {isShield, width} = this\n    if (!isShield) {\n      showBlast(this, () => {\n        let refresh = setTimeout(() => {\n          clearTimeout(refresh)\n          this.setPropsInit()\n          this.getShield(5000)\n        }, 2000)\n      })\n      this.clean()\n    }\n  }\n\n  clean() {\n    const {width} = this\n    this.visible = false\n    this.left = (game.W - width) / 2\n    this.top = 1e4\n    this.shieldTimer && clearTimeout(this.shieldTimer)\n    this.isShield = false\n  }\n\n  setPropsInit() {\n    this.width = 32\n    this.height = 48\n    this.left = (game.W - player.width) / 2\n    this.top = game.H - player.height - 50\n    this.coreWidth = 10\n    this.coreHeight = 10\n\n    this.velocityX = normalVelocityX\n    this.velocityY = normalVelocityY\n    this.attack = 5\n\n    this.toUp = false\n    this.toDown = false\n    this.toLeft = false\n    this.toRight = false\n    this.shift = false\n    this.visible = true\n  }\n}\n\nclass PlayerSheetPainter extends SpriteSheetPainter {\n  paint(sprite: Player, context: CanvasRenderingContext2D) {\n    const cell = this.cells[this.cellIndex]\n\n    context.drawImage(this.spritesheet,\n      cell.left, cell.top,\n      cell.width, cell.height,\n      sprite.left, sprite.top,\n      cell.width, cell.height)\n\n    const {width, height, top, left, coreWidth, coreHeight, isShield} = sprite\n    const [centerX, centerY] = [left + width / 2, top + height / 2]\n    context.save()\n    if (sprite.shift) {\n      context.drawImage(game.getImage(core), centerX - coreWidth / 2, centerY - coreHeight / 2)\n    }\n\n    if (isShield) {\n      const shieldColor = ['#de5050', '#d07926', '#8ae242', '#38ccad', '#3031cc', '#bf30cc']\n      context.strokeStyle = shieldColor[parseInt((Math.random() * (shieldColor.length + 1)).toString())]\n      context.beginPath()\n      context.arc(centerX, centerY, SHIELD_R, 0, 2 * Math.PI)\n      context.closePath()\n      context.stroke()\n    }\n    context.restore()\n  }\n}\n\nlet player: Player = null\n\n// called after game ready\nexport function getPlayer () {\n  if (player) return player\n\n  const normal: Behavior = {\n    lastAdvance: 0,\n    PAGEFLIP_INTERVAL: 110,\n    execute: function (sprite: Player, context: CanvasRenderingContext2D, now: number) {\n      if (now - this.lastAdvance > this.PAGEFLIP_INTERVAL &&\n        !(sprite.toLeft !== sprite.toRight)) {\n          sprite.painter.advance()\n          this.lastAdvance = now\n      }\n    }\n  }\n\n  const leftOrRight: Behavior = {\n    lastAdvance: 0,\n    PAGEFLIP_INTERVAL: 18,\n    execute: function (sprite: Player, context: CanvasRenderingContext2D, now: number) {\n      if (sprite.toLeft) {\n        sprite.left -= game.pixelsPerFrame(now, sprite.velocityX)\n      }\n      if (sprite.toRight) {\n        sprite.left += game.pixelsPerFrame(now, sprite.velocityX)\n      }\n      if (sprite.toUp) {\n        sprite.top -= game.pixelsPerFrame(now, sprite.velocityY)\n      }\n      if (sprite.toDown) {\n        sprite.top += game.pixelsPerFrame(now, sprite.velocityY)\n      }\n      sprite.left = sprite.left >= game.W - sprite.width ? game.W - sprite.width :\n        sprite.left <= 0 ? 0 : sprite.left\n      sprite.top = sprite.top >= game.H - sprite.height ? game.H - sprite.height :\n        sprite.top <= 0 ? 0 : sprite.top\n      if (now - this.lastAdvance > this.PAGEFLIP_INTERVAL &&\n        (sprite.toLeft || sprite.toRight)) {\n          sprite.painter.advance()\n          this.lastAdvance = now\n      }\n    }\n  }\n\n  const playerImage = game.getImage(playerSheet)\n  const normalPainter = new PlayerSheetPainter(normalCells, playerImage)\n\n  // 左移绘制器，实现过渡以及保持左移状态\n  const toLeftPainter = new PlayerSheetPainter(toLeftCells, playerImage)\n  const leftPainter = new PlayerSheetPainter(leftCells, playerImage)\n  const leftAnimator = new SpriteAnimator([toLeftPainter], function (sprite: Player) {\n    sprite.painter = leftPainter\n  })\n  const leftReveseAnimator = new SpriteAnimator([\n      new PlayerSheetPainter(toLeftCells.slice().reverse(), playerImage)\n    ], function (sprite: Player) {\n      sprite.painter = sprite.toRight ? rightPainter : normalPainter\n    })\n\n  // 右移绘制器，实现过渡以及保持右移状态\n  const toRightPainter = new PlayerSheetPainter(toRightCells, playerImage)\n  const rightPainter = new PlayerSheetPainter(rightCells, playerImage)\n  const rightAnimator = new SpriteAnimator([toRightPainter], function (sprite: Player) {\n    sprite.painter = rightPainter\n  })\n  const rightReveseAnimator = new SpriteAnimator([\n      new PlayerSheetPainter(toRightCells.slice().reverse(), playerImage)\n    ], function (sprite: Player) {\n      sprite.painter = sprite.toLeft ? leftPainter : normalPainter\n    })\n\n  player = new Player('player', normalPainter, [normal, leftOrRight])\n\n  // 左移（键）按下和弹起时调用，一次过程中只调用一次\n  player.leftCalled = function (status: boolean) {\n    if (status) {\n      leftAnimator.start(this, leftOrRight.PAGEFLIP_INTERVAL * (toLeftCells.length - 1))\n    } else {\n      if (this.toRight) {\n        this.painter = rightPainter\n      } else {\n        leftReveseAnimator.start(this, leftOrRight.PAGEFLIP_INTERVAL * (toLeftCells.length - 1))\n      }\n    }\n  }\n\n  player.rightCalled = function (status: boolean) {\n    if (status) {\n      rightAnimator.start(this, leftOrRight.PAGEFLIP_INTERVAL * (toRightCells.length - 1))\n    } else {\n      if (this.toLeft) {\n        this.painter = leftPainter\n      } else {\n        rightReveseAnimator.start(this, leftOrRight.PAGEFLIP_INTERVAL * (toRightCells.length - 1))\n      }\n    }\n  }\n\n  // player prop init\n  player.setPropsInit()\n\n  return player\n}","import {game} from \"../Game\";\nimport { Behavior, Rect } from \"../modals\";\nimport { ImagePainter, Sprite } from \"../Sprite\";\nimport { getGUID, is2RectIntersect } from \"../utils\";\nimport bullets1 from '../../assets/bullets1.png'\n\n// 精灵图上的纵横长宽\nconst cell = { left: 1, top: 1, width: 6, height: 28 }\n\nclass BulletPainter extends ImagePainter {\n  paint(sprite: Sprite, context: CanvasRenderingContext2D) {\n    if (this.image !== undefined) {\n      if (!this.image.complete) {\n        this.image.onload = (e) => {\n          context.drawImage(this.image,\n            cell.left, cell.top,\n            cell.width * 2, cell.height * 2,\n            sprite.left, sprite.top,\n            cell.width, cell.height)\n        }\n      } else {\n        context.drawImage(this.image,\n          cell.left, cell.top,\n          cell.width * 2, cell.height * 2,\n          sprite.left, sprite.top,\n          cell.width, cell.height)\n      }\n    }\n  }\n}\n\nexport class PBulletsManager {\n  FIRE_TIME: number = 165\n  FIRE_LAST: number = 0\n\n  addPlayerBullet(time: number) {\n    const player = game.getSprite('player')\n    if (time - this.FIRE_LAST <= this.FIRE_TIME || !player.visible) return\n\n    this.FIRE_LAST = time\n\n    const normal: Behavior = {\n      lastAdvance: 0,\n      PAGEFLIP_INTERVAL: 0,\n      execute: function(sprite, context, now) {\n        sprite.left += game.pixelsPerFrame(now, sprite.velocityX)\n        sprite.top += game.pixelsPerFrame(now, sprite.velocityY)\n        if (!is2RectIntersect(<Rect>sprite, {left: 0, top: 0, width: game.W, height: game.H}))  sprite.visible = false\n      }\n    }\n\n    // 从引擎中取出两颗闲置bullet精灵，相当于从 playerBullets 中取\n    let p = game.getSprite('player')\n    const b = new Sprite(`pBullet-${getGUID()}`, new BulletPainter(bullets1), [{...normal}])\n    b.left = p.left\n    b.top = p.top - b.height\n    b.velocityY = -770\n    b.visible = true\n\n    const b1 = new Sprite(`pBullet-${getGUID()}`, new BulletPainter(bullets1), [{...normal}])\n    b1.left = p.left + p.width - b1.width\n    b1.top = p.top - b1.height\n    b1.velocityY = -770\n    b1.visible = true\n\n    game.setFreeSpriteNew(b)\n    game.setFreeSpriteNew(b1)\n  }\n\n  getPlayerBulletList(): Sprite[] {\n    return game.sprites.filter((s: Sprite) => {\n      return s.visible && s.name.startsWith('pBullet')\n    })\n  }\n}\n\nexport const pBulletsManager = new PBulletsManager()\n","import {game} from \"../Game\";\nimport bullet3 from '../../assets/bullet3.png'\nimport { Sprite, ImagePainter } from \"../Sprite\";\nimport { Behavior, Rect } from \"../modals\";\nimport { is2RectIntersect, getGUID } from \"../utils\";\n\nconst cell = { left: 40, top: 72, width: 16, height: 16 }\n\nclass BulletPainter extends ImagePainter {\n  paint(sprite: Sprite, context: CanvasRenderingContext2D) {\n    if (this.image !== undefined) {\n      if (!this.image.complete) {\n        this.image.onload = (e) => {\n          context.drawImage(this.image,\n            cell.left, cell.top,\n            cell.width, cell.height,\n            sprite.left, sprite.top,\n            cell.width, cell.height)\n        }\n      } else {\n        context.drawImage(this.image,\n          cell.left, cell.top,\n          cell.width, cell.height,\n          sprite.left, sprite.top,\n          cell.width, cell.height)\n      }\n    }\n  }\n}\n\nconst normal: Behavior = {\n  lastAdvance: 0,\n  PAGEFLIP_INTERVAL: 0,\n  execute: function(sprite, context, now) {\n    sprite.left += game.pixelsPerFrame(now, sprite.velocityX)\n    sprite.top += game.pixelsPerFrame(now, sprite.velocityY)\n    if (!is2RectIntersect(<Rect>sprite, game.getRect())) sprite.visible = false\n  }\n}\n\nclass EBulletsManager {\n  addEnemyBullet(behaviors: Behavior[]) {\n    const b = new Sprite(`eBullet-${getGUID()}`, new BulletPainter(bullet3), [normal, ...behaviors])\n    game.setFreeSpriteNew(b)\n    return b\n  }\n\n  getEnemyBulletList(): Sprite[] {\n    return game.sprites.filter((s: Sprite) => {\n      return s.visible && s.name.startsWith('eBullet')\n    })\n  }\n}\n\nexport const eBulletsManager = new EBulletsManager()\n","import { SheetCell, Behavior, Rect, Point } from \"../modals\";\nimport bullet3 from '../../assets/bullet3.png'\nimport { Sprite, SpriteSheetPainter } from \"../Sprite\";\nimport { game } from \"../Game\";\nimport { is2RectIntersect, getGUID } from \"../utils\";\nimport { Player } from \"./Player\";\n\nconst powerSmallCell: SheetCell = {\n  left: 0, top: 96, width: 16, height: 16,\n}\nconst pointSmallCell: SheetCell = {\n  left: 16, top: 96, width: 16, height: 16,\n}\nconst powerBigCell: SheetCell = {\n  left: 32, top: 96, width: 16, height: 16,\n}\nconst pointBigCell: SheetCell = {\n  left: 0, top: 96, width: 16, height: 16,\n}\nconst EFFECT_TYPE_SCORE = 'score'\nconst EFFECT_TYPE_ATTACK = 'attack'\nconst BONUS_TYPES = [\n  {\n    type: EFFECT_TYPE_SCORE,\n    num: 3,\n    cell: pointSmallCell,\n  },\n  {\n    type: EFFECT_TYPE_SCORE,\n    num: 5,\n    cell: pointBigCell,\n  },\n  {\n    type: EFFECT_TYPE_ATTACK,\n    num: 3,\n    cell: powerSmallCell,\n  },\n  {\n    type: EFFECT_TYPE_ATTACK,\n    num: 5,\n    cell: powerBigCell,\n  }\n]\n\nexport class Bonus extends Sprite {\n  BOUNS_TYPE: any\n\n  effect() {\n    const player = <Player>game.getSprite('player')\n    const {type, num} = this.BOUNS_TYPE\n    switch(type) {\n      case EFFECT_TYPE_ATTACK:\n        player.attack += num\n        break\n      case EFFECT_TYPE_SCORE:\n        game.score += num\n        break\n    }\n  }\n}\n\nexport function randomBonus(position: Rect) {\n  if (Math.random() * 100 > 70) {\n    // 30% 无奖励\n    return\n  }\n  const randomResult = BONUS_TYPES[parseInt((Math.random() * BONUS_TYPES.length).toString())]\n\n  const normal: Behavior = {\n    lastAdvance: 0,\n    PAGEFLIP_INTERVAL: 0,\n    execute: function (sprite: Sprite, context: CanvasRenderingContext2D, now: number) {\n      sprite.left += game.pixelsPerFrame(now, sprite.velocityX)\n      sprite.top += game.pixelsPerFrame(now, sprite.velocityY)\n      if (!is2RectIntersect(<Rect>sprite, game.getRect())) sprite.visible = false\n    }\n  }\n  const bounsSprite = new Bonus(`bonus-${getGUID()}`, new SpriteSheetPainter([randomResult.cell], game.getImage(bullet3)), [normal])\n  const {left, top, width, height} = position\n  bounsSprite.BOUNS_TYPE = randomResult\n  bounsSprite.left = left + (width - 16) / 2\n  bounsSprite.top = top + (height - 16) / 2\n  bounsSprite.velocityX = 0\n  bounsSprite.velocityY = 120\n  game.setFreeSpriteNew(bounsSprite)\n}\n\nexport function getVisiblableBonusList() {\n  return <Bonus[]>game.sprites.filter((s: Sprite) => {\n    return s.visible && s.name.startsWith('bonus')\n  })\n}","import Game, {game} from \"../Game\";\nimport enemy1 from '../../assets/enemy1.png'\nimport { Sprite, SpriteSheetPainter, SpriteAnimator } from \"../Sprite\";\nimport { SheetCell, Behavior, Rect } from \"../modals\";\nimport { getGUID, is2RectIntersect, getVelocityByLenPoint2Player } from \"../utils\";\nimport { eBulletsManager } from \"./EBullet\";\nimport { Player } from \"./Player\";\nimport { showBlast } from \"./Blast\";\nimport { randomBonus } from \"./Bonus\";\n\nconst cells: SheetCell[] = [\n  { left: 0,   top: 0, width: 48, height: 32 },\n  { left: 48,  top: 0, width: 48, height: 32 },\n  { left: 96,  top: 0, width: 48, height: 32 },\n  { left: 144,  top: 0, width: 48, height: 32 },\n]\n\nclass EnemySpriteSheetPainter extends SpriteSheetPainter {\n  paint(sprite: Enemy, context: CanvasRenderingContext2D) {\n    let cell = this.cells[this.cellIndex]\n    sprite.width = cell.width\n    sprite.height = cell.height\n    context.drawImage(this.spritesheet,\n      cell.left, cell.top,\n      cell.width, cell.height,\n      sprite.left, sprite.top,\n      cell.width, cell.height)\n\n    const {isBoss, initHp, hp} = sprite\n    if (isBoss) {\n      // 血条绘制\n      const L = game.W - 10 * 2\n      context.save()\n      context.fillStyle = '#fff'\n      context.strokeStyle = '#fff'\n      context.beginPath()\n      context.rect(10, 30, L, 4)\n      context.closePath()\n      context.stroke()\n      context.beginPath()\n      context.rect(10, 30, L * hp / initHp, 4);\n      context.closePath()\n      context.fill()\n      context.restore()\n    }\n  }\n}\n\nexport class Enemy extends Sprite {\n  hp: number = 100\n  score: number = 1\n  // boss props\n  isBoss: boolean = false\n  initHp: number = 0\n\n  // 普通自瞄弹\n  fire(time: number, speed: number = 150) {\n    if (this.visible) {\n      const player = <Player>game.getSprite('player')\n      const core = player.getCenterPoint()\n      const {left, top, width, height} = this\n      const b = eBulletsManager.addEnemyBullet([])\n      b.left = left + width / 2 - b.width / 2\n      b.top = top + b.height + 3\n      b.visible = true\n      const v = getVelocityByLenPoint2Player(b.left, b.top, core.left, core.top, speed)\n      b.velocityX = v.x\n      b.velocityY = v.y\n    }\n  }\n\n  beHit() {\n    const player = <Player>game.getSprite('player')\n    const {attack} = player\n    this.hp -= attack\n    if (this.hp <= 0) {\n      game.score += this.score\n      this.visible = false\n      randomBonus(this.getCoreRect())\n      showBlast(this)\n    }\n  }\n\n  toBeBoss(initHp: number) {\n    this.initHp = initHp\n    this.hp = initHp\n    this.isBoss = true\n  }\n}\n\nexport function getEnemy(behaviors: Behavior[] = []) {\n  const normal: Behavior = {\n    lastAdvance: 0,\n    PAGEFLIP_INTERVAL: 150,\n    execute: function (sprite: Sprite, context: CanvasRenderingContext2D, now: number) {\n      if (now - this.lastAdvance > this.PAGEFLIP_INTERVAL) {\n        sprite.painter.advance()\n        this.lastAdvance = now\n      }\n    }\n  }\n\n  // const fire: Behavior = {\n  //   lastAdvance: 0,\n  //   PAGEFLIP_INTERVAL: 400,\n  //   execute: function (sprite: Enemy, context: CanvasRenderingContext2D, now: number) {\n  //     if (now - this.lastAdvance > this.PAGEFLIP_INTERVAL) {\n  //       sprite.fire(now)\n  //       this.lastAdvance = now\n  //     }\n  //   }\n  // }\n\n  const enemy = new Enemy(`enemy-${getGUID()}`, new EnemySpriteSheetPainter(cells, game.getImage(enemy1)), [normal, ...behaviors])\n\n  enemy.velocityY = 20\n  enemy.velocityX = 40\n  enemy.width = 48\n  enemy.height = 32\n\n  return enemy\n}","import { Sprite } from \"./Sprite\";\nimport { game } from \"./Game\";\nimport { getEnemy, Enemy } from \"./sprites/Enemy\";\nimport { Behavior, Point } from \"./modals\";\nimport { is2RectIntersect, getVelocityByLenPoint2Player, delay, angle2radian } from \"./utils\";\nimport { eBulletsManager } from \"./sprites/EBullet\";\n\nconst normalMove: Behavior = {\n  execute: function (sprite: Sprite, context: CanvasRenderingContext2D, now: number) {\n    sprite.left += game.pixelsPerFrame(now, sprite.velocityX)\n    sprite.top += game.pixelsPerFrame(now, sprite.velocityY)\n\n    if (!is2RectIntersect(sprite.getCoreRect(), game.getRect())) {\n      sprite.visible = false\n    }\n  }\n}\n\nclass StageControl {\n  enemyLists: Sprite[] = []\n  lastTime: number = 0\n\n  private addToList(old: Sprite, newS: Sprite) {\n    const i = this.enemyLists.findIndex(v => v === old)\n    if (i === -1) {\n      this.enemyLists.push(newS)\n    } else {\n      this.enemyLists[i] = newS\n    }\n  }\n\n  private getVisibleEnemyNum() {\n    return this.enemyLists.filter(v => v.visible).length\n  }\n\n  display(time: number) {\n    if (game.score >= 0) {\n      return this.stage1(time)\n    }\n  }\n\n  stage1(time: number) {\n    const player = game.getSprite('player')\n    const {score} = game\n\n    if (score < 4 && time - this.lastTime >= 1000 && this.getVisibleEnemyNum() === 0) {\n      const b1: Behavior = {\n        lastAdvance: 0,\n        PAGEFLIP_INTERVAL: 600,\n        execute: function (sprite: Enemy, context: CanvasRenderingContext2D, now: number) {\n          if (sprite.top >= 150) sprite.velocityY = 0\n          if (now - this.lastAdvance > this.PAGEFLIP_INTERVAL && sprite.top >= 150) {\n            sprite.fire(now)\n            this.lastAdvance = now\n          }\n        }\n      }\n\n      const e = getEnemy([normalMove, {...b1}])\n      const rs = game.setFreeSpriteNew(e)\n      this.addToList(rs, e)\n      e.hp = 350\n      e.left = 100\n      e.top = 0\n      e.velocityX = 0\n      e.velocityY = 80\n      e.visible = true\n\n      const e2 = getEnemy([normalMove, {...b1}])\n      const rs2 = game.setFreeSpriteNew(e2)\n      this.addToList(rs2, e2)\n      e2.hp = 350\n      e2.left = game.W - 100 - e2.width\n      e2.top = 0\n      e2.velocityX = 0\n      e2.velocityY = 80\n      e2.visible = true\n\n      this.lastTime = time\n      return\n    }\n    if (4 <= score && score < 10 && time - this.lastTime >= 2000 && this.getVisibleEnemyNum() < 4) {\n      const behavior1: Behavior = {\n        lastAdvance: 0,\n        PAGEFLIP_INTERVAL: 1300,\n        execute: function (sprite: Enemy, context: CanvasRenderingContext2D, now: number) {\n          if (now - this.lastAdvance > this.PAGEFLIP_INTERVAL && game.H - sprite.top > 100) {\n            sprite.fire(now)\n            this.lastAdvance = now\n          }\n        }\n      }\n\n      const e = getEnemy([normalMove, {...behavior1}])\n      const rs = game.setFreeSpriteNew(e)\n      const pArr = [{x: 100, y: 0},{x: 0, y: 70},{x: 0, y: 130},{x: 200, y: 0},{x: 300, y: 0},{x: 500, y: 100},]\n      const position = pArr[parseInt((Math.random() * pArr.length).toString())]\n      this.addToList(rs, e)\n      e.hp = 61\n      e.left = position.x\n      e.top = position.y\n      const v = getVelocityByLenPoint2Player(e.left, e.top, player.left, player.top, 80)\n      e.velocityX = v.x\n      e.velocityY = v.y\n      e.visible = true\n\n      this.lastTime = time\n      return\n    }\n    if (10 <= score && score < 1e5 && time - this.lastTime >= 4000 && this.getVisibleEnemyNum() < 1) {\n      const ABS_VElOCITY_X = 90\n      const BOSS_HP = 2400\n      const FIRE2_INTERVAL = 45\n      const ß = 15\n      const rv = 70\n      const size = 360 / ß * 4\n\n      const fire2 = async (sprite: Enemy, time: number) => {\n        if (sprite.visible) {\n          const {left, top, width, height} = sprite\n          const fire2List: Sprite[] = []\n\n          for (let index = 0; index < size; index++) {\n            await delay((i: number) => {\n              const r = rv * (parseInt((ß * i / 360).toString()) + 1)\n              const d = ß * i\n              const b = eBulletsManager.addEnemyBullet([])\n              b.left = left + width / 2 + r * Math.cos(d / 180 * Math.PI) - b.width / 2\n              b.top = top + height / 2 + r * Math.sin(d / 180 * Math.PI) - b.height / 2\n              b.velocityX = 0\n              b.velocityY = 0\n              b.visible = true\n              fire2List[i] = b\n            }, FIRE2_INTERVAL, index)\n          }\n\n          for (let index = 0; index < size; index++) {\n            const b = fire2List[index]\n            const bSpeed = 120\n            const rad = angle2radian(ß * index)\n            b.velocityX = bSpeed * Math.cos(rad)\n            b.velocityY = bSpeed * Math.sin(rad)\n          }\n        }\n      }\n\n      const behavior1: Behavior = {\n        lastAdvance: 0,\n        PAGEFLIP_INTERVAL: 750,\n        execute: function (sprite: Enemy, context: CanvasRenderingContext2D, now: number) {\n          if (now - this.lastAdvance > this.PAGEFLIP_INTERVAL && sprite.top > 20) {\n            sprite.fire(now, 240)\n            this.lastAdvance = now\n          }\n        }\n      }\n\n      const behavior2: Behavior = {\n        lastAdvance: 0,\n        PAGEFLIP_INTERVAL: 0,\n        execute: function (sprite: Enemy, context: CanvasRenderingContext2D, now: number) {\n          if (sprite.top >= 130 && sprite.velocityY > 0) {\n            sprite.velocityY = 0\n            sprite.velocityX = ABS_VElOCITY_X\n          }\n          if (sprite.left >= game.W - 100 && sprite.velocityX > 0) {\n            sprite.velocityX = 0\n            delay(() => {\n              sprite.velocityX = -ABS_VElOCITY_X\n            }, (Math.random() * 3 + 2) * 1000)\n          }\n          if (sprite.left <= 100 - sprite.width && sprite.velocityX < 0) {\n            sprite.velocityX = 0\n            delay(() => {\n              sprite.velocityX = ABS_VElOCITY_X\n            }, (Math.random() * 3 + 2) * 1000)\n          }\n        }\n      }\n\n      const behavior3: Behavior = {\n        lastAdvance: 0,\n        // cd\n        PAGEFLIP_INTERVAL: 13 * 1000,\n        execute: function (sprite: Enemy, context: CanvasRenderingContext2D, now: number) {\n          // 到达水平中央时 fire2\n          const center: Point = sprite.getCenterPoint()\n          if (sprite.velocityY === 0 && sprite.velocityX !== 0\n            && now - this.lastAdvance > this.PAGEFLIP_INTERVAL\n            && (game.W / 2 - 10 < center.left && center.left < game.W / 2 + 10)) {\n            sprite.velocityX = 0\n            fire2(sprite, now)\n            delay(() => {\n              const direction = [-1, 1]\n              sprite.velocityX = ABS_VElOCITY_X * direction[parseInt((Math.random() * direction.length).toString())]\n              this.lastAdvance = now\n            }, size * FIRE2_INTERVAL)\n          }\n        }\n      }\n\n      const boss = getEnemy([normalMove, behavior1, behavior2, {...behavior3}])\n      const rs = game.setFreeSpriteNew(boss)\n      this.addToList(rs, boss)\n      boss.toBeBoss(BOSS_HP)\n      boss.score = 10\n      boss.left = (game.W - boss.width) / 2\n      boss.top = 0\n      boss.velocityX = 0\n      boss.velocityY = 80\n      boss.visible = true\n\n      this.lastTime = time\n      return\n    }\n  }\n}\n\nexport const stageControl = new StageControl()\n","import Game, { game } from './Game'\nimport playerSheet from '../assets/pl00.png'\nimport bullets1 from '../assets/bullets1.png'\nimport bullet3 from '../assets/bullet3.png'\nimport enemy1 from '../assets/enemy1.png'\nimport core from '../assets/core.png'\nimport bg1 from '../assets/bg1.png'\nimport arua from '../assets/arua.png'\nimport {Player, getPlayer} from './sprites/Player'\nimport { pBulletsManager } from './sprites/PBullet'\nimport {getEnemy, Enemy} from './sprites/Enemy'\nimport { eBulletsManager } from './sprites/EBullet';\nimport { is2RectIntersect } from './utils';\nimport { Rect } from './modals';\nimport { Sprite } from './Sprite';\nimport { stageControl } from './StageControl';\nimport { getVisiblableBonusList } from './sprites/Bonus';\n\nlet bgOffset = 0\nconst bgSpeed = 80\ngame.startAnimate = function (time) {\n  // bg\n  const bgImg = game.getImage(bg1)\n  game.context.drawImage(bgImg, 0, bgOffset - 512)\n  game.context.drawImage(bgImg, 0, 0 + bgOffset)\n  game.context.drawImage(bgImg, 0, bgOffset + 512)\n  bgOffset += game.pixelsPerFrame(time, bgSpeed)\n  bgOffset = bgOffset > 512 ? 0 : bgOffset\n\n\n  // 添加 bullet\n  pBulletsManager.addPlayerBullet(time)\n\n  stageControl.display(time)\n}\n\ngame.paintUnderSprites = function () {\n  // 可见精灵数\n  let visibleSprites = 0\n  for (const s of game.sprites) {\n    visibleSprites += +s.visible\n  }\n  const {context, fps, sprites, gameTime, score} = game\n  const player = <Player>game.getSprite('player')\n  const {attack} = player\n  context.save()\n  context.fillStyle = '#fff'\n  context.fillText(`fps: ${parseInt(fps.toString())}, sprites: ${\n    visibleSprites}/${sprites.length}, time: ${\n      parseInt((gameTime / 1000).toString())}, score: ${\n        score}, attack: ${attack}`, 5, 15)\n  context.restore()\n}\n\ngame.paintOverSprites = function() {\n  const player = <Player>game.getSprite('player')\n  const pCore = player.getCoreRect()\n\n  for (const bullet of eBulletsManager.getEnemyBulletList()) {\n    if (bullet.visible\n      && is2RectIntersect(bullet.getCoreRect(), pCore)) {\n        bullet.visible = false\n        // 击中玩家\n        player.beHit()\n    }\n  }\n\n  for (let i = 0; i < stageControl.enemyLists.length; i++) {\n    const enemy = <Enemy>stageControl.enemyLists[i]\n\n    if (enemy.visible && is2RectIntersect(enemy.getCoreRect(), pCore)) {\n      // 玩家与敌机相撞\n      player.beHit()\n    }\n\n    const playerBulletList = pBulletsManager.getPlayerBulletList()\n    for (let j = 0; j < playerBulletList.length; j++) {\n      const pBullet = playerBulletList[j]\n      if (enemy.visible && pBullet.visible && is2RectIntersect(enemy.getCoreRect(), pBullet.getCoreRect())) {\n        // 击中敌军\n        enemy.beHit()\n        pBullet.visible = false\n      }\n    }\n  }\n\n  for (const bouns of getVisiblableBonusList()) {\n    if (is2RectIntersect(bouns.getCoreRect(), pCore)) {\n      bouns.effect()\n      bouns.visible = false\n    }\n  }\n}\n\ngame.queueImage(playerSheet)\ngame.queueImage(bullets1)\ngame.queueImage(core)\ngame.queueImage(enemy1)\ngame.queueImage(bg1)\ngame.queueImage(bullet3)\ngame.queueImage(arua)\n\n/**\n * 添加事件监听\n * @param {*} game\n * @param {*} player\n */\nfunction addKeyListeners(game: Game, player: Player) {\n  game.addKeyListener({\n    key: 'left arrow',\n    listener: (e: KeyboardEvent, status: boolean) => {\n      if (status && !player.toLeft) {\n        // 第一次按下时，触发一下\n        player.leftCalled(true)\n      } else if (!status && player.toLeft) {\n        // 弹起的时候，触发一下\n        player.leftCalled(false)\n      }\n      player.toLeft = status\n    }\n  })\n\n  game.addKeyListener({\n    key: 'right arrow',\n    listener: (e: KeyboardEvent, status: boolean) => {\n      if (status && !player.toRight) {\n        player.rightCalled(true)\n      } else if (!status && player.toRight) {\n        player.rightCalled(false)\n      }\n      player.toRight = status\n    }\n  })\n\n  game.addKeyListener({\n    key: 'down arrow',\n    listener: (e: KeyboardEvent, status: boolean) => {\n      player.toDown = status\n    }\n  })\n\n  game.addKeyListener({\n    key: 'up arrow',\n    listener: (e: KeyboardEvent, status: boolean) => {\n      player.toUp = status\n    },\n  })\n\n  game.addKeyListener({\n    key: 'shift',\n    listener: (e: KeyboardEvent, status: boolean) => {\n      player.setVelocitySlow(status)\n    },\n  })\n\n  game.addKeyListener({\n    key: 'p',\n    listener: (e: KeyboardEvent, status: boolean) => {\n      if (!status) game.togglePaused()\n    }\n  })\n}\n\nfunction addOptionsListener(p: Player) {\n  document.getElementsByClassName('options')[0].addEventListener('change', function(e: Event) {\n    const {value, checked} = <HTMLInputElement>e.target\n    switch(value) {\n      case 'shield':\n        p.isShield = checked\n        break\n      case 'attack':\n        p.attack = checked ? 50 : 5\n        break\n    }\n  })\n}\n\nexport default () => {\n  let loadingInterval = setInterval(() => {\n    if (game.loadImages() >= 100) {\n      clearInterval(loadingInterval)\n\n      const player = getPlayer()\n      game.addSprite(player)\n\n      addKeyListeners(game, player)\n      addOptionsListener(player)\n      game.start()\n    }\n  }, 30)\n  console.log(game)\n}","import './index.css'\nimport Process from './js/progress'\nProcess()\n"]}