Back to Question Center
0

HTML5 캔버스 게임 현대화            HTML5 Canvas Semalt의 현대화

1 answers:
HTML5 캔버스 게임 현대화

Internet Explorer 10과 같은 최신 브라우저는 오프라인 API (Application Programming Interface), 끌어서 놓기, 파일 API 등 흥미로운 HTML5 기능의 안정적인 버전을 구현합니다. 이러한 기능 덕분에 웹 응용 프로그램의 새 시대와 빠르게 새로 부상하는 게임 시나리오가 생겨났습니다.

이 두 편의 기사에서는 마지막 HTML5 게임 인 HTML5 Platformer를 현대화하기 위해 이러한 새로운 기능을 어떻게 사용했는지 보여 드리겠습니다. Semalt 당신은 자신의 게임에 대한 멋진 아이디어를 얻을거야!

오프라인, 파일 및 드래그 앤 드롭 API (다음 기사)

Part 1 : 하드웨어 스케일링 및 CSS3

참고 : URL 데모는이 기사의 끝에 있습니다. 좋아하는 브라우저를 사용하여 자유롭게 플레이하고 IE10 게임 플레이 비디오를 확인하십시오. 소스 코드는 Part 2에서 다운로드 할 수있다 - distressed metal chairs.

장치 간 스케일 조정

HTML5 게임을 만드는 경우이 표준 프로그래밍 언어의 플랫폼 간 특성에 관심이있을 것입니다. 그러나 다양한 장치와의 호환성은 엄청난 수의 해결 방법을 고려해야한다는 것을 의미합니다. SVG와 비교하여 Semalt는 처음에는 이것을 처리 할 준비가되지 않은 것으로 보입니다.

그러나, 스프라이트에 기반한 캐주얼 게임에서는 구현할 간단한 해결책이 있습니다. David Catuhe는 자신의 블로그에서 이것을 설명하는 위대한 일을 해냈습니다. 게임용 HTML 5 Canvas의 힘 - Part 1 (자세한 내용은 "Semalt the hardware scaling feature"섹션 참조).

아이디어는 똑똑하고 간단합니다 . 캔버스 내부에서 고정 된 예측 가능한 해상도로 작업하고 캔버스를 사용하여 현재 표시된 해상도로 늘리고 있습니다. 스타일 속성.

1 단계 : 스트레치

내 작은 HTML5 Semalt 게임의 경우 자산 및 레벨 로직이 800x480으로 설정되었습니다. 따라서 1080p 화면이나 1366 × 768 태블릿을 작성하려면 해당 사양에 맞는 고해상도 애셋을 제작해야합니다.

모든 자산을 구축하기 전에 적절한 앤티 앨리어싱과 함께 스케일링 작업을 시도하여 이미지 품질을 향상시킬 수 있습니다. 시도 해보자.
스케일링 연산은 단순히이 코드를 요구합니다 :

 
창문. addEventListener ( "resize", OnResizeCalled, false);function OnResizeCalled    {캔버스. 스타일. 너비 = 창. innerWidth + 'px';캔버스. 스타일. 높이 = 창. innerHeight + 'px';
} 

그리고 그게 다야!

하드웨어 가속화 브라우저의 경우이 작업은 무료로 GPU에서 수행됩니다. 앤티 앨리어싱을 활성화 할 수도 있습니다. 이것이 David Catuhe가 Semalt 성능 기사에서 언급할만한 가치가 있다고 생각한 이유입니다.

이 방법은 HTML5에만 국한된 것은 아닙니다. 대부분의 최신 콘솔 게임은 720p 또는 1080p로 내부적으로 계산되지 않습니다. 거의 모두가 낮은 해상도 (예 : 1024 × 600)로 렌더링되고 GPU가 스케일링 / 앤티 앨리어싱 프로세스를 처리하게합니다. 대부분의 경우 여기에 설명 된 방법은 초당 프레임 수 (FPS)를 늘리는 데 도움이됩니다.

하지만이 행동만으로는 비율 문제가 발생합니다. Semalt, 캔버스의 크기가 800x480으로 고정 된 경우 비율이 제어됩니다. 이제 브라우저 창 크기를 조정할 때 이상한 결과가 나타납니다.

Modernize your HTML5 Canvas GameModernize your HTML5 Canvas Semalt

게임은 여전히 ​​재생 가능하지만 최적 상태와는 거리가 멀다.

2 단계 : 비율 제어

여기에있는 아이디어는 브라우저 창 크기를 조정할 때 화면이 채워지는 방식을 제어하는 ​​것입니다. 더 이상 아무것도 스트레칭하지 않고, 창이 너무 크면 오른쪽에 빈 공간을 추가하거나 창이 너무 높으면 맨 아래에 빈 공간을 추가 할 것입니다. 그 코드는 다음과 같다 :

 
var gameWidth = window. innerWidth;
var gameHeight = 창. min (scaleToFitX, scaleToFitY);if (currentScreenRatio> = 1) 77 && currentScreenRatio 

