JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

const TWO_PI = Math.PI * 2;

// canvas settings

var viewWidth = 512,

viewHeight = 512,

glitchCanvas = document.getElementById("glitch_canvas"),

ctx;

var image,

glitchImageData,

originalImageData,

pixels;

// these control glitching, and are in turn controlled by TweenMax

var gvars = {

waveAmp0:0,

waveFrq0:1,

waveOfs0:0,

waveAmp1:0,

waveFrq1:1,

waveOfs1:0,

pos0:0,

pos1:0,

pos2:0

};

var cosCache0 = [];

var cosCache1 = [];

window.onload = function() {

image = new Image();

image.crossOrigin = 'Anonymous';

image.onload = imageLoaded;

image.src = '/assets/panda.jpg';

function imageLoaded() {

initCanvas();

createImageData();

processImageData();

setupTweens();

requestAnimationFrame(loop);

}

};

function initCanvas() {

glitchCanvas.width = viewWidth;

glitchCanvas.height = viewHeight;

ctx = glitchCanvas.getContext('2d');

}

// draw the image into the canvas and grab the pixel data

// the image is drawn with an offset, because the white border looks kinda nice

function createImageData() {

ctx.fillStyle = '#fff';

ctx.fillRect(0, 0, viewWidth, viewHeight);

ctx.drawImage(image, 32, 32, 448, 448);

originalImageData = ctx.getImageData(0, 0, viewWidth, viewHeight);

glitchImageData = ctx.getImageData(0, 0, viewWidth, viewHeight);

ctx.clearRect(0, 0, viewWidth, viewHeight);

}

// split pixel data (red, green, blue, alpha) into pixels and make a grid

// alpha is ignored because it is always 255

function processImageData() {

var data = originalImageData.data,

pixelCount = data.length / 4,

pixelIndex = 0,

x, y;

pixels = [];

for (var i = 0; i < pixelCount; i++) {

pixelIndex = i * 4;

x = i % viewWidth;

y = Math.floor(i / viewHeight);

if (!pixels[y]) pixels[y] = [];

pixels[y][x] = [

data[pixelIndex + 0], // red

data[pixelIndex + 1], // green

data[pixelIndex + 2] // blue

];

}

}

function setupTweens() {

var tl0 = new TimelineMax({repeat:-1, yoyo:true});

tl0.to(gvars, 0.8, {waveAmp0:64, waveFrq0:16, waveOfs0:16, ease:Back.easeOut, delay:0.5});

var tl1 = new TimelineMax({repeat:-1, yoyo:true});

tl1.to(gvars, 2, {waveAmp1:128, waveFrq1:8, waveOfs1:64, ease:Elastic.easeIn, delay:0.25});

var tl2 = new TimelineMax({repeat:-1, yoyo:true});

tl2.to(gvars, 1, {pos0:256, ease:Bounce.easeInOut, delay:4});

var tl3 = new TimelineMax({repeat:-1, yoyo:true});

tl3.to(gvars, 5, {pos1:128, pos2:512, ease:Cubic.easeInOut, delay:2});

}

