Table of Contents
这里记录的是 Phaser3.50 示例中的 Audio 和 Cache 部分 api 的用法。详情还是看 Phaser api 文档比较好。
Audio
Audio Sprite
class AudioSprite extends Phaser.Scene {
  constructor() {
    super()
  }
  preload() {
    this.load.baseURL = globalConfig.baseUrl
    this.load.image('title', 'assets/pics/catastrophi.png')
    this.load.spritesheet('button', 'assets/ui/flixel-button.png', {
      frameWidth: 80,
      frameHeight: 20
    })
    this.load.bitmapFont('nokia', 'assets/fonts/bitmap/nokia16black.png', 'assets/fonts/bitmap/nokia16black.xml')
    this.load.audioSprite('sfx', 'assets/audio/SoundEffects/fx_mixdown.json', [
      'assets/audio/SoundEffects/fx_mixdown.ogg',
      'assets/audio/SoundEffects/fx_mixdown.mp3'
    ])
  }
  create() {
    this.add.image(400, 300, 'title')
    const spritemap = this.cache.json.get('sfx').spritemap
    let i = 0
    for (let spriteName in spritemap) {
      if (!spritemap.hasOwnProperty(spriteName)) {
        continue
      }
      this.makeButton(spriteName, 680, 115 + i * 40)
      i++
    }
    this.input.on('gameobjectover', function(pointer, button) {
      this.setButtonFrame(button, 0)
    }, this)
    this.input.on('gameobjectout', function(pointer, button) {
      this.setButtonFrame(button, 1)
    }, this)
    this.input.on('gameobjectdown', function(pointer, button) {
      this.sound.playAudioSprite('sfx', button.name)
      this.setButtonFrame(button, 2)
    }, this)
    this.input.on('gameobjectup', function(pointer, button) {
      this.setButtonFrame(button, 0)
    }, this)
  }
  makeButton(name, x, y) {
    const button = this.add.image(x, y, 'button', 1).setInteractive()
    button.name = name
    button.setScale(2, 1.5)
    const text = this.add.bitmapText(x - 40, y - 8, 'nokia', name, 16)
    text.x += (button.width - text.width) / 2
  }
  setButtonFrame(button, frame) {
    button.frame = button.scene.textures.getFrame('button', frame)
  }
}
const config = {
  type: Phaser.AUTO,
  parent: 'demo',
  width: 800,
  height: 600,
  scene: [AudioSprite],
  pixelArt: true,
  audio: {
    disableWebAudio: true
  }
}
const game = new Phaser.Game(config)
this.load.bitmapFont(key [, textureURL] [, fontDataURL] [, textureXhrSettings] [, fontDataXhrSettings])
加载基于 xml 的点阵字体(bitmap font)。
点阵字体是把每一个字符都分成16×16或24×24个点,然后用每个点的虚实来表示字符的轮廓。点阵字体也叫位图字体,其中每个字形都以一组二维像素信息表示。点阵字体不需要矢量计算,但是缩放模糊。
this.load.audioSprite(key, jsonURL [, audioURL] [, audioConfig] [, audioXhrSettings] [, jsonXhrSettings])
加载基于 json 文件的音频文件。这段音频是多个音频合成的,音频的分割描述在 json 文件里。比如:
{
  "resources": [
    "./assets/audio/SoundEffects/fx_mixdown.ogg",
    "./assets/audio/SoundEffects/fx_mixdown.mp3"
  ],
  "spritemap": {
    "alien death": {
      "start": 1, // 秒
      "end": 2,
      "loop": false
    },
    "boss hit": {
      "start": 3,
      "end": 3.5,
      "loop": false
    },
  }
}
如果 json 文件里 resources 指定了音频资源,方法里可以不写 audioURL 参数。
this.cache.json.get(‘sfx’).spritemap
文件加载器(file loader)会将加载的文件放到全局缓存里。这里从缓存里获取 xfs 指向的 json 文件(对象),取得 spritemap 属性。
this.sound.playAudioSprite(key, spriteName [, config])
将一段音频添加到音频管理器并播放,结束后自动销毁。
| 参数 | 说明 | 
|---|---|
| key | 音频资源 | 
| spriteName | 音频片段名称 | 
| config | 音频配置对象。 | 
this.add.bitmapText(x, y, font [, text] [, size] [, align])
创建点阵文字并添加到场景。
Phaser.Textures.TextureManager.getFrame(key [, frame])
获取指定纹理的指定帧
Basic Playback And Events
示例中长长的链式调用吓到我了~~~
this.load.audio(key [, urls] [, config] [, xhrSettings])
添加音频。
this.sound.pauseOnBlur( = true/false)
当游戏失焦的时候是否停止播放。比如切换到其他标签页或者应用。
this.sound.addAudioSprite(key [, config])
添加 audio sprite 到音频管理器。
Loop Delay
Phaser.Sound.BaseSound.addMarker(marker)
向当前声音中添加标记。标记由名称、开始时间、持续时间和可选配置对象表示。这允许您将多个声音捆绑到一个音频文件中,并使用标记在它们之间跳转以进行播放。
marker 可以代替 audio sprite 的 json 文件。可用多个 marker 对 this.load.audio() 方式添加的音频标记。
也可以在播放的时候传入 marker 达到播放 audio sprite 的作用。比如:this.sound.play(key, marker)
| 配置项 | 说明 | 
|---|---|
| name | 音频标记的唯一识别 | 
| start | 音频播放开始位置。秒。可选 | 
| duration | 音频标记播放持续时间。秒。可选 | 
| config | 音频配置 | 
Cache
Json File
this.load.json(key [, url] [, dataKey] [, xhrSettings])
加载 json 文件。
this.cache.json.get(key)
Text File
this.load.text(key [, url] [, xhrSettings])
加载 txt 文本。
this.cache.txt.get(key)
Xml File
this.load.xml(key [, url] [, xhrSettings])
加载 xml 文件。
this.cache.xml.get(key)
获取到的对象是 DOM。可以使用 data.getElementsByTagName(name) 之类的方法。