JS實現《黑客帝國》字元雨飄落特效【轉】

来源:https://www.cnblogs.com/KillBugMe/archive/2020/03/04/12409458.html
-Advertisement-
Play Games

此段代碼通過Canvas元素實現了電影《黑客帝國》中進入Matrix的終端界面的一個動畫效果。 相容H5和各種版本的瀏覽器。可以在這裡看到線上效果, "點我,點我!" 在瀏覽器中打開,配上F11全屏效果,效果棒棒的! 在代碼的起始部分,使用了一個相容低版本瀏覽器的requestAnimationFr ...


此段代碼通過Canvas元素實現了電影《黑客帝國》中進入Matrix的終端界面的一個動畫效果。
相容H5和各種版本的瀏覽器。可以在這裡看到線上效果,點我,點我!
在瀏覽器中打開,配上F11全屏效果,效果棒棒的!

在代碼的起始部分,使用了一個相容低版本瀏覽器的requestAnimationFrame的方法。也能提高瀏覽器的性能。
代碼里有5個技巧,
1、var clearColor = ‘rgba(0, 0, 0, .1)’;
ctx.fillStyle = clearColor;
ctx.fillRect(0, 0, w, h);
此段代碼在每次迴圈的時候繪製了一個0.1透明度的蒙層,一次次的覆蓋,在字元下落的時候,留下一段陰影效果。
2、context.fillText(text, i * font_size, drops[i] * font_size);
通過此段代碼在一次迴圈中繪製出整屏的字元,通過i的增加變更列,通過drops[i],變更每列的行。通過drops[i]最初形成是依據高度隨機的,第二屏之後都是從0起始。
3、ctx.translate(w, 0);
ctx.scale(-1, 1);
通過翻轉畫布,造成字元翻轉的效果,給人一種神秘感。原電影中的日文都是翻轉後的。
4、Math.random() > 0.95;
可以使每列字元消失的時間隨機,這樣重新生成的時間也隨機了,形成字元參差不齊的效果。

5、words字元串可以依據需要修改,全是日文平假名感覺更真實。

<canvas id="canvas" style="background:#000;"></canvas>
<script>
    //相容低版本瀏覽器的requestAnimationFrame;
    (function() {
        var lastTime = 0;
        var vendors = ['ms', 'moz', 'webkit', 'o'];
        for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
            window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
            window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] +
                'CancelRequestAnimationFrame'];
        }
        if (!window.requestAnimationFrame) window.requestAnimationFrame = function(callback, element) {
            var currTime = new Date().getTime();
            var timeToCall = Math.max(0, 16 - (currTime - lastTime));
            var id = window.setTimeout(function() {
                callback(currTime + timeToCall);
            }, timeToCall);
            lastTime = currTime + timeToCall;
            return id;
        };
        if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function(id) {
            clearTimeout(id);
        };
    }());


    window.onload = function() {
        var canvas = document.getElementById('canvas'),
            ctx = canvas.getContext('2d'),
            w, h;
        w = canvas.width = window.innerWidth;
        h = canvas.height = window.innerHeight;


        // 初始化
        var wordColor = "#33ff33",
            words =
            "0123456789qwertyuiopasdfghjklzxcvbnm,./;'\[]QWERTYUIOP{}ASDFGHJHJKL:ZXCVBBNM<>?がガぎギぐグげゲごゴきゃキャきゅキュきょキョりゃリャゅリュりょリョ",
            wordsArr = words.split(''),
            font_size = 16,
            clumns = parseInt(w / font_size, 10), //瀏覽器寬除以字元寬得列數
            drops = []; //存儲每列的起始位置


        for (var i = 0; i < clumns; i++) {
            // 隨機的起始位置
            drops[i] = Math.floor(Math.random() * h);
        }

        // 繪製
        function draw(time) {
            ctx.save();


            // 水平翻轉畫布
            ctx.translate(w, 0);
            ctx.scale(-1, 1);

            // 填充字元
            ctx.fillStyle = wordColor;
            ctx.font = font_size + "px arial";
            for (var i = 0; i < drops.length; i++) {
                var text = wordsArr[Math.floor(Math.random() * wordsArr.length)];
                ctx.fillText(text, i * font_size, drops[i] * font_size);
                // 0.95的隨機數造成列消失的時間不一致,產生的列也隨之改變
                if (drops[i] * font_size > h && Math.random() > 0.95) {
                    drops[i] = 0;
                }
                drops[i]++;
            }
            ctx.restore();
        }


        //迴圈
        var clearColor = 'rgba(0, 0, 0, .1)', //每次迴圈加0.1透明的蒙層
            lt = 0,
            speed = 50; // 字體下落速度
        function drawFrame(time) {
            if (time - lt > speed) {
                lt = time;
                ctx.fillStyle = clearColor;
                ctx.fillRect(0, 0, w, h);
                draw();
            }
            window.requestAnimationFrame(drawFrame, canvas);
        }
        window.requestAnimationFrame(drawFrame, canvas);

        //瀏覽器縮放
        function resize() {
            w = canvas.width = window.innerWidth;
            h = canvas.height = window.innerHeight;
        }
        canvas.addEventListener("resize", resize);
        // 綁定F11全屏事件,由於全屏事件在部分瀏覽器中不會觸發resize,和無法通過F11捕捉到fullscreenchange事件,於是用F11的keyup替代。感謝boyipiao童鞋的反饋~
        document.addEventListener('keyup', function(event) {
            var code = event.keyCode || event.which;
            if (code == 122) {
                resize();
            }
        }, false);
    }