function update() {

var data = glitchImageData.data,

row,

pixelIndex = 0;

// fraction of x and y of width and height

var fx, fy;

// red, green and blue channel pixel coordinates

var rx, ry,

gx, gy,

bx, by;

var wave0Sin,

wave1Sin,

wave0Cos,

wave1Cos,

pos0,

pos1,

pos2;

cosCache0.length = 0;

cosCache1.length = 0;

for (var y = 0; y < viewHeight; y++) {

row = pixels[y];

fy = y / viewHeight;

wave0Sin = Math.sin(gvars.waveOfs0 + gvars.waveFrq0 * fy) * gvars.waveAmp0;

wave1Sin = Math.sin(gvars.waveOfs1 + gvars.waveFrq1 * fy) * gvars.waveAmp1;

pos1 = gvars.pos1 * fy;

for (var x = 0; x < viewWidth; x++) {

pixelIndex = (y * viewWidth + x) * 4;

fx = x / viewWidth;

if (cosCache0[x] !== undefined) {

wave0Cos = cosCache0[x];

}

else {

wave0Cos = Math.cos(gvars.waveOfs0 + gvars.waveFrq0 * fx) * gvars.waveAmp0;

cosCache0[x] = wave0Cos;

}

if (cosCache1[x] !== undefined) {

wave1Cos = cosCache1[x];

}

else {

wave1Cos = Math.cos(gvars.waveOfs1 + gvars.waveFrq1 * fx) * gvars.waveAmp1;

cosCache1[x] = wave1Cos;

}

pos0 = gvars.pos0 * fx;

pos2 = gvars.pos2 * fx;

// it really does not matter what you do here, it all looks glitchy :)

// really, just put the operators and vars in any random combination (but be careful you don't divide by 0)

// AND A WHOLE NEW GLITCHY MESS WILL EMERGE!

rx = x + wave1Sin + pos0;

ry = y + wave1Cos - pos2;

gx = x - wave1Cos * pos1;

gy = y - wave0Sin + pos1;

bx = x + wave0Sin + pos0;

by = y - wave0Sin * pos2;

data[pixelIndex + 0] = getChannel(rx, ry, 0);

data[pixelIndex + 1] = getChannel(gx, gy, 1);

data[pixelIndex + 2] = getChannel(bx, by, 2);

}

}

}

function draw() {

ctx.putImageData(glitchImageData, 0, 0);

}

function loop() {

update();

draw();

requestAnimationFrame(loop);

}

function getChannel(x, y, c) {

x = x | 0;

y = y | 0;

x = wrap(x, 0, viewWidth - 1);

y = wrap(y, 0, viewHeight - 1);

return pixels[y][x][c];

}

function wrap(v, min, max) {

return (((v - min) % (max - min)) + (max - min)) % (max - min) + min;

}

html5游戏闪屏卡顿,HTML5 闪屏的熊猫相关推荐

  1. android 横屏切换竖屏 卡顿,Android横竖屏切换卡顿问题

    今天遇到一个android系统在切换横竖屏时一直卡着不动,大概3秒以后才能转过来的问题.最后定位到是由于ScreenRotationAnimation类的构造函数调用了 SurfaceControl. ...

  2. 苹果手机白屏_安卓卡顿苹果闪退,手机换代的动力原来是这些

    一般手机使用大约两年之后,就会明显感觉流畅度大不如从前.这种现象以前在安卓手机上比较常见,但其实是以流畅著称的苹果iPhone用久了也会体验变差,甚至出现了闪退.白屏等现象.想要搞懂其中的原因,我们不 ...

  3. android 呼入电话游戏闪退,安卓手机游戏卡顿、闪退问题解决方案

    安卓手机游戏卡顿.闪退问题解决方案,下面就由去游戏pro小编忆成殇为大家带来安卓手机游戏卡顿.闪退问题解决方案,剑魂之刃闪退.卡顿一直困扰着玩家,那么究竟怎样更好的玩好我们的卡顿及闪退问题呢,下面就随 ...

  4. cad2014卡顿的解决方法_升级iOS14.1后出现卡顿、闪退?这3种方法可以解决

    随着iOS14.1正式版的推出,大家对于该版本有着很高的关注度,毕竟这是iOS14版本第一次正式的小版本更新,同时也将是新机iPhone12系列的预搭载版本. 但是,随着体验了几天的iOS14.1之后 ...

  5. 游戏更新一直卡在计算机,win10电脑玩战地5游戏一直卡屏卡顿如何解决

    许多用户在安装完win10系统之后,想要在电脑中玩战地5游戏,可是却发现一直出现卡屏卡顿的情况,影响了正常游戏,该怎么解决呢,下面为大家分享一下win10电脑玩战地5游戏一直卡屏卡顿的具体解决方法吧. ...

  6. Office2021与mathtype7.4兼容问题_1_Office2021(尤其是word2021)与mathtype7组合出现点击mathtype选项后word卡顿并闪退解决方法

    一.安装原理 由笔者自己遇见如题目所说问题的实践中,总结了Office2021(尤其是word2021)与mathtype7组合原理,或者说word2021选项卡出现mathtype并且可以使用的原理 ...

  7. 苹果闪退解决方法_升级iOS14.1后出现卡顿、闪退?这3种方法可以解决

    随着iOS14.1正式版的推出,大家对于该版本有着很高的关注度,毕竟这是iOS14版本第一次正式的小版本更新,同时也将是新机iPhone12系列的预搭载版本. 但是,随着体验了几天的iOS14.1之后 ...

  8. 电脑卡顿不流畅是什么原因_什么造成游戏直播画画卡顿、延迟?这三个原因了解一下...

    原标题:什么造成游戏直播画画卡顿.延迟?这三个原因了解一下 从事直播的朋友们相信都有所体会,直播时很容易出现画面卡顿.延迟的现象,这究竟是什么原因造成的呢?最可能是这几点! 1.服务器过载崩溃 说起服 ...

  9. win10蓝屏无法进入系统_Win10 补丁又翻车!蓝屏卡顿崩溃,系统性能“负优化”...

    8月23日消息,据外媒体报道,微软日前发布的一批新 Windows 10 补丁出现严重错误,有部分用户在升级后出现了蓝屏 (BlueScreen of Death,BSOD) 错误,电脑运行性能也出现 ...

