Toggle navigation
Sign Up
Log In
Explore
Works
Folders
Tools
Collections
Artists
Groups
Groups
Topics
Tasks
Tasks
Jobs
Teams
Jobs
Recommendation
More Effects...
JS
/* simple 2D Water Simulation idea and python code from:https://www.reddit.com/r/cellular_automata/comments/6jhdfw/i_used_1dimensional_cellular_automata_to_make_a/ C L I C K / H O L D / R E L E A S E I N S I D E T H E P O O L T O A D D W A T E R */ var width = 300; var ground = new Array(width).fill(1); ground[0] = ground[width-1] = 100; // Predictable randomize multi-sine for generating the ground // from @shshaw, thx! var twoPI = Math.PI * 4; var placement; var offset = Math.random() + 1.1; for (x = 1; x < width/2; x++){ placement = (x / (width/2)) * twoPI; ground[x] = tmp = 30 + 10 * ( ( Math.sin( placement ) + Math.sin( offset * placement ) ) / 2 ); } /* my lame kinda random spiky ground...doh! */ var level = tmp; // Math.random()*50; for (x = width/2; x < width-1; x++) { ground[x] = level; level = Math.min(100, Math.max(0, level+Math.random()*8-4) ); } // empty pool with a drip of water in the middle var water = new Array(width).fill(0); water[0] = water[width-1] = 0; water[parseInt(width/2)] = 250; var energy = new Array(width).fill(0); // put that thing into the DOM var wrap = document.getElementById("wrap"); var html = "
"; for (x = 0; x < width; x++) { var col = document.createElement("div"); col.classList.add('col'); col.innerHTML = html; wrap.appendChild(col); } var cols = document.getElementById("wrap").children; // ...for the renderer // add the mouse actions for (var i=0; i
ground[x-1] + water[x-1] + energy[x-1] ) { var flow = Math.min(water[x], ground[x] + water[x] - energy[x] - ground[x-1] - water[x-1] - energy[x-1]) / 4; dwater[x-1] += flow; dwater[x] += -flow; denergy[x-1] += -energy[x-1] / 2 - flow; } if ( ground[x] + water[x] + energy[x] > ground[x+1] + water[x+1] - energy[x+1] ) { var flow = Math.min(water[x], ground[x] + water[x] + energy[x] - ground[x+1] - water[x+1] + energy[x+1]) / 4; dwater[x+1] += flow; dwater[x] += -flow; denergy[x+1] += -energy[x+1] / 2 + flow; } } for (x = 1; x < width-1; x++) { water[x] = water[x] + dwater[x]; energy[x] = energy[x] + denergy[x]; } } // draw the next frame function draw(terrain, water) { for (var i = 0; i < terrain.length; i++) { var col = cols[i].children; col[0].style.height = Math.min(100-terrain[i], water[i])+"%"; col[1].style.height = terrain[i]+"%"; } } // RUN it! /* "use reqAnimFr instead of timeout, noob!" hint from @shshaw, thx! */ function render(){ requestAnimationFrame(render); calc(); draw(ground, water); } requestAnimationFrame(render);
CSS
body { padding: 0; margin: 0; height: 100%; overflow: hidden; background-color: #d2eff4; } #wrap { display: flex; position: absolute; width: 100%; height: 100%; align-content: center; align-items: stretch; justify-content: space-between; overflow: hidden; } #wrap .col { display: flex; flex: 1 100%; flex-direction: column; justify-content: flex-end; height: 100%; } #wrap .col .ww { background: linear-gradient(to bottom, #7db9e8 0%, #207cca 95%, #1e5799 100%); width: 100%; height: 0%; } #wrap .col .gw { background: linear-gradient(to bottom, #a81c00 0%, #ad5b47 52%, #ad5b47 100%); width: 100%; height: 0%; }
HTML
Join Effecthub.com
Working with Global Gaming Artists and Developers!
Login
Sign Up
Or Login with Your Email Address:
Email
Password
Remember
Or Sign Up with Your Email Address:
Your Email
This field must contain a valid email
Set Password
Password should be at least 1 character
Stay informed via email