在phaser.js v3中创建打字机效应
#javascript #gamedev #phaser

我最近为我的独立游戏添加了一些对话框选项, Dungeon扫地机:骑士冒险,想为对话框文本创建打字机效果。

Dungeon Sweeper: A Knights Adventure dialog animation

此技术适用于单型字体,并且可能不适用于可变宽度字体。

失败的尝试

我的第一次尝试是一次写一封信。但这与未与包装的左边或文本不符的文本无效。

我的第二次尝试是使用非空间空白空间来替换所有字符。这将有助于无左文本和文字包裹的文本,但随后我了解到并非所有的空白都是相等的。

人物空间

我发现an amazing webpage帮助我找到了正确使用的空白。我需要的空间称为图形空间,与字符相同。

代码

我希望能够创建一个接受Phaser.GameObjecte.Text并自动应用动画的函数。

该功能将维护运行动画所需的状态。

该功能需要等待,因此呼叫者知道动画何时完成。

/**
 * Create typewriter animation for text
 * @param {Phaser.GameObjects.Text} target
 * @param {number} [speedInMs=25]
 * @returns {Promise<void>}
 */
export function animateText(target, speedInMs = 25) {
  // store original text
  const message = target.text;
  const invisibleMessage = message.replace(/[^ ]/g, "");

  // clear text on screen
  target.text = "";

  // mutable state for visible text
  let visibleText = "";

  // use a Promise to wait for the animation to complete
  return new Promise((resolve) => {
    const timer = target.scene.time.addEvent({
      delay: speedInMs,
      loop: true,
      callback() {
        // if all characters are visible, stop the timer
        if (target.text === message) {
          timer.destroy();
          return resolve();
        }

        // add next character to visible text
        visibleText += message[visibleText.length];

        // right pad with invisibleText
        const invisibleText = invisibleMessage.substring(visibleText.length);

        // update text on screen
        target.text = visibleText + invisibleText;
      },
    });
  });
}

概括

我对动画的结果非常满意,现在我从对话框函数中称呼它。

如果您有兴趣关注游戏的开发

欢呼ð»