预载并管理字体文件
preload() 会等待 loadFont() 完成后再进入 setup()。案例从课程媒体库载入 Candara.ttf,避免在字体尚未准备好时生成空的文字轮廓。
loadFont()、textFont()、文字排版、逐字动画
使用 preload() 与 loadFont() 在绘制前加载课程媒体库中的自定义字体。
理解 textFont() 与 textToPoints() 如何把字体轮廓转换为可绘制的点数组。
根据画布宽度和字符串长度计算字号,组织多组文本的响应式排版。
使用循环、curveVertex()、sin() 和 cos() 制作逐帧变化的文字轮廓动画。
preload() 会等待 loadFont() 完成后再进入 setup()。案例从课程媒体库载入 Candara.ttf,避免在字体尚未准备好时生成空的文字轮廓。
textFont() 设置当前字体,textToPoints() 则把 Alukardo 与 Welcome to My Class 的字形轮廓转换为点数组。文字从显示内容变成可计算、可连接和可动画的数据。
width / myText.length 与 width / vbText.length 根据画布宽度和字符数量计算字号比例。较短的名字使用更大的倍率,较长的句子使用更紧凑的字号,使两组文字都能落在 960×540 画布中。
sampleFactor 控制字体轮廓的采样密度;循环按 pointStep 或 alternateStep 选择点,再交给 curveVertex() 连接。限制最大步长可以保证每一帧保留足够的曲线顶点。
beginShape() 告诉 p5.js 开始收集一条自定义路径的顶点;循环中的 curveVertex() 依次加入字体轮廓点;endShape() 结束收集并绘制整条曲线。把顶点调用放在这两个函数之间,才能将离散坐标连接成连续的文字轮廓。
draw() 每帧重绘黑色背景,并用 random() 改变线宽和颜色。sin() 与 cos() 持续改变采样步长;当 p1 回到最小值时切换 direction,让两组文字轮廓轮流进入画面。
正在载入源码…自定义字体必须先进入媒体库,并通过稳定的公开路径由 loadFont() 加载。
使用画布宽度和文本长度决定字号,让不同长度的文字共享同一构图范围。
textToPoints() 把字形拆成坐标点,文字因此可以被采样、连接和重新组织。
循环、三角函数和状态切换共同控制采样密度,让静态字形产生连续运动。