最新文章

  1. python: 关于解决‘\u‘开头的字符串转中文的方法
  2. 【RecyclerView】 一、RecyclerView 最基本用法 ( 添加支持库 | 设置布局文件 | 自定义适配器 )
  3. 【年终总结】2019年有三AI知识星球做了什么,明年又会做什么
  4. 2018年第九届蓝桥杯C/C++ C组国赛 —— 第二题:最大乘积
  5. CF1245F Daniel and Spring Cleaning(等会了更新)
  6. python读取配置文件使用_python 使用 ConfigParser 读取和修改INI配置文件
  7. 网站二次开发如何防止别人打包源码_企业网站制作前需注意的几个事项
  8. 读后有感 - UI设计师必知:线框图、原型和视觉稿
  9. mysql的底层运行原理,【数据库】震惊!!MySQL的底层原理竟然是这样
  10. 平面设计计算机基本配置,平面设计电脑配置要求
  11. 将经纬度坐标用线段形式在地图上链接起来
  12. [日更-2019.5.21] Android 系统的分区和文件系统(一)--Android分区的大概框架
  13. 等待任务执行完成时,界面上转圈圈,不让用户操作软件
  14. 解决tar 时间戳XXX是未来的XXX秒之后问题
  15. append和extend的区别
  16. 计算机教学训练的有效性,提高对口单招计算机专业技能训练的有效性.doc
  17. #VCS# 关于Verdi KDB 数据库
  18. CCF BDCI 剧本角色情感识别:多目标学习开源方案
  19. 如何正视ISO9001/2000质量管理体系认证?(转载)
  20. 云计算不需要服务器吗,云计算需要服务器吗

热门文章

  1. golang web 框架 gin beego iris 对比
  2. linux 内核 虚拟文件系统VFS 路径查找 path_lookup
  3. VS编译时output/Error list窗口自动弹出设置
  4. 关于VS中区分debug与release,32位与64位编译的宏定义
  5. Linux 用户进程内存空间详解
  6. linux 64位 shellcode,Linux Shellcode“你好,世界!”
  7. oracle case grouping,ORACLE GROUPING函數的使用
  8. kprobes/kretprobes 在 bcc 程序中的使用
  9. linux发布java网站_Linux下部署java web项目
  10. excel行转列_excel统计函数:应用广泛的动态统计之王OFFSET(上)