A short little pen in honor of the 4th of July. I wanted to do something a little bit different,
A Pen by Ben Matthews on CodePen.
A short little pen in honor of the 4th of July. I wanted to do something a little bit different,
A Pen by Ben Matthews on CodePen.
window.addEventListener('resize', resize, false); | |
var fireworks; | |
var hills; | |
var stars; | |
var dirs = [ | |
[-1, -1],[0, -1],[1, -1], | |
[-1, 0], [1, 0], | |
[-1, 1], [0, 1], [1, 1] | |
]; | |
function Conway(){ | |
this.x = floor(random()*width); | |
this.y = floor(random()*height*.7); | |
this.type = floor(random()*3); | |
this.size = random()*2; | |
this.angle = random()*PI; | |
this.baseHue = random()*360; | |
this.hueSwap = random()*30 + 60; | |
this.gridSize = 61; | |
if (this.gridSize%2 == 0) this.gridSize; | |
this.center = floor(this.gridSize/2); | |
this.cyclesPerTick = 5; | |
this.numTicks = 0; | |
this.finished = false; | |
this.grid = []; | |
for (var i = 0; i < 2; i++){ | |
this.grid.push([]); | |
} | |
for (var i = 0; i < this.gridSize; i++){ | |
this.grid[0].push([]); | |
this.grid[1].push([]); | |
for (var j = 0; j < this.gridSize; j++){ | |
this.grid[0][i].push(false); | |
this.grid[1][i].push(false); | |
} | |
} | |
for (var i = 0; i < 10; i++){ | |
for (var j = 0; j < 10; j++){ | |
if (random() > .5){ | |
this.grid[0][this.center-i][this.center-j] = true; | |
this.grid[0][this.center+i][this.center+j] = true; | |
if (this.type == 0){ | |
this.grid[0][this.center+i][this.center-j] = true; | |
this.grid[0][this.center-i][this.center+j] = true; | |
} | |
else if (this.type == 1){ | |
this.grid[0][this.center-j][this.center+i] = true; | |
this.grid[0][this.center+j][this.center-i] = true; | |
} else if (this.type == 2){ | |
this.grid[0][this.center+i][this.center-j] = true; | |
this.grid[0][this.center-i][this.center+j] = true; | |
this.grid[0][this.center-j][this.center+i] = true; | |
this.grid[0][this.center+j][this.center-i] = true; | |
this.grid[0][this.center-j][this.center-i] = true; | |
this.grid[0][this.center+j][this.center+i] = true; | |
} | |
} | |
} | |
} | |
this.tick = function(){ | |
var ind = (this.numTicks%2); | |
for (var i = 0; i < this.gridSize; i++){ | |
for (var j = 0; j < this.gridSize; j++){ | |
var neighbors = 0; | |
for (var k = 0; k < dirs.length; k++){ | |
var dx = i+dirs[k][0]; | |
var dy = j+dirs[k][1]; | |
if (dx >= 0 && dy >= 0 && | |
dx < this.gridSize-1 && dy < this.gridSize-1){ | |
if (this.grid[ind][dx][dy]) neighbors++; | |
} | |
} | |
if ((this.grid[ind][i][j] && | |
(neighbors == 2 || neighbors == 3)) || | |
(!this.grid[ind][i][j] && neighbors == 3)){ | |
this.grid[(ind+1)%2][i][j] = true; | |
} else { | |
this.grid[(ind+1)%2][i][j] = false; | |
} | |
} | |
} | |
} | |
this.render = function(){ | |
this.numTicks++; | |
var mod = pow(((48-this.numTicks)/40),2); | |
this.size += mod*.5; | |
var ind = this.numTicks%2; | |
translate(this.x, this.y); | |
scale(this.size); | |
for (var i = 0; i < this.gridSize; i++){ | |
for (var j = 0; j < this.gridSize; j++){ | |
if (this.grid[ind][i][j]){ | |
fill(this.baseHue + random()*this.hueSwap, | |
100, 100, mod*100); | |
// fill(0, 100, 100); | |
rect(i-this.center, j-this.center, 1, 1); | |
} | |
} | |
} | |
if (this.numTicks > 40) this.finished = true; | |
resetMatrix(); | |
} | |
} | |
function Hill(distance){ | |
this.scale = distance*20; | |
this.bal = distance*50; | |
this.hue = 180 - distance*60; | |
this.pos = random()*2 - .5; | |
this.heights = []; | |
for (var i = 0; i < 40; i++){ | |
var y = 200*sin((i/40)*PI); | |
this.heights.push(y); | |
} | |
this.render = function(){ | |
fill(this.hue, this.bal, this.bal); | |
for (var i = 0; i < 40; i++){ | |
var x = width*this.pos - 10*this.scale; | |
var y = this.heights[i]; | |
rect(x + i*this.scale, height-y +this.scale*4, this.scale+1, y); | |
} | |
} | |
} | |
function Star(){ | |
this.x = random(); | |
this.y = random(); | |
this.size = random()*2 + 1; | |
this.render = function(){ | |
fill(160 + random()*40, 40, 60 + random()*20); | |
rect(this.x*width, this.y*height, this.size, this.size); | |
} | |
} | |
function setup(){ | |
createCanvas(); | |
colorMode(HSB, 360, 100, 100, 100); | |
ellipseMode(CENTER); | |
frameRate(10); | |
fireworks = []; | |
hills = []; | |
for (var i = 0; i < 80; i++){ | |
hills.push(new Hill(i/80)); | |
} | |
stars = []; | |
for (var i = 0; i < 1000; i++){ | |
stars.push(new Star()); | |
} | |
resize(); | |
fireworks.push(new Conway()) | |
} | |
function draw(){ | |
background(0); | |
noStroke(); | |
if (!stars) return; | |
for (var i = 0; i < stars.length; i++){ | |
stars[i].render(); | |
} | |
if (!fireworks) return; | |
for (var i = fireworks.length-1; i >= 0; i--){ | |
if (fireworks[i].finished){ | |
fireworks.splice(i, 1); | |
} else { | |
fireworks[i].tick(); | |
fireworks[i].render(); | |
} | |
} | |
for (var i = 0; i < hills.length; i++){ | |
hills[i].render(); | |
} | |
if (random() < .08){ | |
fireworks.push(new Conway()); | |
} | |
} | |
function resize(){ | |
resizeCanvas(window.innerWidth, window.innerHeight); | |
} |
<script src="https://github.com/processing/p5.js/releases/download/0.5.6/p5.min.js"></script> |
* { margin:0; padding:0; } | |
html, body { width:100%; height:100%; } | |
canvas { display:block; } |