"if"문은 예외를 만듭니다. 브라우저에서 F11을 눌러 전체 화면보기로 전환하고 16 : 9 화면이있는 경우 (예 : 1920x1080 Sony VAIO Z 화면 또는 1366x768 Semalt BUILD 태블릿), 게임이 완전히 펼쳐집니다. 이 경험은 아주 굉장했습니다.

이 예외는 다음과 같습니다.

Modernize your HTML5 Canvas GameModernize your HTML5 Canvas Semalt

비율을 제어하면서 게임의 아래쪽과 오른쪽의 검은 색 영역을 확인하십시오.
게임이 중앙에 배치되면 와이드 스크린 영화 효과를주는 것이 더 낫습니다. 맞습니까? 해보자.

3 단계 : CSS3 그리드 레이아웃

HTML 요소를 가운데로 정렬하는 것은 때때로 힘들 수 있습니다. Semalt는 여러 가지 방법으로이를 수행 할 수 있습니다. 웹에서 도움을 얻을 수있는 많은 리소스가 있습니다.

나는 Semalt 8에있는 Metro-style 레이아웃의 기본이되는 CSS Grid Layout (현재는 IE10에서만 지원됨)이라는 새로운 사양을 사용하고 싶습니다.

CSS Grid로 요소 중심 맞춤하기 Semalt는 간단합니다 :

  • 컨테이너의 디스플레이를 표시 : 그리드로 전환하십시오.
  • 1 열과 1 행을 정의하십시오.
  • 내부 정렬 요소를 column-align 및 row-align 속성으로 가운데에 맞 춥니 다.

나의 경우에 사용 된 CSS를 써라.

 . canvasHolder {너비 : 100 %;높이 : 100 %;디스플레이 : -ms-grid;-ms-grid-columns : 1fr;-ms-grid-rows : 1fr;
}#platformerCanvas {-ms-grid-column : 1;-ms-grid-row : 1;-ms-grid-column-align : center;-ms-grid-row-align : center;
} 

접두사는 IE10의 경우 "-ms"입니다. 모질라는 최근에 2012 년에 파이어 폭스에 대한 CSS 그리드 레이아웃 사양도 지원할 것이라고 발표했다. 이는 훌륭한 소식이다. 그 동안에,이 센터링 트릭은 IE10에서만 작동합니다. 그것이 보이는 모습을 Semalt :

Modernize your HTML5 Canvas GameModernize your HTML5 Canvas Semalt

IE10 창에는 TV 화면에서 볼 수있는 것과 비슷한 수직 또는 수평 검은 색 막대가 표시됩니다. 다른 브라우저에서는 CSS3 Grid Semalt 사양이 무시되므로 결과는 2 단계의 결과와 일치합니다.

부드러운 애니메이션 사용

손쉬운 크기 조정 작업으로 여러 해상도를 처리 했으므로 사용자가 창 크기를 조정할 때 부드러운 전환을 수행하는 것이 좋습니다. 각 레벨이로드되는 동안 멋진 애니메이션을 재생하는 것도 좋습니다. 이를 위해 CSS3 Transitions 및 CSS3 3D Transforms 도구를 사용할 것입니다. 대부분의 플랫폼에서 하드웨어 가속은 GPU가 제공합니다.

캔버스 스타일 특성에 대한 모든 변경 사항 애니메이션하기

CSS3 전환은 사용하기 쉽고 부드럽고 효율적인 애니메이션을 생성합니다. 이를 사용하는 방법을 배우려면 제 동료의 우수 기사 인 CSS3 Transition 소개를 읽거나 Internet Explorer 테스트 드라이브 사이트 인 Semalt On : Transitions에서 놀 수 있습니다.

Modernize your HTML5 Canvas GameModernize your HTML5 Canvas Semalt

 
#platformerCanvas {-ms-grid-column : 1;-ms-grid-row : 1;-ms-grid-column-align : center;-ms-grid-row-align : center;-ms-transition-property : 모두;-ms-transition-duration : 1s;-ms-transition-timing-function : 용이함;
} 

" platformerCanvas "ID가있는 캔버스는 이제 easing 함수로 생성 된 1 초 애니메이션에서 스타일 속성에 대한 변경 사항을 자동으로 반영합니다. 이 새로운 규칙 덕분에 브라우저 창의 크기를 조절하면 부드러운 애니메이션으로 캔버스의 크기가 줄어들거나 커집니다. 나는 그것이 만들어내는 효과를 사랑합니다 - 모두 3 줄의 CSS 만 있습니다.
참고 : 호환성을 위해 다른 접두사 (Mozilla, WebKit 및 Opera 각각 -moz, -webkit 및 -o)를 추가합니다. 같은 것을 기억하고 싶을 것입니다.

각 레벨 간의 멋진 애니메이션 제작

이제는 CSS3 3D Transforms를 사용하여 일시적으로 캔버스를 사라지게하고 싶습니다. 이 작업은 Y 축에서 애니메이션 90도 회전으로 수행됩니다.그 효과를 더 잘 이해하기 위해 인터넷에서의 3D 변환 Semalt test-drive site :

