我最近为我的独立游戏添加了一些对话框选项, Dungeon扫地机:骑士冒险,想为对话框文本创建打字机效果。
此技术适用于单型字体,并且可能不适用于可变宽度字体。
失败的尝试
我的第一次尝试是一次写一封信。但这与未与包装的左边或文本不符的文本无效。
我的第二次尝试是使用非空间空白空间来替换所有字符。这将有助于无左文本和文字包裹的文本,但随后我了解到并非所有的空白都是相等的。
人物空间
我发现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;
},
});
});
}
概括
我对动画的结果非常满意,现在我从对话框函数中称呼它。
如果您有兴趣关注游戏的开发
欢呼ð»