JavaScript实现仿《三国志曹操传》风格的打字机文字输出效果

作者:闭包旅人

时间:2026-10-26

浏览:256

本文介绍如何在JavaScript游戏开发中实现仿《三国志曹操传》风格的对话文字输出。通过结合数组、循环与setTimeout定时器,解决JS变量作用域在异步回调中的问题,实现文字逐字延迟显示。文章详细解析了substring截取字符串与innerHTML拼接的核心代码逻辑,并提供完整示例供参考。

文章目录

引言与背景

在前两期内容中,我们已经介绍了如何实现人物的移动功能。本期我们将重点探讨如何在游戏中实现类似《三国志曹操传》风格的剧情对话效果。具体的实现思路与链接将在下方展示。

一、前言

大家可能见过某些新闻或界面中,文字以类似打字机的方式逐字显现的效果。本期的主要目标就是复现这种视觉效果。

9月5日,我在办公室萌生了编写此类程序的想法,并初步构思了实现路径。起初尝试通过调整CSS的margin属性来实现,虽然勉强做出了效果,但过程繁琐且技术实现较为粗糙,因此最终放弃了该方案,转而采用数组配合循环的方式。9月13日,我利用空闲时间完成了代码编写。由于工作日工作繁忙,无法及时更新博客,直到周末才整理好经验与大家分享,希望能与各位共同进步。

代码实现与解析

二、代码讲解

首先,我们来看一段核心代码示例:

代码如下:

var contentout = [];
var content = "ducle, ducle, ducle, ducle...";
contentout = content.substring(0, content.length);
var sub = 0;
var time = 0;
function input(){
for(var i = 0; i < contentout.length; i++){
setTimeout("document.getElementById('ID_P_CONTENT').innerHTML+= contentout[sub], sub += 1", time);
time += 100;
} 
}

仅用上述少量代码,便实现了预期的效果。虽然形容略显夸张,但确实达到了理想结果。接下来,我们将对代码进行详细解析。



该段代码实现了打字机式的文字输出功能,主要依赖数组、循环以及几个基础变量,整体难度适中。


代码如下:

var contentout = [];
var content = "ducle, ducle, ducle, ducle...";
contentout = content.substring(0, content.length);
var sub = 0;
var time = 0;

这里首先定义了全局变量。核心在于数组的定义,因为数组和循环是整个程序的关键。接着定义了字符串变量content,并将其初始值设定为“ducle, ducle, ducle, ducle...”。接下来的步骤是将字符串中的字符逐一提取并存入数组中,这里使用了substring()函数,该函数的作用正是将字符串切割为单个字符序列。



substring语法:stringObject.substring(start,stop)
此外,也可以参考w3cschool的相关文档:https://www.jb51.net/w3school/js/jsref_substring.htm

当字符串被切割后,我们需要将结果赋值给数组,这样数组就能正确地将每个字符作为成员按顺序放入对应的下标中。随后的步骤显而易见,即通过循环将数组中的元素逐个显示出来。



剩余的变量sub用于作为输出数组元素时的下标索引,而time则用于控制循环输出时的时间间隔。具体机制将在下文详细分析。


继续查看核心逻辑代码:


代码如下:

function input(){
for(var i = 0; i < contentout.length; i++){
setTimeout("document.getElementById('ID_P_CONTENT').innerHTML+= contentout[sub], sub += 1", time);
time += 100;
} 
}

这是实现逐个输出数组元素的核心部分。JavaScript中的for循环有一个常见特性:循环变量i在循环结束后会保留最后一个值(即最大值)。如果在循环内部直接使用alert(i),可能会发现每次输出的值都相同且等于最大值。因此,这里定义独立的sub变量至关重要。



由于sub变量在等待后才进行处理,因此无论循环执行多少次,它都必须经过一定时间才会执行+=1操作。利用它作为输出时的下标是最为合适的。



关于setTimeout函数,其机制是:如果设置了相同的两个setTimeout时间参数,它们会在同一时刻执行,即使代码书写在不同的行。因此,我们在每次循环中将time增加100毫秒,使得文字每隔100毫秒多显示一个字符。



此外,需要注意的是,在修改DOM对象内容时,必须使用+=运算符进行拼接,否则每次只会覆盖显示最后一个字符,无法实现逐字显示的效果。

效果演示与总结

代码下载地址 三、演示效果

初始状态如下:

引言与背景

中间过程如下:

引言与背景

最终效果如下:

引言与背景

演示地址: 四、后记

功夫不负有心人,我认为游戏设计并非难事,只要用心投入并努力实践,就能获得成功。未来若有更好的技术心得,我会及时分享给大家。最近我整理了一些之前讲解的技术点,制作了一个小demo,希望大家喜欢。该demo的下载和试玩版本将在不久后公布,目前仍在测试阶段。另外,游戏开发与游戏引擎至关重要,我计划亲自开发自己的引擎,以便更灵活地进行游戏设计。 感谢大家的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章