|
|
| (4 intermediate revisions by the same user not shown) |
| Line 125: |
Line 125: |
| | | '''Tower''' || '''TBA''' || '''TBA''' | | | '''Tower''' || '''TBA''' || '''TBA''' |
| | |} | | |} |
| − |
| |
| − |
| |
| − |
| |
| − | -- And ==
| |
| − |
| |
| − |
| |
| − |
| |
| − |
| |
| − | /**
| |
| − | * Water ripple effect.
| |
| − | * Original code (Java) by Neil Wallis
| |
| − | * @link http://www.neilwallis.com/java/water.html
| |
| − | *
| |
| − | | |
| − | * @link http://chikuyonok.ru
| |
| − | */
| |
| − | (function(){
| |
| − | var canvas = document.getElementById('c'),
| |
| − | /** @type {CanvasRenderingContext2D} */
| |
| − | ctx = canvas.getContext('2d'),
| |
| − | width = 400,
| |
| − | height = 400,
| |
| − | half_width = width >> 1,
| |
| − | half_height = height >> 1,
| |
| − | size = width * (height + 2) * 2,
| |
| − | delay = 30,
| |
| − | oldind = width,
| |
| − | newind = width * (height + 3),
| |
| − | riprad = 3,
| |
| − | ripplemap = [],
| |
| − | last_map = [],
| |
| − | ripple,
| |
| − | texture,
| |
| − | line_width = 20,
| |
| − | step = line_width * 2,
| |
| − | count = height / line_width;
| |
| − |
| |
| − | canvas.width = width;
| |
| − | canvas.height = height;
| |
| − |
| |
| − | /*
| |
| − | * Water ripple demo can work with any bitmap image
| |
| − | * (see example here: http://media.chikuyonok.ru/ripple/)
| |
| − | * But I need to draw simple artwork to bypass 1k limitation
| |
| − | */
| |
| − | with (ctx) {
| |
| − | fillStyle = '#a2ddf8';
| |
| − | fillRect(0, 0, width, height);
| |
| − |
| |
| − | fillStyle = '#07b';
| |
| − | save();
| |
| − | rotate(-0.785);
| |
| − | for (var i = 0; i < count; i++) {
| |
| − | fillRect(-width, i * step, width * 3, line_width);
| |
| − | }
| |
| − |
| |
| − | restore();
| |
| − | }
| |
| − |
| |
| − | texture = ctx.getImageData(0, 0, width, height);
| |
| − | ripple = ctx.getImageData(0, 0, width, height);
| |
| − |
| |
| − | for (var i = 0; i < size; i++) {
| |
| − | last_map[i] = ripplemap[i] = 0;
| |
| − | }
| |
| − |
| |
| − | /**
| |
| − | * Main loop
| |
| − | */
| |
| − | function run() {
| |
| − | newframe();
| |
| − | ctx.putImageData(ripple, 0, 0);
| |
| − | }
| |
| − |
| |
| − | /**
| |
| − | * Disturb water at specified point
| |
| − | */
| |
| − | function disturb(dx, dy) {
| |
| − | dx <<= 0;
| |
| − | dy <<= 0;
| |
| − |
| |
| − | for (var j = dy - riprad; j < dy + riprad; j++) {
| |
| − | for (var k = dx - riprad; k < dx + riprad; k++) {
| |
| − | ripplemap[oldind + (j * width) + k] += 128;
| |
| − | }
| |
| − | }
| |
| − | }
| |
| − |
| |
| − | /**
| |
| − | * Generates new ripples
| |
| − | */
| |
| − | function newframe() {
| |
| − | var a, b, data, cur_pixel, new_pixel, old_data;
| |
| − |
| |
| − | var t = oldind; oldind = newind; newind = t;
| |
| − | var i = 0;
| |
| − |
| |
| − | // create local copies of variables to decrease
| |
| − | // scope lookup time in Firefox
| |
| − | var _width = width,
| |
| − | _height = height,
| |
| − | _ripplemap = ripplemap,
| |
| − | _last_map = last_map,
| |
| − | _rd = ripple.data,
| |
| − | _td = texture.data,
| |
| − | _half_width = half_width,
| |
| − | _half_height = half_height;
| |
| − |
| |
| − | for (var y = 0; y < _height; y++) {
| |
| − | for (var x = 0; x < _width; x++) {
| |
| − | var _newind = newind + i, _mapind = oldind + i;
| |
| − | data = (
| |
| − | _ripplemap[_mapind - _width] +
| |
| − | _ripplemap[_mapind + _width] +
| |
| − | _ripplemap[_mapind - 1] +
| |
| − | _ripplemap[_mapind + 1]) >> 1;
| |
| − |
| |
| − | data -= _ripplemap[_newind];
| |
| − | data -= data >> 5;
| |
| − |
| |
| − | _ripplemap[_newind] = data;
| |
| − |
| |
| − | //where data=0 then still, where data>0 then wave
| |
| − | data = 1024 - data;
| |
| − |
| |
| − | old_data = _last_map[i];
| |
| − | _last_map[i] = data;
| |
| − |
| |
| − | if (old_data != data) {
| |
| − | //offsets
| |
| − | a = (((x - _half_width) * data / 1024) << 0) + _half_width;
| |
| − | b = (((y - _half_height) * data / 1024) << 0) + _half_height;
| |
| − |
| |
| − | //bounds check
| |
| − | if (a >= _width) a = _width - 1;
| |
| − | if (a < 0) a = 0;
| |
| − | if (b >= _height) b = _height - 1;
| |
| − | if (b < 0) b = 0;
| |
| − |
| |
| − | new_pixel = (a + (b * _width)) * 4;
| |
| − | cur_pixel = i * 4;
| |
| − |
| |
| − | _rd[cur_pixel] = _td[new_pixel];
| |
| − | _rd[cur_pixel + 1] = _td[new_pixel + 1];
| |
| − | _rd[cur_pixel + 2] = _td[new_pixel + 2];
| |
| − | }
| |
| − |
| |
| − | ++i;
| |
| − | }
| |
| − | }
| |
| − | }
| |
| − |
| |
| − | canvas.onmousemove = function(/* Event */ evt) {
| |
| − | disturb(evt.offsetX || evt.layerX, evt.offsetY || evt.layerY);
| |
| − | };
| |
| − |
| |
| − | setInterval(run, delay);
| |
| − |
| |
| − | // generate random ripples
| |
| − | var rnd = Math.random;
| |
| − | setInterval(function() {
| |
| − | disturb(rnd() * width, rnd() * height);
| |
| − | }, 700);
| |
| − |
| |
| − | })();
| |