【Canvas与艺术】黑客帝国下坠字幕特效

【关键点】

字幕下坠即控制文字的纵坐标不断下移,而半透明蒙版是尾迹字残留的关键。

【效果】

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
     <title>黑客帝国下坠字幕特效</title>
     </head>

     <body onload="draw()">
        <canvas id="myCanvas" width="100px" height="100px" style="border:0px dashed black;">
            出现文字表示您的浏览器不支持HTML5
        </canvas>
     </body>
</html>
<script type="text/javascript">
<!--
/*****************************************************************
* 将全体代码(从<!DOCTYPE到script>)拷贝下来,粘贴到文本编辑器中,
* 另存为.html文件,再用chrome浏览器打开,就能看到实现效果。
******************************************************************/

// 常量画布宽
const Width=1200;

// 常量画布高
const Height=512;

// 文本字体大小
const FontSize=18;

// 绘图上下文
var context;

// 舞台对象
var stage;

// 肇始函数
function draw(){
    // Canvas
    var canvas=document.getElementById('myCanvas');    
    canvas.width=Width;
    canvas.height=Height;    
    context=canvas.getContext('2d');    
    
    // 准备
    stage=new Stage();    
    stage.init();

    // 开幕
    animate();
};

// 循环播放动画
function animate(){    
    stage.update();
    stage.paintBg(context);
    stage.paintFg(context);     

    if(true){
        // 延时执行以免下坠太快
        const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
 
        delay(90).then(() => {
            window.requestAnimationFrame(animate);
        });        
    }
}

// 舞台类
function Stage(){
    // 此数组存储了出现文字的位置
    this.drops=new Array();
    
    // 初始化粒子
    this.init=function(){
        var colCnt = Math.floor(Width / FontSize) ;// 算能容纳多少列
        for(let i = 0;i<colCnt ; i++){
            var item={};

            // x就是所在列
            item.x=i*FontSize;
            // y取随机数
            item.y=Math.random()*Math.floor(Height/FontSize)*FontSize;        
            
            this.drops.push(item);
        }
    }

    // 更新粒子的位置
    this.update=function(){
        this.drops.forEach(function (item, i) {
            // 下坠靠增加纵坐标
            item.y+=FontSize;

            // 越界归原
            if(item.y>Height){
                item.y=1*FontSize;
            }
        })        
    };

    //  画背景
    this.paintBg=function(ctx){
        // ctx.fillStyle="black"; // 如果只是填充黑色,只能看到单个字符下落
        ctx.fillStyle = "rgba(0, 0, 0, 0.07)";// 如果加上半透明蒙层,则出现了残影效果,这句代码是黑客帝国字符流下坠效果的关键所在,透明度越小,字符越密集
        
        ctx.fillRect(0,0,Width,Height);

        // 作者标识
        ctx.fillStyle="yellow";
        ctx.font="12px Arial";
        ctx.fillText("黑客帝国字母特效 by:逆火",Width-160,Height-20);
    };

    // 画前景
    this.paintFg=function(ctx){
        this.drops.forEach(function (item, i) {
            ctx.fillStyle = "green";  //文字颜色
            ctx.font = FontSize + "px consolas";

            var text=getText();
            ctx.fillText(text,item.x, item.y);
        })    
    };
}

// 取显示的文字
function getText(){
    var sentence="富强民主文明和谐自由平等公正法治爱国敬业诚信友善";
    var n=sentence.length;
    var i=Math.random()*n;
    return sentence.charAt(i);
}

/*----------------------------------
若能安居乐业,谁愿颠沛流离
----------------------------------*/
//-->
</script>

END

posted @ 2013-10-17 09:39  逆火狂飙  阅读(182)  评论(0编辑  收藏  举报
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东