js实现canvas黑客帝国文字矩阵动画效果代码

代码语言:html

所属分类:动画

代码描述:js实现canvas黑客帝国文字矩阵动画效果代码

代码标签: 黑客帝国 文字 矩阵 动画 效果

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script>
        "use strict";
    (function() {
    
    Error.stackTraceLimit = Infinity;
    
    var $global, $module;
    if (typeof window !== "undefined") { /* web page */
      $global = window;
    } else if (typeof self !== "undefined") { /* web worker */
      $global = self;
    } else if (typeof global !== "undefined") { /* Node.js */
      $global = global;
      $global.require = require;
    } else { /* others (e.g. Nashorn) */
      $global = this;
    }
    
    if ($global === undefined || $global.Array === undefined) {
      throw new Error("no global object found");
    }
    if (typeof module !== "undefined") {
      $module = module;
    }
    
    var $packages = {}, $idCounter = 0;
    var $keys = function(m) { return m ? Object.keys(m) : []; };
    var $flushConsole = function() {};
    var $throwRuntimeError; /* set by package "runtime" */
    var $throwNilPointerError = function() { $throwRuntimeError("invalid memory address or nil pointer dereference"); };
    var $call = function(fn, rcvr, args) { return fn.apply(rcvr, args); };
    var $makeFunc = function(fn) { return function() { return $externalize(fn(this, new ($sliceType($jsObjectPtr))($global.Array.prototype.slice.call(arguments, []))), $emptyInterface); }; };
    var $unused = function(v) {};
    
    var $mapArray = function(array, f) {
      var newArray = new array.constructor(array.length);
      for (var i = 0; i < array.length; i++) {
        newArray[i] = f(array[i]);
      }
      return newArray;
    };
    
    var $methodVal = function(recv, name) {
      var vals = recv.$methodVals || {};
      recv.$methodVals = vals; /* noop for primitives */
      var f = vals[name];
      if (f !== undefined) {
        return f;
      }
      var method = recv[name];
      f = function() {
        $stackDepthOffset--;
        try {
          return method.apply(recv, arguments);
        } finally {
          $stackDepthOffset++;
        }
      };
      vals[name] = f;
      return f;
    };
    
    var $methodExpr = function(typ, name) {
      var method = typ.prototype[name];
      if (method.$expr === undefined) {
        method.$expr = function() {
          $stackDepthOffset--;
          try {
            if (typ.wrapped) {
              arguments[0] = new typ(arguments[0]);
            }
            return Function.call.apply(method, arguments);
          } finally {
            $stackDepthOffset++;
          }
        };
      }
      return method.$expr;
    };
    
    var $ifaceMethodExprs = {};
    var $ifaceMethodExpr = function(name) {
      var expr = $ifaceMethodExprs["$" + name];
      if (expr === undefined) {
        expr = $ifaceMethodExprs["$" + name] = function() {
          $stackDepthOffset--;
          try {
            return Function.call.apply(arguments[0][name], arguments);
          } finally {
            $stackDepthOffset++;
          }
        };
      }
      return expr;
    };
    
    var $subslice = function(slice, low, high, max) {
      if (low < 0 || high < low || max < high || high > slice.$capacity || max > slice.$capacity) {
        $throwRuntimeError("slice bounds out of range");
      }
      var s = new slice.constructor(slice.$array);
      s.$offset = slice.$offset + low;
      s.$length = slice.$length - low;
      s.$capacity = slice.$capacity - low;
      if (high !== undefined) {
        s.$length = high - low;
      }
      if (max !== undefined) {
        s.$capacity = max - low;
      }
      return s;
    };
    
    var $substring = function(str, low, high) {
      if (low < 0 || high < low || high > str.length) {
        $throwRuntimeError("slice bounds out of range");
      }
      return str.substring(low, high);
    };
    
    var $sliceToArray = function(slice) {
      if (slice.$array.constructor !== Array) {
        return slice.$array.subarray(slice.$offset, slice.$offset + slice.$length);
      }
      return slice.$array.slice(slice.$offset, slice.$offset + slice.$length);
    };
    
    var $decodeRune = function(str, pos) {
      var c0 = str.charCodeAt(pos);
    
      if (c0 < 0x80) {
        return [c0, 1];
      }
    
      if (c0 !== c0 || c0 < 0xC0) {
        return [0xFFFD, 1];
      }
    
      var c1 = str.charCodeAt(pos + 1);
      if (c1 !== c1 || c1 < 0x80 || 0xC0 <= c1) {
        return [0xFFFD, 1];
      }
    
      if (c0 < 0xE0) {
        var r = (c0 & 0x1F) << 6 | (c1 & 0x3F);
        if (r <= 0x7F) {
          return [0xFFFD, 1];
        }
        return [r, 2];
      }
    
      var c2 = str.charCodeAt(pos + 2);
      if (c2 !== c2 || c2 < 0x80 || 0xC0 <= c2) {
        return [0xFFFD, 1];
      }
    
      if (c0 < 0xF0) {
        var r = (c0 & 0x0F) << 12 | (c1 & 0x3F) << 6 | (c2 & 0x3F);
        if (r <= 0x7FF) {
          return [0xFFFD, 1];
        }
        if (0xD800 <= r && r <= 0xDFFF) {
          return [0xFFFD, 1];
        }
        return [r, 3];
      }
    
      var c3 = str.charCodeAt(pos + 3);
      if (c3 !== c3 || c3 < 0x80 || 0xC0 <= c3) {
        return [0xFFFD, 1];
      }
    
      if (c0 < 0xF8) {
        var r = (c0 & 0x07) << 18 | (c1 & 0x3F) << 12 | (c2 & 0x3F) << 6 | (c3 & 0x3F);
        if (r <= 0xFFFF || 0x10FFFF < r) {
          return [0xFFFD, 1];
        }
        return [r, 4];
      }
    
      return [0xFFFD, 1];
    };
    
    var $encodeRune = function(r) {
      if (r < 0 || r > 0x10FFFF || (0xD800 <= r && r <= 0xDFFF)) {
        r = 0xFFFD;
      }
      if (r <= 0x7F) {
        return String.fromCharCode(r);
      }
      if (r <= 0x7FF) {
        return String.fromCharCode(0xC0 | r >> 6, 0x80 | (r & 0x3F));
      }
      if (r <= 0xFFFF) {
        return String.fromCharCode(0xE0 | r >> 12, 0x80 | (r >> 6 & 0x3F), 0x80 | (r & 0x3F));
      }
      return String.fromCharCode(0xF0 | r >> 18, 0x80 | (r >> 12 & 0x3F), 0x80 | (r >> 6 & 0x3F), 0x80 | (r & 0x3F));
    };
    
    var $stringToBytes = function(str) {
      var array = new Uint8Array(str.length);
      for (var i = 0; i < str.length; i++) {
        array[i] = str.charCodeAt(i);
      }
      return array;
    };
    
    var $bytesToString = function(slice) {
      if (slice.$length === 0) {
        return "";
      }
      var str = "";
      for (var i = 0; i < slice.$length; i += 10000) {
        str += String.fromCharCode.apply(undefined, slice.$array.subarray(slice.$offset + i, slice.$offset + Math.min(slice.$length, i + 10000)));
      }
      return str;
    };
    
    var $stringToRunes = function(str) {
      var array = new Int32Array(str.length);
      var rune, j = 0;
      for (var i = 0; i < str.length; i += rune[1], j++) {
        rune = $decodeRune(str, i);
        array[j] = rune[0];
      }
      return array.subarray(0, j);
    };
    
    var $runesToString = function(slice) {
      if (slice.$length === 0) {
        return "";
      }
      var str = "";
      for (var i = 0; i < slice.$length; i++) {
        str += $encodeRune(slice.$array[slice.$offset + i]);
      }
      return str;
    };
    
    var $copyString = function(dst, src) {
      var n = Math.min(src.length, dst.$length);
      for (var i = 0; i < n; i++) {
        dst.$array[dst.$offset + i] = src.charCodeAt(i);
      }
      return n;
    };
    
    var $copySlice = function(dst, src) {
      var n = Math.min(src.$length, dst.$length);
      $copyArray(dst.$array, src.$array, dst.$offset, src.$offset, n, dst.constructor.elem);
      return n;
    };
    
    var $copyArray = function(dst, src, dstOffset, srcOffset, n, elem) {
      if (n === 0 || (dst === src && dstOffset === srcOffset)) {
        return;
      }
    
      if (src.subarray) {
        dst.set(src.subarray(srcOffset, srcOffset + n), dstOffset);
        return;
      }
    
      switch (elem.kind) {
      case $kindArray:
      case $kindStruct:
        if (dst === src && dstOffset > srcOffset) {
          for (var i = n - 1; i >= 0; i--) {
            elem.copy(dst[dstOffset + i], src[srcOffset + i]);
          }
          return;
        }
        for (var i = 0; i < n; i++) {
          elem.copy(dst[dstOffset + i], src[srcOffset + i]);
        }
        return;
      }
    
      if (dst === src && dstOffset > srcOffset) {
        for (var i = n - 1; i >= 0; i--) {
          dst[dstOffset + i] = src[srcOffset + i];
        }
        return;
      }
      for (var i = 0; i < n; i++) {
        dst[dstOffset + i] = src[srcOffset + i];
      }
    };
    
    var $clone = function(src, type) {
      var clone = type.zero();
      type.copy(clone, src);
      return clone;
    };
    
    var $pointerOfStructConversion = function(obj, type) {
      if(obj.$proxies === undefined) {
        obj.$proxies = {};
        obj.$proxies[obj.constructor.string] = obj;
      }
      var proxy = obj.$proxies[type.string];
      if (proxy === undefined) {
        var properties = {};
        for (var i = 0; i < type.elem.fields.length; i++) {
          (function(fieldProp) {
            properties[fieldProp] = {
              get: function() { return obj[fieldProp]; },
              set: function(value) { obj[fieldProp] = value; }
            };
          })(type.elem.fields[i].prop);
        }
        proxy = Object.create(type.prototype, properties);
        proxy.$val = proxy;
        obj.$proxies[type.string] = proxy;
        proxy.$proxies = obj.$proxies;
      }
      return proxy;
    };
    
    var $append = function(slice) {
      return $internalAppend(slice, arguments, 1, arguments.length - 1);
    };
    
    var $appendSlice = function(slice, toAppend) {
      if (toAppend.constructor === String) {
        var bytes = $stringToBytes(toAppend);
        return $internalAppend(slice, bytes, 0, bytes.length);
      }
      return $internalAppend(slice, toAppend.$array, toAppend.$offset, toAppend.$length);
    };
    
    var $internalAppend = function(slice, array, offset, length) {
      if (length === 0) {
        return slice;
      }
    
      var newArray = slice.$array;
      var newOffset = slice.$offset;
      var newLength = slice.$length + length;
      var newCapacity = slice.$capacity;
    
      if (newLength > newCapacity) {
        newOffset = 0;
        newCapacity = Math.max(newLength, slice.$capacity < 1024 ? slice.$capacity * 2 : Math.floor(slice.$capacity * 5 / 4));
    
        if (slice.$array.constructor === Array) {
          newArray = slice.$array.slice(slice.$offset, slice.$offset + slice.$length);
          newArray.length = newCapacity;
          var zero = slice.constructor.elem.zero;
          for (var i = slice.$length; i < newCapacity; i++) {
            newArray[i] = zero();
          }
        } else {
          newArray = new slice.$array.constructor(newCapacity);
          newArray.set(slice.$array.subarray(slice.$offset, slice.$offset + slice.$length));
        }
      }
    
      $copyArray(newArray, array, newOffset + slice.$length, offset, length, slice.constructor.elem.........完整代码请登录后点击上方下载按钮下载查看

网友评论0