본문 바로가기

HTML5/Walking Sprite

HTML5 Walking Sprite example

HTML5에서 달리기 애니메이션 (Walking Sprite Animation)


사용된 이미지는 하단에 첨부함 (한개의 Sprite Sheet 를 뒤집어서 반대방향 애니메이션을 구현함)

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>HTML5 Sprite Animation(Walking) Example</title>

<style type="text/css">

canvas { border:5px solid black;}

</style>

<script type="text/javascript">

var sx = 0;    //읽어올 프레임의 x좌표

var sy = 0;    //읽어올 프레임의 y좌표

var w = 125;   //한 프레임의 폭

var h = 125;   //한 프레임의 높이

var dx = 200;

var dy = 0;


var frame_cnt = 16; //총 프레임 수

var column_cnt = 4;

var idx = 1;  //현재 사용된 프레임의 인덱스

var intval;   //타이머


var STATUS = "TO_LEFT";

var sprite_sheet1 = new Image();

var sprite_sheet2 = new Image();

var img = new Image();

var canvas;

var ctx;


function startAnim() {

sprite_sheet1 = document.getElementById("sprite");

sprite_sheet2 = document.getElementById("sprite2");

img = sprite_sheet1;

STATUS = "TO_LEFT";

clearInterval(intval);

sx = 0;

sy = 0;

idx = 1;

canvas = document.getElementById("canvas1");

if(!canvas.getContext) {

alert('Canvas그리기를 지원하는 웹브라우저가 아닙니다');

return;

}

ctx = canvas.getContext("2d");

intval = setInterval(function(){drawFrame();},50);

}


function drawFrame() {

//console.log("1. idx="+idx+", sx:"+sx+", sy:"+sy+", dx:"+dx+", dy:"+dy);

ctx.clearRect(0,0,canvas.width,canvas.height);

if(STATUS=="TO_LEFT") {

ctx.drawImage(img,sx,sy,w,h, dx,dy,w,h);

sx += w;

dx -= 5;

if(idx!=0 && idx % column_cnt==0) {

sx = 0;

sy += h;

}

}else if(STATUS=="TO_RIGHT") {

ctx.drawImage(img,sx,sy,w,h, dx,dy,w,h);

sx -= w;

dx += 5;

if(idx!=0 && idx % column_cnt==0) {

sx = img.clientWidth-w;;

sy += h;

}

}

//console.log("2.idx="+idx+", sx:"+sx+", sy:"+sy+", dx:"+dx+", dy:"+dy);

idx++;

//마지막 프레임이라면 다시 처음 프레임으로 되돌아 간다

if(idx>frame_cnt) {

idx = 1;

if(STATUS=="TO_LEFT") {

sx = 0;

}else if(STATUS=="TO_RIGHT") {

sx = img.clientWidth-w;

}


sy = 0;

}

if(dx<=0 && STATUS=="TO_LEFT") {

idx = 1;

sx = img.clientWidth-w;

sy = 0;

STATUS = "TO_RIGHT";

img = sprite_sheet2;

}else if(dx>=canvas.width-w && STATUS=="TO_RIGHT") {

idx = 1;

sx = 0;

sy = 0;

STATUS = "TO_LEFT";

img = sprite_sheet1;

}

//if(idx>frame_cnt) clearInterval(intval);

}


function stopAnim() {

clearInterval(intval);

}

</script>

</head>

<body>

<canvas id="canvas1" width="300" height="200"></canvas>

<p>

<input type="button" value="Start Animation" onclick="startAnim();">

<input type="button" value="Stop Animation" onclick="stopAnim();">

<div style="visibility: hidden;">

<img id="sprite" src="walking_sprite_sheet.png">

<img id="sprite2" src="walking_sprite_sheet2.png">

</div>

</body>

</html>



사용된 Sprite Sheet


아래의 이미지는 왼쪽을 향해 달리는 프레임을 가진 스프라이트 시트(Sprite Sheet)이다. 위의 예제에서는 오른쪽으로 달리는 애니메이션을 구현할 때 아래의 이미지를 뒤집어서 새로 저장한 walking_sprite_sheet2.png 파일을 사용하였다.