HTML5에서 그림자(Shadow) 효과 예
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>HTML5 원 그리기</title>
<style type="text/css">
canvas { border:5px solid black;}
</style>
<script type="text/javascript">
var x = 30;
var y = 30;
var r = 20;
var xspeed = 3.0;
var yspeed = 3.0;
//var prevTime = 0;
var redX = 0;
var redY = 0;
function drawArc() {
var c = document.getElementById("canvas1");
if(!c.getContext) {
alert('Canvas그리기를 지원하는 웹브라우저가 아닙니다');
return;
}
var ctx = c.getContext("2d");
ctx.clearRect(0,0,c.width,c.height);
x += xspeed;
y += yspeed;
//적색공의 테두리 그리기
ctx.beginPath();
ctx.strokeStyle = 'rgb(255,0,0)';
ctx.lineWidth = 2;
ctx.arc(redX,redY,r, 0, (Math.PI/180)*360);
ctx.stroke();
//적색공 그리기
ctx.beginPath();
redX = c.width/2;
redY = c.height/2-10;
grd = ctx.createRadialGradient(redX-10, redY-10, 0, redX, redY, 20);
grd.addColorStop(0, 'rgb(255, 255, 255)');
grd.addColorStop(1, 'rgb(250, 0, 0)');
ctx.fillStyle = grd;
ctx.shadowOffsetX = 7;
ctx.shadowOffsetY = 7;
ctx.shadowBlur = 3;
ctx.shadowColor = 'rgba(200,200,200,0.5)';
ctx.arc(redX,redY,r, 0, (Math.PI/180)*360);
ctx.fill();
//백색공 테두리 그리기
ctx.beginPath();
ctx.arc(x,y,r, 0, (Math.PI/180)*360);
ctx.strokeStyle='rgb(0,0,0)';
ctx.stroke();
//백색공 그리기
ctx.beginPath();
grd = ctx.createRadialGradient(x-10, y-10, 0, x, y, 20);
grd.addColorStop(0, 'rgb(255, 255, 255)');
grd.addColorStop(1, 'rgb(220, 220, 220)');
ctx.fillStyle = grd;
ctx.arc(x,y,r, 0, (Math.PI/180)*360);
ctx.fill();
if((x-r)<=0) {//왼쪽끝
x=r;
xspeed *= -1
}else if((y-r)<=0) {//상단
y=r;
yspeed *= -1
}else if((x+r)>=c.width) {
x = c.width-r;
xspeed *= -1
}else if((y+r)>=c.height) {
y = c.height-r;
yspeed *= -1
}
//이동하는 공의 속도 자연감소
xspeed *= 0.992;
yspeed *= 0.992;
//console.log("xspeed:"+xspeed+", yspeed:"+yspeed);
//속도는 무한히 작아지는데, 적당한 양에 도달하면 애니메이션을 종료한다
if(Math.abs(xspeed)<0.03 && Math.abs(yspeed)<0.03) stopBall();
//공끼리 충돌검사(피타고라스 정리 응용, a^2 + b^2 = c^2)
var dx = Math.abs(redX-x);
var dy = Math.abs(redY-y);
if((dx*dx + dy*dy) <= (2*r)*(2*r)) {
//console.log("공끼리 충돌");
stopBall();
}
/*
var now = Date.now();
console.log(now-prevTime);
prevTime = now;
*/
}
var intval;
function moveBall() {
intval = setInterval(function(){drawArc();}, 30);
}
function stopBall() {
clearInterval(intval);
alert("Ball Stopped!");
}
</script>
</head>
<body>
<canvas id="canvas1" width="300" height="200"></canvas>
<p>
<input type="button" value="START" onclick="moveBall();">
<input type="button" value="STOP" onclick="stopBall();">
</body>
</html>