[HTML5 Game] Background Animation

Posted in 모바일/HTML5 // Posted at 2013. 9. 20. 17:47

이번 글에서는 HTML5 게임의 백그라운드 애니메이션 구현 기법을 알아보자.

 

백그라운드 애니메이션은 배경이 고정되어 있지 않고 지속적으로 움직이는 것으로, 여기서는 마치 자동차를 타고 지나가는 것과 같이 배경이 우측에서 좌측으로 계속 움직이는 애니메이션 효과를 구현해 볼 것이다.

 

실제 게임에서는 캐릭터와 배경 애니메이션이 적절히 조화된 상태로 구현되지만 간단하게는 캐릭터는 가만히 있어도 배경이 계속 흐르듯 움직이면 마치 캐릭터가 앞으로 나아가는 것같은 느낌을 줄수도 있다.

 

* 간단한 개념

배경이 움직인다고 해서 여러개의 이미지가 사용되는 것은 아니다.(물론 여러개의 배경이라면 그 만큼 이미지가 필요하다). 여기서는 하나의 배경이 우측에서 좌측으로 움직이는 것이므로 하나의 배경 이미지만 사용하면 된다. 이전 글, Image Sprites의 개념에서 설명했듯이 HTML5 Canvas에는 원본 이미지에서 원하는 부분만 잘라내어 그릴 수 있다고 했다. 배경 애니메이션 역시 Canvas의 이러한 특징을 이용하는 것으로 총 두 번의 그리기 작업을 지속적으로 수행함으로써 배경이 움직이도록 할 수 있다.

 

먼저 배경이 좌측으로 움직인만큼 X좌표를 이동시켜서 첫 번째 그리기를 수행하고, 우측에 남은 공간만큼 원본에서 다시 잘라내어 두 번째 그리기를 수행하면 된다. 이것은 마치 회전목마(carousel)를 연상시킨다. 만일 회전목마의 한 단면만 볼 수 있다면 그 단면은 지나간 말의 꼬리와 새로운 말의 머리가 만나는 것의 연속이라 할 수 있다. 

 

결국 배경이 움직인다는 것은 시간의 흐름에 따라 배경의 그리기 좌표를 조정하고 이를 빠르게 전환시키면서 그려주면 자연스러운 애니메이션 처리가 된다는 것이다.

 

애니메이션으로 사용되는 배경 이미지

하나의 이미지를 사용하여 그림을 붙여 나가는 방식이기 때문에 배경 이미지는 시작과 끝이 자연스럽게 연결되는 모습이어야 한다. 그렇지 않을 경우, 애니메이션에는 지장이 없으나 배경이 끝나고 시작되는 지점의 시각적 연결이 부자연스러워 게임의 퀄리티가 손상될 것이다. 이렇게 이미지의 시작과 끝 부분을 자연스럽게 연결해서 반복하는 것을 타일링 방식이라 한다.

 

 

이제 본격적으로 Background Animation 구현방법을 알아보자.

 

* HTML

HTML 코드는 설명할 것도 없이 간단하다. 캔버스가 있고 대체 텍스트와 스크립트 참조가 전부이다.

<!DOCTYPE html>
<html lang="en">
 <head>  
  <script type="text/javascript" src="js/animationBackground.js"></script>
 </head>
 <body>
  <canvas id="GameCanvas" width="909" height="566" style="border: 1px solid #000;">
   HTML5 Canvas를 지원하지 않습니다. 크롬 또는 사파리와 같은 HTML5 지원 브라우저를 이용해 주세요
  </canvas>
 </body>
</html>

 

 

* Javascript

늘 그래왔듯이 모든 마법(?)은 자바스크립트에서 이뤄진다. 전체적인 구조는 지금까지 구현해 왔던 것과 유사하다. 다만 캐릭터 객체가 아닌 백그라운드 객체로 변화가 있으며 두 번의 그리기 작업이 필요하다는 것이다.

애니메이션을 위하 Trident.js를 사용할 수도 있으나 이번에는 라이브러리 의존없이 구현해 보도록 한다.

 

1. 백그라운드, 생성자 함수와 메서드

/* Define Background Class */
function Background(assetObj,canvasElement){
   this.assetObj = assetObj; 
   this.canvasSize = {width: canvasElement.width, height: canvasElement.height};   //Canvas Size
   this.canvasContext = canvasElement.getContext('2d');                                     //Canvas Context
   this.spritesX = 0;                                                                                       //Image X Position 
}

 

Background.prototype.startAnimation = function(){ 
  //Clear Canvas  
  this.canvasContext.clearRect(0, 0, this.canvasSize.width, this.canvasSize.height);
 
  //Draw Background Image
  var drawX = this.spritesX * this.assetObj.bgImage.width;
  var drawWidth = this.assetObj.bgImage.width - drawX;
  this.canvasContext.drawImage(this.assetObj.bgImage,
                    drawX, 0, drawWidth, this.assetObj.bgImage.height,
                    0, 0, drawWidth, this.assetObj.bgImage.height);     
    
   //Fill Cut Out area
  if(drawWidth < this.assetObj.bgImage.width) {
        var fillDrawWidth = this.assetObj.bgImage.width - drawWidth;
        this.canvasContext.drawImage(this.assetObj.bgImage
                          0, 0, fillDrawWidth, this.assetObj.bgImage.height,
                          drawWidth, 0, fillDrawWidth, this.assetObj.bgImage.height);
    }
   
    this.spritesX = (this.spritesX + this.assetObj.spritesRate) % 1;

 

먼저 Background 생성자 함수에서는 배경이미지를 표현하는 에셋 인스턴스와 Canvas 요소를 전달받아서 초기화 작업을 수행한다. spritesX 변수는 배경이미지의 이동을 처리하기 위해 원본 이미지에서 이동할 크기를 저장하는 변수이다.

 

다음으로 실제 애니메이션 처리가 이뤄지는 startAnimation 메서드에서는 캔버스를 다 지우면서 시작한다.

drawX 변수는 원본 이미지 크기에서 spritesX를 곱한 값으로, 원본 이미지에서 원한는 부분을 자르게 될 X좌표 값이 된다. spritesX의 값은 이후 나오게 될 spritesRate값을 계속 더하여 원본 이미지의 x 좌표를 spritesRate 간격만큼 이동시키는데, 예를 들어 원본 이미지 너비가 100px이고 spritesRate가 0.1일 경우 spritesX와 drawX값의 변화는 다음과 같다.

 

 spretesX

 0

 0.1

 0.2

 0.3

 drawX

 0

 10

 20

 30

 

즉, X좌표가 10px 만큼 이동하게 되는 것이다.

이어지는 drawWidth는 원본 이미지에서 drawX르 뺀 값으로 drawX부터 이미지 나머지 부분의 크기를 나타낸다. 이렇게 첫번째 그리기 작업이 수행된다.

 

이후 두번째 그리기 작업이 수행되는데, 이 시점에 브라우저로 확인해 보는 것도 프로그램 로직 이해에 도움이 될 것이다. 두 번째 그리기 작업은 앞서 첫번째 그리기 작업에서 비워진 우측 공간을 메우는 작업으로 역시 동일한 원본 이미지의 첫 부분에서 비워진 공간만큼 잘라내어 그리는 것이다.

 

두번째 그리기 작업에서 중요한 것은 fillDrawWidth 변수인데, 이 변수에는 비워진 공간의 너비를 계산해서 그 값을 저장하게 된다. 그리고 비워진 공간의 X좌표에 두번째 그리기 작업을 수행하면 두 개의 그리기 작업이 자연스럽게 연결됨으로써 애니메이션 효과가 구현되는 것이다.

 

마지막으로 spritesX 값을 spritesRate만큼 계속 더해가는데, 최대 크기 비율인 1이 될 시점에 다시 0으로 만들어 줌으로써 이미지가 처음부터 다시 그려지도록 한다.

 

2. 기타 프로그램 로직

나머지 코드는 이전에 알아봤던 캐릭터 애니메이션의 그것과 거의 유사하다.

var fps = 60;            //frame per second
var background;        //Character Instance
var canvasElement;    //Canvas Element
var asset;                 //Asset Image Ojbect    

 

function init(){ 
 canvasElement = document.getElementById("GameCanvas"); 
  
 //Create Asset Image Ojbect
 asset = new Image(); 
 asset.src = 'image/background.png';       
 //Assign Imgae Load Event
 asset.onload = onAssetLoadComplete
}

 

function onAssetLoadComplete(){ 
 //Create Custom Asset Object 
 var assetObj = {bgImage:asset, spritesRate:0.01}; 
 //Create Character Instance    
 background = new Background(assetObj,canvasElement);
 //Run Game Loop     
 setInterval(animationLoop, 1000 / fps); 
}

function animationLoop(){
  background.startAnimation();
}

 

window.addEventListener("load", init, false);

 

fps 값을 60 즉, 1초에 60번 프레임을 교체하도록 하여 캐릭터 애니메이션 보다 조금 더 빠른 속도를 지정했다.

나머지 코드는 캐릭터 애니메이션 예제와 동일하므로 이전 글을 참고하면 되고 다만 spritesRate가 추가되었는데 이것은 배경 이미지의 이동 간격을 나타낸다. 코드에서는 0.01을 지정했는데 이것의 의미는 프레임이 이동할 때마다 원본 이미지에서 0.01px 이동한다는 의미가 된다. fps와 함께 이 값의 변화는 배경 애니메이션의 속도에 영향을 준다. 이 값이 클수록 한 프레임에 이동하는 배경 이미지의 간격이 크지므로 더욱 빠른 애니메이션 효과를 낼 수 있다. 즉 이 값의 조정을 통해 동일한 fps 상에서 캐릭터의 속도를 증가시킬수도 있다는 것이다.

 

 

실행화면

인터넷에서 background image를 검색해서 이미지의 좌측 시작부분과 우측 끝 부분이 매끄럽게 연결되는 이미지를 다운로드 해서 예제를 실행해 보자.

 

마무리하며...

이 글에서는 횡스크롤 형태의 게임에서 사용할법한 배경 애니메이션을 구현해 봤다.

원본 이미지의 좌표를 이동해 가며 두 번의 그리기 작업을 반복함으로써 배경이 우측에서 좌측으로 이동하는 효과를 구현했는데 이는 유명한 고전 오락실 게임인 1945와 같이 위에서 아래로 흐르는 배경 애니메이션 처리에도 동일한 개념으로 접근할 수 있을 것이다. 애니메이션의 방향을 바꿔서 직접 구현해 보면 더욱 빠른 이해가 될 것이다.

 

 

submit

[HTML5 Game] Character Animation Using Trident.js

Posted in 모바일/HTML5 // Posted at 2013. 9. 17. 20:00

앞서 두 개의 글을 통해 HTML5 상에서 애니메이션 구현을 알아봤다.

이 두 글에서는 자바스크립트의 setInterval() 함수를 통해 애니메이션 처리를 직접 구현했었다.

 

> http://m.mkexdev.net/235

> http://m.mkexdev.net/237

 

이번에는 잘 알려진 오픈소스 라이브러리를 이용해 애니메이션을 구현해 보도록 한다.

 

이 글에서 사용할 라이브러리는 Kirill Grouchnikov라는 스마트한 개발자에 의해 개발된,

Trident.js 라는 자바스크립트 애니메이션 라이브러리로 ProcessingJS 처럼 기존 JAVA 라이브러리를 자바스크립트 버전으로 포팅한 것으로 타임라인과 키프레임에 기반한 애니메이션 처리를 지원하고 Easing 함수를 통해 비선형 타임라인을 지원하는 등 애니메이션 처리와 관련된 안정되고 다양한 기능을 제공한다.

 

이 라이브러리는 github에 공개되어 있다.

> https://github.com/kirillcool/trident-js

 

공개된 라이브러리를 사용한다는 것은 개발의 생산성과 안정성을 높이고 유용하고 다양한 기능을 큰 시행착오 없이 적용할 수 있는 등 많은 장점을 가져다 준다. 따라서 대부분의 개발환경에서 이미 구현된 라이브러리 사용을 권장하고 있다.

 

다만 기본 개념이 전혀 갖춰져 있지 않은 상태에서 무작정 라이브러리에만 의존하다보면 프로그램의 원리적 동작의 이해가 부족하게 되고 복잡한 문제를 대응하는 능력이 떨어져 전반적인 프로그램 개발 역량을 성장시키지 못하게 되는 원인이 되기도 한다. 따라서 이전 두 글에서와 같이 라이브러리 의존 없이 기본적인 구현을 직접 해 봄으로써 애니메이션 처리의 기본 구현 원리를 숙지하고 난후 유용한 라이브러리에 관심을 가지는 수순을 따르는게 좋겠다.

 

그럼. 본격적으로 Trident.js를 사용해보게 될텐데, 캐릭터 애니메이션 구현을 해 보기 전에 기본적인 라이브러리 사용법을 간단히 알아보자.

 

* Trident.js 기본

Trident.js 사용해서 HTML 이미지요소의 투명도를 타임라인에 기반해 서서히 변경해 보는 간단한 예를 살펴봄으로써 이 라이브러리의 기본 사용법을 익혀보자.

 

먼저 다음과 같이 github에서 다운받은 trident.js와 이미지요소가 정의된 간단한 HTML파일을 만들자.

<html>
  <head>
    <script src="js/trident.js"></script>
    <script type="text/javascript" src="js/tridentBasic.js"></script>
  </head>
  <body>  
    <img id="myImg" src="image/iu.png" style="opacity:0.3" /> 
  </body>
</html>

 

그리고 자바스크립트에서 다음과 같은 로직을 구현한다.

function init(){
  //Create TimeLine Instance
  var rolloverTimeline = new Timeline(myImg.style);
    
  //Add Interpolator
  rolloverTimeline.addPropertiesToInterpolate([
    {
      property: "opacity", from:0.3, to:1.0, interpolator: new FloatPropertyInterpolator()     
    }
  ]);
  
  //Define Animation Duration
  rolloverTimeline.duration = 500;
    
  //Add Event Listener of Image
  myImg.addEventListener("mouseover", function(){rolloverTimeline.play()}, false);
  myImg.addEventListener("mouseout", function(){rolloverTimeline.playReverse()}, false);
}

 

window.addEventListener("load", init, false);

 

Trident.js는 그래픽 편집 툴의 그것과 동일한 개념의 타임라인 객체를 제공한다. 이 객체에 설정한 각종 정보를 기반으로 애니메이션 처리가 이뤄지는데 먼저 생성자 함수로 애니메이션할 요소와 대상 속성을 설정한다.

여기서는 이미지 요소의 style속성을 애니메이션 대상 속성으로 지정했다.

var rolloverTimeline = new Timeline(myImg.style);

 

그리고 애니메이션할 속성과 시작-끝 값 그리고 시작과 끝 값 사이에 변경해야 할 값(보간값)의 형태를 지정한다. 여기서는 이미지의 투명도에 해당하는 opacity 속성을 지정하고 0.3 ~ 1.0 사이의 값을 실수 형태의 보간(FloatPropertyInterpolator)이 이뤄지도록 지정했다.

rolloverTimeline.addPropertiesToInterpolate([
   {
      property: "opacity", from:0.3, to:1.0, interpolator: new FloatPropertyInterpolator()
     }
]);

 

참고로 보간형태는 FloatPropertyInterpolator외에도 정수값 보간인 IntPropertyInterpolator과 RGB값 보간인 RGBPropertyInterpolator가 제공된다.

 

마지막으로 애니메이션이 동작할 시간을 밀리초단위로 지정하는데 여기서는 0.5초로 지정했다

rolloverTimeline.duration = 500;

 

결국 0.5초 동안 이미지 투명도가 0.3에서 1.0으로 점점 밝아 지도록 하는 것이다. 여기까지해서 Trident.js의 애니메이션 설정은 모두 끝이 났다.

 

이어지는 코드는 실제 애니메이션 처리를 하기 위한 이벤트를 등록하는 것이다.

코드에서는 이미지에 마우스를 올리면 애니메이션이 시작하도록 하고 마우스를 떼면 역방향으로 애니메이션이 진행하도록 구현했다.

myImg.addEventListener("mouseover", function(){rolloverTimeline.play()}, false);
myImg.addEventListener("mouseout", function(){rolloverTimeline.playReverse()}, false);

 

브라우저로 샘플을 실행해서 애니메이션을 확인해 보자.(눈의 즐거움을 위해 국민 여동생 등장시킴!)

 

                =>               

 

 

* Trdent.js를 활용한 캐릭터 애니메이션 구현

이제 이 라이브러리를 이용해서 캐릭터 애니메이션을 구현해 보자. 전체적인 흐름은 이전과 유사하며 이미지는 Image Sprites 기법으로 처리한다.

 

1. 캐릭터, 생성자 함수와 메서드

/* Define Character Class */
function Character(assetObj,canvasElement){
   this.assetObj = assetObj;                                                                        //Custom Asset Object

   this.canvasSize = {width: canvasElement.width, height: canvasElement.height}; //Canvas Size
   this.canvasContext = canvasElement.getContext('2d');                                   //Canvas Context
   this.spritesX = 0;                                                                                   //Sprite Image X Position
}

 

Character.prototype.startAnimation = function()
{
   //Assign This Instance Context('this' keyword Changed according to the Effective Range)
   var self = this; 
 
   //Create TimeLine
   var spriteTimeline = new Timeline(self);  
   //Add Interpolate
   spriteTimeline.addPropertiesToInterpolate([
    { 
      //Interpolate Property: spritesX, Interpolate Value: 0 ~ 36, Interpolate Type: Int
      property: "spritesX", from:0, to: 36, interpolator: new IntPropertyInterpolator()
     }
   ]);    
        
   //Define Animation Duration
   spriteTimeline.duration = 2500;      
   //Add onpulse Event Listener 
   spriteTimeline.addEventListener("onpulse",

            function (timeline, durationFraction, timelinePosition) {
                    self.drawCanvas();   
             }

   );  
   //Play Animation(Infinite Looping)
   spriteTimeline.playInfiniteLoop();
}

 

Character.prototype.drawCanvas = function(){ 
   //Clear Canvas  
   this.canvasContext.clearRect(0, 0, this.canvasSize.width, this.canvasSize.height);

   //Draw Image on Canvas   
   this.canvasContext.drawImage(this.assetObj.assetImage,
         this.spritesX * this.assetObj.spritesWidth, this.assetObj.spritesY,
         this.assetObj.spritesWidth, this.assetObj.spritesHeight,
         100, 100,
         this.assetObj.spritesWidth, this.assetObj.spritesHeight);
   
 //Update Sprite Image X Position      
 //this.spritesX  = ++this.spritesX  % this.assetObj.spritesCount;
 
}

 

캐릭터 메서드의 구조가 이전과는 조금 달라졌다.

startAnimation() 메서드에서 Trident.js의 타임라인을 생성하고 애니메이션을 시작하도록 구현했으며 캔버스에 그리는 작업인 drawCanvas() 메서드를 분리시켰다.

 

타임라인 인스턴스를 생성할 때 앞서 기본 예제와는 달리 HTML 요소가 아니라 객체 자체를 매개변수로 전달하고 있다. 이렇게 하면 객체의 특정 속성을 기준으로 애니메이션 처리를 할 수 있게 된다.

var self = this;

var spriteTimeline = new Timeline(self);

 

또한 여기서 캐릭터 인스턴스의 문맥을 나타내는 'this' 값을 self라는 지역변수에 할당하고 있는데 이렇게 하는 이유는 this 키워드가 다른 유효범위에서는 다른 문맥을 가르키기 때문에 프로그램이 정상 동작하지 않을 수 있다. 이 예제에서는 타임라인에 이벤트 리스너를 등록할 때 문제가 발생한다. 따라서 self라는 변수를 통해 캐릭터 인스턴스의 문맥이 유효할 수 있도록 하며 타임라인 위치가 변경할 때마다 동작할 이벤트 리스너를 다음과 같이 등록한다.

spriteTimeline.addEventListener("onpulse", function (timeline, durationFraction, timelinePosition) {
   self.drawCanvas();
});

 

그리고 원본 이미지의 자르기 x좌표인 spritesX 값은 더이상 직접 업데이트 해 줄 필요가 없게 되었다. Trident.js의 보간값 설정에서 다음과 같이 이 변수의 변경될 값 범위(0~36)를 지정했기 때문에 타임라인이 실행되면서 자동으로 spritesX값이 업데이트 되기 때문이다.

spriteTimeline.addPropertiesToInterpolate([
   {
      //Interpolate Property: spritesX, Interpolate Value: 0 ~ 36, Interpolate Type: Int
      property: "spritesX", from:0, to: 36, interpolator: new IntPropertyInterpolator()
   }
]);

 

마지막으로 애니메이션을 2.5초간 동작하도록 하여 이전 두 글의 fps와 값을 유사하게 맞췄다. 더불어 애니메이션이 무한 반복되도록 다음과 같이 playInfiniteLoop() 메서드를 호출한다.

spriteTimeline.playInfiniteLoop();

 

2. 프로그램 로직

나머지는 이전 코드와 모두 동일하며 onAssetLoadComplete() 함수에 약간의 변화가 있다.

이전 코드에서는 자바스크립트의 setInterval() 메서드를 이용해 직접 루프를 동작시켰지만 Trideng.js에서는 자체 타임라인을 기반으로 루프가 동작하기 때문에 더 이상 사용할 필요가 없다.

function onAssetLoadComplete(){ 
  //Create Custom Asset Object 
  var assetObj =
    {assetImage:asset, spritesCount:36, spritesWidth:128, spritesHeight:128, spritesY: 128 * 0}; 
 
  //Create Character Instance    
  character = new Character(assetObj,canvasElement);
 
   //Run Game Loop     
   //setInterval(animationLoop, 1000 / fps);
 
  
   character.startAnimation();  
}

 

//function animationLoop(){
   //character.startAnimation();
//}

 

 

실행화면

브라우저로 실행해 보면 이전 예제와 동일한 애니메이션을 확인할 수 있다. 

 

마무리하며...

지금까지 총 3차례에 걸쳐 캐릭터 애니메이션을 구현해 보았다. 첫번째는 동작별로 분리된 이미지들을 이용해 애니메이션을 구현해 봤으며 두번째는 하나의 이미지를 기반으로 Image Sprites 기법을 활용했으며 마지막으로 이 글에서는 Image Sprites 기법과 더불어 Trident.js 라는 오픈소스 라이브러리를 활용해서 동일한 애니메이션을 구현해 보았다. 이 중에서 제일 권장되는 방법은 1 < 2 < 3 즉, 이 Trident.js를 활용하는 것이 여러모로 좋을 것이다. 라이브러리의 안정성이 곧 프로그램의 안정성으로 직결되며 반복 카운트 및 되감기 애니메이션 지원과 타임라인과 키프레임의 조합, 비선형 타임라인 지원 등 더 강력한 기능을 공짜로(?) 얻을 수 있기 때문이다. 하지만 자바스크립트의 애니메이션 처리를 위한 기본 원리를 알기 위해서는 이전 두 과정을 필수로 거쳐보기 바란다. 기본기 없이 라이브러리에만 의존한다면 언젠가 더 높은 벽을 만나게 될 것이다.

 

 

'모바일 > HTML5' 카테고리의 다른 글

[HTML5 Game] Parallxing Background Animation  (0) 2013.09.21
[HTML5 Game] Background Animation  (1) 2013.09.20
[HTML5 Game] Character Animation Using Sprites  (0) 2013.09.17
[HTML5 Game] Character Animation  (1) 2013.09.14
CSS3 3D Effect  (0) 2013.08.02

submit

[HTML5 Game] Character Animation Using Sprites

Posted in 모바일/HTML5 // Posted at 2013. 9. 17. 07:44

이전 글에서 캐릭터의 움직임을 위한 애니메이션 기법을 알아봤다.

이전 글: http://m.mkexdev.net/235

 

이 글에서는 캐릭터 애니메이션을 처리하기 위해 각각의 동작을 분리된 개별 이미지로 처리했었다.

하지만 이런 방식은 많은 이미지 리소스를 다운로드 해야 하기 때문에 비효율적이다.

 

이번 글에서는 Image Sprites 기법을 이용해 애니메이션을 구현하는 예를 살펴 보겠다.

Image Sprites 모든 캐릭터의 모든 동작을 하나의 이미지로 만들어 필요한 부분만 잘라내서 사용하는 방식으로 리소스의 다운로드 비용을 줄이고 효율성을 높이는 기법으로 실제 게임 개발에 많이 사용되고 있기도 하다.

 

아래 그림은 http://opengameart.org 의 샘플 이미지로 8 * 36 즉, 총 8가지 패턴의 서로 다른 동작 36개를 하나의 이미지로 모아놓은 것이다. 이번 예에서는 이 이미지를 Sprites 해서 애니메이션을 구현해 볼 것이다.

 

 

 

* 간단한 개념

HTML5 Canvas에 이미지를 그릴 때, 이미지 원본의 특정 좌표에서 원하는 너비,높이 만큼 이미지를 그릴 수 있다. 예를 들어 아래 그림과 같이 4개의 서로 다른 모습이 하나의 이미지에 포함되어 있을 때 개별 이미지의 너비/높이 값으로 특정 이미지 좌표와 크기를 산출할 수 있으며 이렇게 산출된 값으로 원하는 영역의 이미지를 Canvas에 그릴 수 있게 된다. 즉 아래 그림과 같이 4개의 동작일 경우, (0,0) ~ (384,0)까지 128*128 크기로 차례대로 그려주면 되는 것이다. 

* HTML

HTML은 이전 글과 동일한 구조다.

<!DOCTYPE html>
<html lang="en">
 <head>  
  <script type="text/javascript" src="js/animationCharacterUsingSprites.js"></script>
 </head>
 <body>
   <canvas id="GameCanvas" width="300" height="300" style="border: 1px solid #000;">
     HTML5 Canvas를 지원하지 않습니다. 크롬 또는 사파리와 같은 HTML5 지원 브라우저를 이용해 주세요
   </canvas>
 </body>
</html>

 

* JavaScript

자바스크립트 역시 전체적인 흐름은 이전 글의 내용과 동일하다.

다만 이전 글에서는 개별 이미지를 담는 배열과 이 배열의 인덱스를 탐색하기 위한 프레임 값의 업데이트가 있었던 것에 반해, 여기서는 하나의 이미지에서 원하는 부분을 잘라내기 위한 이미지 X좌표 값의 업데이트가 구현된다.

 

1. 캐릭터, 생성자 함수와 메서드

/* Define Character Class */
function Character(assetObj,canvasElement){
   this.assetObj = assetObj;                                                                           //Custom Asset Object
   this.canvasSize = {width: canvasElement.width, height: canvasElement.height}; //Canvas Size
   this.canvasContext = canvasElement.getContext('2d');                                  //Canvas Context
   this.spritesX = 0;                                                                                      //Image X Position
}

Character.prototype.startAnimation = function(){ 
  //Clear Canvas  
  this.canvasContext.clearRect(0, 0, this.canvasSize.width, this.canvasSize.height);

 
  //Draw Image on Canvas
  this.canvasContext.drawImage(this.assetObj.assetImage,
       this.spritesX * this.assetObj.spritesWidth, this.assetObj.spritesY,
       this.assetObj.spritesWidth, this.assetObj.spritesHeight,
       100, 100,
       this.assetObj.spritesWidth, this.assetObj.spritesHeight);
   
 //Update Sprite Image X Position       
 this.spritesX  = ++this.spritesX  % this.assetObj.spritesCount;  
}

 

이번 코드의 생성자 함수에서는 이미지 배열이 아닌 하나의 이미지 정보를 담고 있는 커스텀 객체를 매개변수로 전달받는다. 그리고 원본 이미지에서 잘라 낼 X 좌표 값을 위한 spritesX 변수를 선언하였다. 이 변수는 총 36개의 동작의 X좌표 계산을 위한 변수이며 '0 에서 35'의 값을 가지게 된다. 이 값에 개별 동작의 너비 값인 128px를 곱해 주면 0 ~ 4480 즉, 실제 잘라 낼 이미지의 X좌표를 계산할 수 있게 된다.

 

HTML5의 Canvas는 원본 이미지에서 원하는 부분을 잘라내어 그릴 수 있도록 아래와 같은 매개변수를 가진 drawImage()함수를 제공한다.

 

drawImage 매개변수>

 - image, in float sx, in float sy, in float sw, in float sh, in float dx, in float dy, in float dw, in float dh

 

drawImage 매개변수 설명>

 - 이미지 객체, 자르기 X , 자르기 Y , 자를 너비, 자를 높이, 그릴 위치 X 값, 그릴 위치 Y 값, 그릴 너비, 그릴 높이

(실제 제대로 된 해석은 원본 X값, 대상 X값.. 이런 식이지만 원본 이미지를 자른다는 개념을 명확히 하기 위해 임의대로 설명함)

 

 

2. 프로그램 로직

하나의 이미지만을 사용하기 때문에 이전 코드에 비해 전역변수가 줄어 들었다. 그리고 초당 프레임 수인 fps도 15로 작게 설정되었다. 샘플을 실행해 보면 알겠지만 초당 30 프레임으로 동작시키면 캐릭터가 너무 빠르게 움직이므로 적절한 값으로 변경해 주었다.

var fps = 15;             //frame per second
var character;             //Character Instance
var canvasElement;     //Canvas Element
var asset;                  //Asset Image Ojbect

 

그리고 초기화 함수를 보면 단 한개의 이미지만을 로딩하는 것을 확인할 수 있으며 이미지 객체와 개별 동작의 수, 개별 이미지의 너비/높이 및 Y 좌표 값을 담은 커스텀 객체를 생성해서 캐릭터 객체의 생성자 함수로 전달해 주고 있다. 이 값들을 이용해 원본 이미지에서 어떤 부분의 이미지들을 애니메이션 할 것인가가 결정된다.

function init(){ 
 canvasElement = document.getElementById("GameCanvas"); 
  
  //Create Asset Image Ojbect
  asset = new Image(); 
  asset.src = 'image/zombie.png';       
  //Assign Imgae Load Event
  asset.onload = onAssetLoadComplete
}

 

function onAssetLoadComplete(){ 
  //Create Custom Asset Object 
var assetObj = 
   {assetImage:asset, spritesCount:36, spritesWidth:128, spritesHeight:128,
     spritesY: 128 * 0}; 


  //Create Character Instance    
  character = new Character(assetObj,canvasElement);
  //Run Game Loop     
  setInterval(animationLoop, 1000 / fps); 
}

 

function animationLoop(){
  character.startAnimation();
}

 

window.addEventListener("load", init, false);

 

 

실행화면

코드를 실행하면 좀비가 걸어가다 머리가 터지며 죽는 모습의 애니메이션을 확인할 수 있다. 

 

마무리 하며...

지금까지 캐릭터 이미지를 구현하기 위한 두 가지 방법을 알아 보았다. 사실 두 가지 방법은 이미지를 몇 개 사용하는지만 다를 뿐 동일한 프로그램 로직을 가지고 있다. 실제 게임 개발에서는 Image Sprites 기법을 많이 사용하므로 이 기법으로 여러가지 테스트 프로그램을 작성해 보는 것이 도움이 될 것이다.

 

두개의 글을 통해 애니메이션 구현 기법을 충분히 숙지하였으니, 다음 글에서는 공개된 라이브러리를 사용해서 애니메이션을 구현해 보도록 하겠다. 라이브러리를 활용하면 좀 더 안정적으로 그리고 생산성 높게 개발할 수 있으므로 자신의 개발 무기로 장착해 두는 것이 좋을 것이다.

 

 

 

'모바일 > HTML5' 카테고리의 다른 글

[HTML5 Game] Background Animation  (1) 2013.09.20
[HTML5 Game] Character Animation Using Trident.js  (3) 2013.09.17
[HTML5 Game] Character Animation  (1) 2013.09.14
CSS3 3D Effect  (0) 2013.08.02
...  (0) 2013.07.23

submit

[HTML5 Game] Character Animation

Posted in 모바일/HTML5 // Posted at 2013. 9. 14. 08:30

HTML5의 Canvas 요소를 활용하여 그럴싸한 2D 게임을 개발할 수 있다.

 

UDACITY에서도 HTML5 기반의 게임 개발 강의를 무료로 제공하고 있다

=> https://www.udacity.com/course/cs255

 

여기서 제공하는 캐릭터 애니메이션 구현 기법을 살펴보자. 코드는 내 입맛에 맞게 수정을 가했지만 전체적인 맥락은 동일하다.

 

대략적은 구현 흐름을 보면, 캐릭터의 움직임을 위해서 각각의 컷을 개별 이미지로 준비하고 이 이미지들을 Canvas에 차례대로 반복해서 그려주는 것이다. 이미지들은 매우 빠른 속도로 Canvas에 그려지는데 이때 적용되는 개념이 초당 프레임(FPS, frame per second)이다. 

 

FPS는 게임 개발 영역에서는 자연스러운 개념으로 인간이 느끼지 못하는 속도로 프레임을 교체하여 자연스러운 움직임이 가능하도록 하는 것으로 영화 필름의 재생을 생각해 보면 이해하기 쉽다.

 

인간의 눈은 초당 인식할 수 있는 프레임의 수가 제한적이기 때문에 보통 초당 30에서 60회 사이에서 화면을 다시 그리는 반면 사용자 입력값에 대한 확인은 이보다 훨씬 많은 초당 100회 정도 수행한다. 하지만 이 모든 것은 게임의 상태에 따라 달라진다. - LEARNING HTML5 온라인 게임 개발 프로그래밍

 

아래 그림은 캐릭터 움직임을 19개 이미지로 분할한 모습을 보여준다.

 

 

 

* HTML

애니메이션 처리는 모두 자바스크립트에서 구현한다. HTML 파일은 단지 Canvas 요소와 자바스크립트을 참조하는 코드만 존재한다.

<!DOCTYPE html>
<html lang="en">
 <head>  
    <script type="text/javascript" src="js/animationCharacter.js"></script>
 </head>
 <body>
    <canvas id="GameCanvas" width="300" height="300" style="border: 1px solid #000;">
      HTML5 Canvas를 지원하지 않습니다. 크롬 또는 사파리와 같은 HTML5 지원 브라우저를 이용해 주세요
    </canvas>
 </body>
</html>

 

 

* JavaScript

자바스크립트로 이미지를 다운로드하여 애니메이션을 구현한다. 애니메이션 처리를 위한 자바스크립트의 핵심 함수는 setInterval()이다. 이 함수는 주어진 간격으로 함수를 반복(loop) 실행시켜주는 함수로 setTimeout() 함수와 함께 HTML5 게임 개발에 필수적으로 사용되는 함수이다. 먼저 캐릭터 객체를 위한 코드부터 살펴보자

 

1. 캐릭터, 생성자 함수와 메서드 

function Character(assets,canvasElement){
  this.assets = assets;                                                                                   //Asset Image Array
  this.canvasSize = {width: canvasElement.width, height: canvasElement.height}; //Canvas Size
  this.canvasContext = canvasElement.getContext('2d');                                   //Canvas Context
  this.currentFrame= 0;                                                                                //Current Frame
}

 

Character.prototype.startAnimation = function(){
    //Clear Canvas  
    this.canvasContext.clearRect(0, 0, this.canvasSize.width, this.canvasSize.height);
    //Draw Image on Canvas
    this.canvasContext.drawImage(this.assets[this.currentFrame], 100, 100);
    //Update Current Frame
    this.currentFrame = ++this.currentFrame % this.assets.length;  

 

생성자 함수에서는 게임 캐릭터의 개별 이미지를 담을 assets 배열과, 이 이미지를 그려줄 Canvas 요소를 매개변수로 받아서 초기화 작업을 수행한다. CurrentFrame는 개별 이미지를 담고 있는 assets 배열의 인덱스로 사용될 변수로 총 19개의 이미지를 순서대로 교체하기 위해 0~18까지의 값을 가지게 된다.

 

그리고 실제 애니메이션 동작을 처리하는 startAnimation 메서드에서는 먼저 Canvas를 초기화시킨다. Canvas를 초기화하지 않으면 이전에 그린 그림과 새로 그리는 그림이 서로 겹쳐지게 되어 잔상이 남게 되기 때문에 초기화 하는 작업을 제일 먼저 수행한다.

다음으로 19개의 캐릭터 이미지를 담고 있는 assets 배열에서 CurrentFrame에 해당하는 이미지를 선택해서 Canvas에 그려준다. 마지막으로 19개의 이미지를 순회하기 위해 CurrentFrame 값을 업데이트 하는데 0~18까지 순회하도록 나머지 연산을 수행한다. 결국 이 startAnimation 메서드가 끊임없이 반복 수행됨으로써 캐릭터의 움직임을 구현할 수 있게 되는 것이다.

 

2. 프로그램 로직

이제 이미지를 다운로드해서 setInterval()함수와 캐릭터 객체를 활용하는 코드를 살펴보자.

먼저 전역변수를 정의한다.

var fps = 30;          //frame per second
var character;         //Character Instance
var canvasElement;     //Canvas Element
var assetfiles;        //Asset Image File Array
var assets = [];       //Asset Image Ojbect Array
var currentAssetLoadCount = 0;  //Asset Image File Load Count

 

fps는 frame per count 약자로 초당 프레임 수를 나타내는데 30이라는 값은 1초에 30번 함수를 호출하겠다는 의미이다. 즉 1초에 30번 프레임이 이동 시키겠다는 의미이다.

 

다음으로 초기화함수를 정의한다.

function init(){ 
 canvasElement = document.getElementById("GameCanvas"); 
 
 //Define Asset Image File Array
 assetfiles = 
  [ 'image/robowalk/robowalk00.png', 'image/robowalk/robowalk01.png',            
    'image/robowalk/robowalk02.png',  'image/robowalk/robowalk03.png',        'image/robowalk/robowalk04.png', 'image/robowalk/robowalk05.png',
    'image/robowalk/robowalk06.png', 'image/robowalk/robowalk07.png',     'image/robowalk/robowalk08.png', 'image/robowalk/robowalk09.png',     'image/robowalk/robowalk10.png', 'image/robowalk/robowalk11.png',
    'image/robowalk/robowalk12.png', 'image/robowalk/robowalk13.png',     'image/robowalk/robowalk14.png', 'image/robowalk/robowalk15.png',     'image/robowalk/robowalk16.png','image/robowalk/robowalk17.png',
    'image/robowalk/robowalk18.png'
   ];
         
  for (var i = 0; i < assetfiles.length; i++) {
    //Create Asset Image Ojbect
    var asset = new Image(); 
    asset.src = assetfiles[i];  
    //Insert Asset Image in Asset Image Array
    assets.push(asset);        
    //Assign Imgae Load Event
    asset.onload = onAssetLoadComplete;      
  } 
}

 

페이지가 로딩되면 제일 처음 실행될 초기화 함수에서는 HTML DOM에서 Canvas 요소를 선택하고 총 19개의 캐릭터 이미지를 파일을 불러와서 이미지 객체를 생성하여 assets 배열에 담는다. 실제 웹 환경에서는 이미지 다운로드 시간에 지연이 있을 수 있으므로 이미지 로드가 모두 완료된 후 다음 로직을 수행해야 한다. 이미지 로딩이 완료되면 발생하는 onload 이벤트에 onAssetLoadComplete 함수를 할당한다.

 

onAssetLoadComplete 함수 코드는 다음과 같다.

function onAssetLoadComplete(){   
   //Check Load Complete of All Images
   if(++currentAssetLoadCount >= assetfiles.length){ 
      //Create Character Instance    
      character = new Character(assets,canvasElement);
      //Run Game Loop     
      setInterval(animationLoop, 1000 / fps);   
 }
}

 

function animationLoop(){
     character.startAnimation();
} 

 

이 함수에서는 모든 캐릭터 이미지가 로딩 완료되었는지 체크하고 완료되었다면 캐릭터 객체를 생성하고 setInterval() 함수로 반복 루프를 시작시킨다. setInterval() 함수는 반속 실행을 위한 시간 간격을 밀리세컨트 단위로 설정하게 되는데 1000/fps 즉 1000/30은 0.33초 마다 함수를 수행하라는 의미가 되므로 결과적으로 1초에 30번 Character 객체의 startAnimation() 함수가 수행시키게 된다.

 

그리고 마지막으로 페이지가 로딩되면 초기화 함수가 수행될 수 있도록 이벤트를 연결시킨다.

window.addEventListener("load", init, false);

 

 

실행화면

코드를 모두 작성하고 HTML5를 지원하는 브라우저(크롬 or 사파리)로 확인하면 로봇 캐릭터가 움직이는 애니메이션을 확인할 수 있다. 다음 그림은 화면을 캡쳐한 것이다.

 

마무리 하며...

이번 글에서는 UDACITY 강의를 기반으로 HTML5 기반의 애니메이션 처리를 살펴봤다. 여기서는 총 19개에 달하는 각각의 캐릭터 이미지를 사용했지만 실제 게임 개발에서는 이렇게 많은 이미지를 사용한다는 것은 매우 비효율적인 것이 된다. 그래서 대부분 Image Sprite 라는 기법을 이용해 모든 에셋이 포함된 하나의 이미지를 기반으로 필요한 에셋만 잘라내서 활용하는 방식이 사용된다. 또한 이러한 애니메이션 처리를 위한 오픈소스 라이브러리도 많이 존재한다. 다음 글에서는 Image Sprite 기법과 애니메이션 라이브러리를 사용하여 애니메이션을 구현하는 기법을 알아보자.

 

참고> 이 글에서 사용된 게임 에셋 이미지(UDACITY 이미지) 다운로드 경로

=> https://www.udacity.com/media/js/standalone/libs/gamedev_assets/robowalk/robowalk01.png

 

 

 

'모바일 > HTML5' 카테고리의 다른 글

[HTML5 Game] Character Animation Using Trident.js  (3) 2013.09.17
[HTML5 Game] Character Animation Using Sprites  (0) 2013.09.17
CSS3 3D Effect  (0) 2013.08.02
...  (0) 2013.07.23
HTML5 개발을 도와주는 도구들  (4) 2010.11.01

submit

CSS3 3D Effect

Posted in 모바일/HTML5 // Posted at 2013. 8. 2. 18:55

CSS3 만으로 이런 UI가 가능하다뉘... 놀~라~울 따름이다

 

소스를 다운받아서 보면,

CSS3의 TransformTransition만으로 3D 효과 및 애니메이션을 구현한 것을 확인할 수 있다

 

멋쪄부러~

 

http://tympanus.net/codrops/2013/08/01/3d-effect-for-mobile-app-showcase/

Demo: http://tympanus.net/Development/3DEffectMobileShowcase/

 

참고: [CSS3] Transform   [CSS3]Transition

 

 

 

그리고 하나 더... !

 

이미지를 사용하지 않고, CSS3를 활용한 다양한 버튼 스타일 !

http://alexwolfe.github.io/Buttons/

 

 

 

'모바일 > HTML5' 카테고리의 다른 글

[HTML5 Game] Character Animation Using Sprites  (0) 2013.09.17
[HTML5 Game] Character Animation  (1) 2013.09.14
...  (0) 2013.07.23
HTML5 개발을 도와주는 도구들  (4) 2010.11.01
주요 브라우저 HTML5 지원 점수  (0) 2010.10.27

submit

...

Posted in 모바일/HTML5 // Posted at 2013. 7. 23. 07:52

http://www.columbia.edu/~sss31/html/html-mean.html

'모바일 > HTML5' 카테고리의 다른 글

[HTML5 Game] Character Animation  (1) 2013.09.14
CSS3 3D Effect  (0) 2013.08.02
HTML5 개발을 도와주는 도구들  (4) 2010.11.01
주요 브라우저 HTML5 지원 점수  (0) 2010.10.27
어도비, HTML5 디자인 개발툴 엣지(Edge) 공개  (0) 2010.10.26

submit

HTML5 개발을 도와주는 도구들

Posted in 모바일/HTML5 // Posted at 2010. 11. 1. 10:38

소프트웨어 개발의 생산성은 개발 도구에 많이 의존한다.
흔히 개발도구는 삽 대신 포크레인으로 땅을 빠는 것과 비교된다. 그 만큼 개발 효율성을 높인다는 예기이다

HTML5 기반의 개발 역시 우수한 도구가 지원되면 개발의 생산성 향상은 물론이며 아직 표준이 완성되지 않아 업계 불안감이 내재된 특수성에도 긍정적인 효과를 줄 수 있다.

이 글에서는 지금까지 발표된
HTML5 개발 도구들을 정리해 볼까 한다

Adobe Edge
얼마전 블로그를 통해 소개했었다. 어도비에서 HTML5 개발 플랫폼을 공개했다.
기존 툴에서의 컨버팅 내보내기 같은 포팅 기능이 아니라 자체적인 HTML5 개발툴이다.
아직 본 모습은 보지 못했지만 개인적으로 매우 기대하고 있는 툴이기도 하다
: 어도비, HTML5 디자인 개발툴 엣지(Edge) 공개
: Adobe vows the "best" HTML5 tools

Flash To HTML5
아이폰 등장으로 가장 곤혹을 치런 것은 플래시이다. 잡스의 공공연한 비판과 HTML5 지원세에 어도비가 좀 흔들렸드랬다. HTML5 등장으로 가장 민감했을 것 같은 플래시가 HTML5 변환 기능을 제공하기로 했다
: 어도비, 플래시→HTML5 변환툴 공개
 

일러스트레이트, HTML5 Pack
얼마전 작성했던 원소스 멀티플랫폼을 위한 기술적 현황 에서도 소개한 바 있다
일러스트레이트에서도 결과물을 HTML5 관련 기술로 변환하는 일종의 포팅기능을 제공하기로 했다
: 어도비 일러스트레이터, HTML5 Pack 배포


드림위버, HTML5 Pack
웹 페이지 개발 도구로 꽤 유명한 어도비의 드림위버에서도 HTML5를 지원한다
HTML5 문서 타입과 태그를 지원하며 HTML5 기반 동영상 표현을 위한 확장 위젯도 제공된다
: 어도비, HTML5 지원에 날개를 펴다


Aptana Studio
개인적으로는 잘 몰랐지만 웹 클라이언트 개발자들에게 꽤 유명한 개발툴인 Aptana 에서도 HTML5 개발을 지원하게 된다. HTML5 용 태그의 자동완성과 브라우저 지원현황 등이 표시된다
: Aptana, HTML5를 지원하는 웹 개발 툴


Sencha Animator
HTML5 스펙과 조금 무관할 수 있으나 CSS3 역시 HTML5 계열(?)로 종종 같이 소개된다
CSS3 기반의 에니메이션 제작 툴이다.
: CSS3 애니메이션 생성기 - Sencha Animator


기타 (개발을 도와주는 유틸리티)
직접적인 개발 툴이나 포팅툴은 아니지만 HTML5기반 콘텐트 개발시 유용하게 사용될 많은 유틸리티가 제공된다.
이 블로그에서도 한번씩 언급한 내용이지만 다시 한번 모아 둔다
: jQuery Visualize, HTML5 차트 라이브러리 소개
: RGraph, HTML5 그래프 라이브러리 소개
: Modernizr 라이브러리: HTML5, CSS3 새요소 지원여부 검사
: Raphael, 자바스크립트 (벡터) 그래픽 라이브러리
: Gordon, 자바스크립트로 만든 플래시 런타임


여기까지가 개인적으로 알고 있는 HTML5 관련 개발툴이며 미처 소개하지 못한 다른 제품도 있으리라 본다.
중간중간에 새로 알게 되는 유용한 개발도구가 있다면 계속해서 블로그에 추가할 예정이다

'모바일 > HTML5' 카테고리의 다른 글

CSS3 3D Effect  (0) 2013.08.02
...  (0) 2013.07.23
주요 브라우저 HTML5 지원 점수  (0) 2010.10.27
어도비, HTML5 디자인 개발툴 엣지(Edge) 공개  (0) 2010.10.26
[CSS3] Media Queries  (0) 2010.10.25
Tags html5

submit

주요 브라우저 HTML5 지원 점수

Posted in 모바일/HTML5 // Posted at 2010. 10. 27. 10:42

이전에 브라우저별 HTML5 호환성 점수를 살펴 본 적이 있다
=> 브라우저의 HTML5 호환성 점수

현 시점에 주요 브라우저들이 최신 버전을 속속 내 놓고 있다
브라우저들의 HTML5 지원 점수를 계산해 준 글이 있어 소개한다
: HTML5: Internet Explorer 9 (IE9) vs. Google Chrome 8 vs. Firefox 4 vs. Opera 11 vs. Safari 5



Internet Explorer 8 – 32
Internet Explorer 9 Beta – 80
Firefox 3.6.10 – 145
Firefox 4 Beta 6 – 235
Google Chrome 7.0.517.41 – 248
Google Chrome 8.0.552.11 Beta – 262
Opera 11 Alpha – 223
Opera 10.63 – 203
Safari 5.0.2 – 178
WebKit r70433 – 196

377 만점 기준으로 나온 점수이다
크롬 브라우저가 가장 높은 점수를 보이며 기대했던 IE9 는 베타라고는 하지만 예상보다 실망스럽다

'모바일 > HTML5' 카테고리의 다른 글

...  (0) 2013.07.23
HTML5 개발을 도와주는 도구들  (4) 2010.11.01
어도비, HTML5 디자인 개발툴 엣지(Edge) 공개  (0) 2010.10.26
[CSS3] Media Queries  (0) 2010.10.25
2011년 8개 IT 메가 트렌드, HTML5 역할 언급  (0) 2010.10.21
Tags html5

submit
기사원문: 어도비, HTML5 콘텐츠 플랫폼 공개...'양다리 걸치기'?

아... 듣던 중 반가운 소리다. 드디어 HTML5 도 디자인 개발툴이 나온다뉘...
개인적으로 매우 목말라 있던 사건이다

누군가 빵!~ 하고 터뜨리기를 기대하고 있었는데,
예상보다 빨리 그것도 HTML5 와 기술 경쟁 위치에 있는 어도비가 터뜨릴 줄이야...


플래시 CS5 를 통한 iOS 변환 기능에 이은 HTML5 그래픽 도구까지!!!
이 모든것이 어도비 자사의 이익을 위한 결정이겠지만, 훌륭하다!

양다리든 뭐든 상관없다. 훌륭한 결정이다.

MS의 실버라이트, 어도비의 플래시와 같은 RIA 개발 업체의 (어쩔수 없는?) HTML5 사랑?이 엿보인다 ㅎ

나. 어도비를 사랑?하게 될 것만 같은 ㅎㅎㅎ.. 플래시 개발자도 아닌데 말이쥐...

HTML5 컨텐츠를 쉽고 빠르게 개발할 수 있는 디자인 툴은 반드시 필요하며 이 툴의 보급은
HTML5의 성장에 큰 도움이 될 것으로 본다

이제 HTML5 날코딩은 안뇽!~~~
Tags html5

submit

[CSS3] Media Queries

Posted in 모바일/HTML5 // Posted at 2010. 10. 25. 12:10
멀티 스크린 시대에 걸맞는 CSS 의 기능이다

CSS3에서는 출력되는 미디어의 종류와 조건에 맞도록 스타일을 설정할 수 있는 Media Query 라는 것을 제공한다. 이미 CSS2 에서 스크린모드(screen) 와 프린트모드(print)에 따른 서로 다른 출력 스타일을 지정할 수 있는 Media Type이 제공되었으나 세세한 조정을 할 수 없어 활용도가 높지 않았다고 한다.

그러나 CSS3에서 개선된 Media Query는 보다 더 세밀한 설정이 가능해 높은 활용도가 기대된다
특히 요즘처럼 멀티 디바이스, 멀티 스크린 시대에는 더욱 그 활용가치가 높지 않을까 생각한다

이에 대한 이론적 내용과 사용법은 W3C와 다른 훌륭한 블로그의 글을 링크함으로 대신 하려 한다
http://www.w3.org/TR/css3-mediaqueries/
http://manyoung.tistory.com/tag/media%20query
http://www.1stwebdesigner.com/tutorials/how-to-use-css3-orientation-media-queries/
http://firejune.com/1580
http://www.webdesignerwall.com/tutorials/css3-media-queries/


미디어쿼리가 적용된 데모는 다음의 링크에서 확인할 수 있다
지원되는 브라우저에서 창 크기를 조절하면서 확인해 보기 바란다

http://disruptive-innovations.com/zoo/hmo/CSSMQdemo.html
http://test.unintentionallyblank.co.uk/media.html
http://css-tricks.com/examples/ResolutionDependantLayout/example-one.php
http://ie.microsoft.com/testdrive/HTML5/85CSS3_MediaQueries/

submit