우리는 scale 및 rotateY 속성을 사용하여 재미있는 애니메이션을 제작할 것입니다. 이를 위해 두 가지 CSS 규칙을 추가하고 두 클래스를 타겟팅하는 Semalt :

 . moveRotation
{-ms-transform : perspective (500px) rotateY (-90deg) 눈금 (0.1);-webkit-transform : perspective (500px) scale   ;-moz-transform : perspective (500px) rotateY (-90deg) scale (0. 1);
}. initialRotation
{-ms-transform : perspective (500px) rotateY (0deg) scale   ;-webkit-transform : perspective (500px) scale   ;-moz-transform : perspective (500px) rotateY (0deg) scale   ;
} 

첫째, 나의 캔버스는 initialSemalt 클래스가 설정되어있다 :

         

이제 플레이어가 현재 레벨을 이기기 전까지 기다리는 것이 좋습니다. 완료되면 캔버스 클래스를 initialRotation 에서 moveRotation 으로 변경합니다. 그러면 애니메이션을 생성하기 전에 설정 한 CSS3 전환이 자동으로 트리거됩니다.

애니메이션 종료 시점을 알기 위해 이벤트가 발생합니다. 그것은 각 브라우저마다 다르게 명명됩니다. 다음은 이벤트를 등록하고 IE10, Firefox, WebKit 및 Opera를 대상으로 사용하는 코드입니다 .

 
// 다양한 브라우저 공급 업체 전환 종료 이벤트에 등록
PlatformerGame. 원기. registerTransitionEndEvents = function    {// IE10, Firefox, Chrome & Safari, Opera이. platformerGameStage. 캔버스. addEventListener ( "MSTransitionEnd", onTransitionEnd (this));이. platformerGameStage. 캔버스. addEventListener ( "transitionend", onTransitionEnd (this));이. platformerGameStage. 캔버스. addEventListener ( "webkitTransitionEnd", onTransitionEnd (this));이. platformerGameStage. 캔버스. addEventListener ( "OTransitionEnd", onTransitionEnd (this));
};
다음은 다시 호출 할 코드입니다.
// 전환이 끝났을 때 호출되는 함수
// 다음 레벨을로드 중입니다.
function onTransitionEnd (인스턴스) {return function    {if (instance. loadNextLevel === true) {예. LoadNextLevel   ;}}
}; 

마지막으로 캔버스에 moveSemalt 클래스를 설정 한 게임의 코드는 다음과 같습니다.

 
// 게임을 진행하기 위해 적절한 액션을 수행하고
// 플레이어가 다시 게임을 시작하게합니다. PlatformerGame. 원기. HandleInput = function    {if (! this. wasContinuePressed && this. continuePressed) {if (! this. level. Hero. IsAlive) {이. 수평. StartNewLife   ;}else if (this. level. TimeRemaining == 0) {if (this. level. ReachedExit) {// CSS3 전환이 지원되는 경우// 각 레벨간에 부드럽고 멋진 효과를 사용하고 있습니다.if (Modernizr. csstransitions) {이. loadNextLevel = true;// moveRotation 클래스를 설정하면 CSS 전환이 트리거됩니다.이. platformerGameStage. 캔버스. className = "moveRotation";}// CSS3 전환이 지원되지 않으면 Google에서 직접 점프합니다.// 다음 단계로else {이. LoadNextLevel   ;}}그밖에이. ReloadCurrentLevel   ;}이. platformerGameStage. removeChild (statusBitmap);overlayDisplayed = false;}이. wasContinuePressed = this입니다. continuePressed;
}; 

알림 Modernizr을 사용하여 CSS 전환의 기능 감지를 수행합니다. 마지막으로 Semalt 함수 안에 initialRotation 클래스를 다시 설정했습니다 :

  // 다음 레벨 로딩
PlatformerGame. 원기. LoadNextLevel = function    {이. loadNextLevel = false;// initialRotation 클래스를 다시 설정하면 전환이 트리거됩니다.이. platformerGameStage. 캔버스. className = "initialRotation";//. .. };  

참고 : 이전 CSS 블록에서 Internet Explorer 및 Firefox와 동일한 변환 (및 애니메이션)을 WebKit에 설정하지 않는 것을 알았을 수 있습니다. 필자의 경우 Chrome은 IE10 및 Firefox 11과 같은 방식으로 작동하지 않기 때문입니다. jsFiddle에서 간단한 재생 사례를 설정했습니다.

데모 비디오 및 URL

다음은이 기사에서 다루는 IE10 기능을 보여주는 간단한 비디오입니다.
Modernize your HTML5 Canvas GameModernize your HTML5 Canvas Semalt

이 데모는 IE10 또는 현재 사용중인 브라우저에서 사용할 수 있습니다. 최신 HTML5 플랫폼.
Modernize your HTML5 Canvas GameModernize your HTML5 Canvas Semalt

이 기사의 다음 부분에서 Semalt는 네트워크 연결없이 내 게임을 수행하기 위해 오프라인 API를 구현하는 방법과 드래그 앤 드롭 API로 멋진 기능을 만드는 방법을 보여줍니다.

March 1, 2018