</script>

文章來自:https://blog.csdn.net/xingzheouc/article/details/51143445


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 重排序方法 1. reserve() 反轉 反轉數組中元素的順序。 2. sort() 重排序(預設升序) sort()方法可以對數組中的每一個元素進行排序,但是問題來了, 即便數組元素全部都是數值類型,此方法依然會將所有元素先轉換成字元串再進行升序排序。 因此,為瞭解決這個問題,sort()方法允 ...
  • 轉換方法 調用數組的toString()方法、toLocaleString()方法會返回由數組中每個值的字元串形式拼接而成的一個以 逗號 分隔的 字元串 。 註意: 對undefined、null以及Object(對象)類型的值會有特殊情況,undefined、null返回空,對象類型的返回[obj ...
  • 作用域:在js預編譯時、代碼執行之前對全局或局部的變數進行收集,存放在一指定記憶體中scope,執行時對scope進行訪問,scope 就是全局或局部的作用域。 如: 1 function test() { 2 var a = 123; 3 } 4 5 test(); 在test() 執行之前對tes ...
  • 給一個HTML元素設置css屬性,如 這樣寫太羅嗦了,為了簡單些寫個工具函數,如 發現 "Google API" 中使用了cssText屬性,後在各瀏覽器中測試都通過了。一行代碼即可,實在很妙。如 和innerHTML一樣,cssText很快捷且所有瀏覽器都支持。此外當批量操作樣式時,cssText ...
  • 但是 IE6 7 下沒有 JSON 對象,所以要藉助 "json2.js" 來實現。 今天我們來簡單介紹下stringify方法的一些正確使用姿勢吧。 當然,讓高手們賤笑了,本文只是分享一些方法給新手朋友們。 ~~~ var data = [ {name: "王尼瑪", sex:1, age: 30 ...
  • 綜合指南: 何時使用 Em 與 Rem [TOC] 你可能已經很熟練使用這兩個靈活的單位,但你可能不完全瞭解何時使用 rem ,何時使用 em。 本教程將幫你弄清楚! Em 和 rem都是靈活、 可擴展的單位,由瀏覽器轉換為像素值,具體取決於您的設計中的字體大小設置。 如果你使用值 1em 或 1r ...
  • <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>demo</title> <!-- 引入animate.css--> <link href="https://cdn.jsdelivr.net/npm/animate.css@3. ...
  • 前置任務 在說原型對象是什麼之前,我們先討論一下 對象 是什麼東西 在說對象是什麼之前,我們又得討論一下 引用類型 引用類型 ![](https://ae01.alicdn.com/kf/U511530ba0ea143d69c43f6a3ac1feba0a.jpg ) 首先,js 中變數的值分兩種類 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...