Last active
November 1, 2019 12:05
-
-
Save ericoporto/927977338fd3ec184dd8 to your computer and use it in GitHub Desktop.
This is a rain example to be used in games using canvas. https://gistcdn.githack.com/ericoporto/927977338fd3ec184dd8/raw/4fb3233e1a86e7736721ec328513c99001b46b7a/rain.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset=utf-8 /> | |
<title>HTML5 Rain</title> | |
<script type="text/javascript"> | |
// this is an example for a rain function, to draw rain | |
// in a jRPG Top-Down type of game. | |
var canvas = null; | |
var context = null; | |
function init() { | |
canvas = document.getElementById('canvasRain'); | |
context = canvas.getContext("2d"); | |
context.mozImageSmoothingEnabled = false; | |
context.webkitImageSmoothingEnabled = false; | |
rains=new rain() //this is the rain object | |
// use ctrl+f12 to enable the developer console | |
// than the function rains.startRain() to make it rain | |
// and rains.stopRain() to stop raining. | |
Draw(); | |
setInterval(animate, 30); | |
// comment line below in the actual game, this is here for demo | |
rains.startRain(); | |
} | |
function animate() { | |
Draw(); | |
} | |
function Draw() { | |
context.clearRect(0, 0, context.canvas.width, context.canvas.height); | |
rains.DrawRain() //if you are using the rain object, call the instance that draws it! | |
} | |
function rain(){ | |
var that = this; | |
var rainBufferCanvas = null; | |
var rainBufferCanvasCtx = null; | |
var particles = []; | |
var removeparticles = []; | |
var RainDropTimer = null; | |
var stop = false; | |
var colors = []; | |
this.raining = false; | |
function toColor(num) { | |
num = Math.round(num) | |
var g = Math.min(num, 0xFF), | |
a = 1 ; | |
return "rgba(" + [g, g, g, a].join(",") + ")"; | |
}; | |
function addRainDrop() { | |
particles[particles.length] = new RainDrop(); | |
if (particles.length == that.maxRainDrops) | |
clearInterval(RainDropTimer); | |
}; | |
this.startRain = function() { | |
for(var i=0; i<7; i++) { | |
colors[i]=toColor((i)*128/6+128); | |
} | |
that.raining = true | |
stop = false | |
that.maxRainDrops = 200; | |
rainBufferCanvas = document.createElement("canvas"); | |
rainBufferCanvasCtx = rainBufferCanvas.getContext("2d"); | |
rainBufferCanvasCtx.mozImageSmoothingEnabled = false; | |
rainBufferCanvasCtx.canvas.width = 416; | |
rainBufferCanvasCtx.canvas.height = 416; | |
RainDropTimer = setInterval(addRainDrop, 200); | |
}; | |
this.stopRain = function() { | |
stop = true | |
clearInterval(RainDropTimer); | |
}; | |
function blankRainBC() { | |
var npart = particles.length | |
rainBufferCanvasCtx.clearRect(0, 0, rainBufferCanvasCtx.canvas.width, rainBufferCanvasCtx.canvas.height); | |
if(npart > 50) { | |
rainBufferCanvasCtx.fillStyle = "rgba(0,0,25,0.2)"; | |
rainBufferCanvasCtx.fillRect(0, 0, rainBufferCanvasCtx.canvas.width, rainBufferCanvasCtx.canvas.height); | |
} else if(npart > 35) { | |
rainBufferCanvasCtx.fillStyle = "rgba(0,0,25,0.15)"; | |
rainBufferCanvasCtx.fillRect(0, 0, rainBufferCanvasCtx.canvas.width, rainBufferCanvasCtx.canvas.height); | |
} else if(npart > 25) { | |
rainBufferCanvasCtx.fillStyle = "rgba(0,0,25,0.1)"; | |
rainBufferCanvasCtx.fillRect(0, 0, rainBufferCanvasCtx.canvas.width, rainBufferCanvasCtx.canvas.height); | |
} else if(npart > 20) { | |
rainBufferCanvasCtx.fillStyle = "rgba(0,0,25,0.075)"; | |
rainBufferCanvasCtx.fillRect(0, 0, rainBufferCanvasCtx.canvas.width, rainBufferCanvasCtx.canvas.height); | |
} else if(npart > 15) { | |
rainBufferCanvasCtx.fillStyle = "rgba(0,0,25,0.05)"; | |
rainBufferCanvasCtx.fillRect(0, 0, rainBufferCanvasCtx.canvas.width, rainBufferCanvasCtx.canvas.height); | |
} else if(npart > 10) { | |
rainBufferCanvasCtx.fillStyle = "rgba(0,0,25,0.025)"; | |
rainBufferCanvasCtx.fillRect(0, 0, rainBufferCanvasCtx.canvas.width, rainBufferCanvasCtx.canvas.height); | |
} | |
}; | |
function DrawRainColor(colori){ | |
rainBufferCanvasCtx.beginPath(); | |
for (var i = 0; i < particles.length; i++) { | |
if(colori==particles[i].color){ | |
rainBufferCanvasCtx.moveTo(particles[i].x, particles[i].y); | |
rainBufferCanvasCtx.lineTo(particles[i].x+particles[i].width, particles[i].y+particles[i].height); | |
} | |
} | |
rainBufferCanvasCtx.strokeStyle = colors[colori]; | |
rainBufferCanvasCtx.stroke(); | |
}; | |
this.DrawRain = function() { | |
if(that.raining){ | |
for (var i = 0; i < particles.length; i++) { | |
if (particles[i].y < context.canvas.height) { | |
particles[i].y += particles[i].speed; | |
if (particles[i].y >= context.canvas.height) { | |
particles[i].y = -5; | |
if(stop) { | |
removeparticles.push(i) | |
} | |
} | |
particles[i].x += particles[i].drift; | |
if (particles[i].x > context.canvas.width) { | |
particles[i].x = 0; | |
if(stop) { | |
removeparticles.push(i) | |
} | |
} | |
} | |
} | |
if(particles.length>0){ | |
blankRainBC(); | |
for (var k = 2; k< 6; k++){ | |
DrawRainColor(k) | |
} | |
context.drawImage(rainBufferCanvas, 0, 0, rainBufferCanvas.width, rainBufferCanvas.height); | |
} | |
if(removeparticles.length > 0 ){ | |
removeparticles.sort(function(a,b){ return b - a; }); | |
while (removeparticles.length > 0){ | |
particles.splice(removeparticles.pop(),1); | |
} | |
if(particles.length == 0){ | |
that.raining = false | |
} | |
} | |
} | |
}; | |
function RainDrop() { | |
var angle = 2 | |
this.x = Math.round(Math.random() * context.canvas.width); | |
this.y = -10; | |
this.drift = Math.round(Math.random() * 4) + 2; | |
this.speed = this.drift*angle | |
this.width = 8; | |
this.height = 8*angle; | |
this.color = this.drift | |
} | |
} | |
</script> | |
</head> | |
<body onload="init()"> | |
<canvas id="canvasRain" width="416px" height="416px">Canvas Not Supported</canvas> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment