html5+js with game engine cocos2d-html5 분석 @kgc2012

82
JS+html5 with Game engine cocos2d-html5 분석 ANBSoft 게임공학기술연구소 송찬호 [email protected] twitter : copperwhale

Upload: chanho-song

Post on 13-Jan-2015

3.803 views

Category:

Technology


11 download

DESCRIPTION

KGC 2012 에서 발표한 내용입니다. 질문이 있으시면 메일이나 트윗 주세요.

TRANSCRIPT

Page 1: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

JS+html5 with Game engine

cocos2d-html5 분석

ANBSoft게임공학기술연구소 송찬호

[email protected] : copperwhale

Page 3: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Cocos2D

Page 4: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d

2D 게임 같은 인터렉티브 어플리케이션을 만들기 위한 오픈 소스 프레임워크

Page 5: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d 기본 컨셉

1. CocosNode2. Director3. Scene4. Layer5. Sprite6. Action

Page 6: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d 기본 컨셉 - CocosNode

cocos2d의 모든 클래스가 CocosNode를 상속 하여 구현

● position, scale, visible 등 기본 속성● 계층 구조를 위한 add, remove, reorder● schedule 기능

Page 7: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d 기본 컨셉 - Director

어플리케이션을 구성하는 여러 Scene들 가운데 무엇이 활성화 되는지 흐름을 관리

Page 8: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d 기본 컨셉 - Scene

스테이지 나 타이틀 처럼 어플리케이션의 흐름의 독립적인 한 부분을 정의하는 단위

Page 9: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d 기본 컨셉 - Layer

화면을 구성하는 단위로 하나 이상의 Layer를 정의하여 하나의 Scene을 구성

Page 10: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d 기본 컨셉 - Sprite

이동, 회전, 크기변환, 애니메이션 등을 적용할 수 있는 2D 이미지

Page 11: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d 기본 컨셉 - Action

CocosNode 객체(Scene, Layer, Sprite 해당 됨)에 position, rotation, scale 등과 같이 객체의 속성을 시간에 따라 변경하는 것을 처리

Page 12: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d의 가족

cocos2d +cocos2d-iphone +cocos2d-android +cocos2d-javascript +cocosBuilder +cocos2d-x +cocos2d-html5 <- !!!

Page 13: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d-html5

Page 14: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d-html5

현재 버전은 2.0

● files must load from HTTP server● Google Closure Compiler surpport● Unified Javascript API style● DOM Menu/UI● Updated API to Cocos2d-x V2.0

Page 15: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Google Closure Compiler - 1

Javascript를 최적화 해서 브라우져에서 다운로드와 실행 속도를 향상

Page 16: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Google Closure Compiler - 2

"Advanced mode" 적용

● 게임 로직과 묶어서 하나의 파일로 패키징 가능

● 코드 최소화(주석 및 비칸 제거 등)● 사용하지 않는 코드 제거● 코드 난독화

Page 17: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

DOM Menu / UI

html DOM 방식으로 메뉴 구성 가능

● 정적인 메뉴를 구성시 매 프레임 다시 그리지 않아 속도향상

● 텍스트 출력 속도 향상

Page 18: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Unified Javascript API style

cocos2d-iphone 및 cocos2d-x의 JS-Binding의 스크립트와 cocos2d-html5 코드가 같음

For example:var sprite = cc.Sprite.spriteWithFile(s_grossini_dance_atlas, cc.RectMake(x, y, 85, 121)); //is changed to...var sprite = cc.Sprite.create(s_grossini_dance_atlas, cc.RectMake(x, y, 85, 121));

Page 19: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d-x 와 cocos2d-html5 1/2

cocos2d-x 기반 제작

비슷한 구조로 비교 분석이 쉽다.

● Cocos2d-html5-v2.0.zip 안의 cocos2d폴더와 cocos2d-2.0-x의 cocos2dx 폴더가 비슷한 구조로 구성 되어 있음

Page 20: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d-x 와 cocos2d-html5 2/2

Page 21: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

라이브러리 구성

cocos2d-x● cocos2dx 폴더 내부의 cpp를 컴파일 .lib나 .

a 등 라이버러리 생성

cocos2d-html5● cocos2d 폴더 내부의 js 파일을 google

closure compiler 로 라이브러리 js파일 생성

Page 22: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Cocos2d-html5-v2.0.min.js

Page 23: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

SampleHello HTML5 World

Page 24: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

HelloHTML5World

Page 25: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

게임의 구성

html 파일 + js 파일 로 구성

● html 파일은 canvas 정의 - id와 크기 지정● js 파일은 어플리케이션 로직 및 엔진

Page 26: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

파일 구성

index.html - 캔버스 정의 및 cocos2d.js 로딩

cocos2d.js - 엔진 초기화 및 게임 코드 파일 로딩

main.js - 엔진에 게임 객체 생성 및 전달

resource.js - 리소스 목록 정의

myApp.js - 'Hello World' 메시지 및 이미지 출력

build.xml - google closure compiler를 이용한 통합 파일 생성을 위한

ant 빌드 스크립트

Page 27: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

html 파일 - index.html

x

Canvas 정의

JS 호출

Page 28: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

JS 파일 - cocos2d.js 1/2

엔진 정보 설정

게임 로딩 정보 설정

Page 29: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

JS 파일 - cocos2d.js 2/2

패키지 및 엔진 로딩 방법 정의

게임의 코드 파일 목록

Page 30: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

JS 파일 - main.js 1/3

게암 객체 생성

게임 객체 정의

Page 31: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

JS 파일 - main.js 2/3

엔진 초기화

디렉터 초기화 (AppDelegate)

Page 32: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

JS 파일 - main.js 3/3

게임 초기화 완료

게임의 시작 씬

Page 33: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

JS 파일 - resource.js

리소스 과련 매직 넘버 정의

전체 리소스 목록

Page 34: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

JS 파일 - myApp.js 1/2

Hello World

종료 버튼

화면 갱신 알림

엔진 정보

엔진 로고

Page 35: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

JS 파일 - myApp.js 2/2

CircleSprite (화면 갱신 알림)

● 매 프레임 갱신되는 객체

● 기본 도형 그리는 함수로 그림

Helloworld (cc.Layer 확장)

● 종료 버튼 이미지 및 이벤트 정의

● 'Hello World' 문구, 화면 갱신 알림 및 엔진 로고 이미지 객체 생성 및 에이메이션 정의

HelloworldScene (cc.Scene 확장)

● Helloworld 레이어 생성 및 등록

Page 37: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

xml 파일 - build.xml 1/2

컴파일러 정의(google closure compiler)

컴파일 결과 정의

Page 38: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

xml 파일 - build.xml 2/2

엔진 소스 목록

게임 소스 목록

Page 39: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

ant 빌드 1/2

ant 빌드 실패

엔진 파일 목록에 존재하지 않는 파일이 있어 빌드 실패 <file name="keypad_dispatcher/CCKeypadDelegate.js"/>

<file name="keypad_dispatcher/CCKeypadDispatcher.js"/>

Page 40: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

ant 빌드 2/2

ant 빌드 성공

!! 정상적인 결과 파일을 만들기 위해 build.xml 을 수정해야 합니다. !! <file name="keypad_dispatcher/CCKeypadDelegate.js"/>

<file name="keypad_dispatcher/CCKeypadDispatcher.js"/>를

<file name="touch_dispatcher/CCTouchDelegateProtocol.js"/><file name="touch_dispatcher/CCTouchHandler.js"/>

<file name="touch_dispatcher/CCTouchDispatcher.js"/> <file name="keyboard_dispatcher/CCKeyboardDelegate.js"/>

<file name="keyboard_dispatcher/CCKeyboardDispatcher.js"/>로 수정해야 합니다.

Page 41: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

빌드 결과 - myApp-v0.1.js

Page 42: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

cocos2d-html5게임 시작 과정 분석

Page 43: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

boot engine - cocos2d-x win32 1/3

run() 호출

Page 44: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

boot engine - cocos2d-x win32 2/3

mainLoop() 호출

Page 45: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

boot engine - cocos2d-x win32 3/3

1. main.cppa. CCApplication::sharedApplication()->run();

2. platform/CCApplication.cpp - run()

b. applicationDidFinishLaunching()c. looping CCDirector::sharedSirector()->mainLoop()

Page 46: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

boot engine - cocos2d-html5 1/8

cocos2d.js 로딩

Page 47: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

boot engine - cocos2d-html5 2/8

엔진 및 게임 스크립트 파일 정의

DOM 로딩 완료

스크립트 로딩 (jsloader.js)

Page 48: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

boot engine - cocos2d-html5 3/8

엔진 로딩 목록

main.js 로딩 목록 추가

Page 49: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

boot engine - cocos2d-html5 4/8

리소스 로딩중 표시

로딩 완료 후 호출

Page 50: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

boot engine - cocos2d-html5 5/8

run() 호출

Page 51: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

boot engine - cocos2d-html5 6/8

mainLoop() 호출

mainLoop() 호출

applicationDidFinishLaunching() 호출

Page 52: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

1. index.htmla. cocos2d.js 로딩

2. cocos2d.jsb. 즉시 실행 함수에서 DOM로딩 직후 jsloader.js 로딩

3. jsloader.js - (여러 js을 읽는 경우)

c. 즉시 실행 함수에서 모든 엔진 코드 및 main.js 로딩

boot engine - cocos2d-html5 7/8

Page 53: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

4. main.js - ctor()

a. cc.Loader.shareLoader().onload 이벤트로 cc.AppController.shareAppController().didFinishLaunchingWithOptions() 호출

5. AppControl.js - didFinishLaunchingWithOptions()

b. cc.Application.sharedApplication().run();

6. CCApplication.js - run()

c. applicationDidFinishLaunching()d. looping cc.Director.getInstance().mainLoop();

boot engine - cocos2d-html5 8/8

Page 54: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

boot up 비교

cocos2d-x● 플랫폼 별 다른 엔트리 포인트에서 CCApplication.cpp

의 run() 호출● 윈도의 경우 platform/win32/CCApplication.cpp 의

run() 에서 mainLoop() 호출

cocos2d-html5● 엔진 및 어플리케이션 코드 로딩● 로딩 과정에서 즉시 실행 함수로 초기화● 로딩 완료 이벤트 수신 후 platform/CCApplication.js

의 run() 에서 mainLoop() 호출

Page 55: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

etc - 2개의 mainLoop() ??

mainLoop() 호출

mainLoop() 호출

Looping callback 등록

Looping callback 등록

Page 56: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

html5 - javascript게임 개발을 위한 기능들

Page 57: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

게임을 위한 Javascript 사용 패턴 1/2

모듈 패턴 - 네임스페이스 패턴, 즉시 실행 함수 등

상속 패턴 - 프로토타입 목록 및 객체 정보 복사를 이용

Page 58: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

게임을 위한 Javascript 사용 패턴 2/2

객체 상수 - 매직 넘버를 정의하기 위한 객체 정의 방법

...JavaScript Patterns - 자바스크립트 코딩 기법과 핵심 패턴

Page 59: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Display - Canvas

Page 60: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Display - WebGL

Page 61: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Display - Canvas vs WebGL

Canvas● 모든 시스템에서 지원● 상대적으로 느리지만 지속적으로 개선

WebGL● gles 2.0 과 비슷한 사양● Canvas에 비해 매우 빠르고 동작 한다면 호환성 이슈 적

음● WebGL tutorial - Opera 개발자(Erik Moller)● WebGL Terrain Editor

Page 62: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Display - performance test 1/2

2012-3-19 internet-explorer-10-fast-and-native-has-gone-to-other-browsers

Page 63: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Display - performance test 2/2

2011-11-18 html5-2d-gaming-performance-analysis

Page 64: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Display - cocos2d-html5

canvas 생성

Page 65: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Input

addEventHandler● 첫번째 인자로 원하는 이벤트를 지정

○ 'keyup', 'keydown'○ 'mousedown', 'mouseup', 'mousemove'○ 'touchstart', 'touchmove', 'touchend', 'touchcancel'

● 두번째 인자로 이벤트 처리 함수 지정● 세번째 인자로 캡쳐 방식의 이벤트 처리

○ 일반적인 경우 부모 객체에게 이벤트 전달○ 캡쳐 방식의 경우 부모객체에게 이벤트 전달을 하지

않음

Page 66: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Input - keyboard cocos2d-html5

키 이벤트 등록

Page 67: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Input - mouse cocos2d-html5

마우스 버튼 업 이벤트

마우스 버튼 누름 이벤트

마우스 이동 이벤트

Page 68: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Audio

Page 69: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Audio - codec in browser

Page 70: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Audio

현재● 단순한 기능● 메모리에 로딩된 사운드만 출력● 브라우져 별 지원 코덱 다름● 아이폰의 경우 전체 화면이 아닌 경우 출력되지 않음미래

● 기능 확장을 위한 다양한 시도중○ 스트리밍 처리에 대해 W3C 제안○ 하위 수준의 API 개발

Page 71: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Audio - cocos2d-html5

Page 72: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Network - Web socket

Page 73: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Network - Web socket client

Web socket - client● TCP 기반의 실시간 양방향 통신 가능● 다수의 사용자와 통신 가능● 사용하기 쉽다

안드로이드 계열에서는 지원하지 않음 ;;;

● iframe 나 Ajax 등 비동기 JS 계열의 기술을 이용

Page 74: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Network - Web socket server

Web socket - server● 기존 TCP 소켓 서버와 약간 다른 구현이 필요● 다양한 언어를 위한 오픈 소스 서버 프레임 존재

○ jwebsocket

○ pywebsocket

○ phpwebsocket

○ web-socket-ruby

○ socket.io-node

○ ...

Page 75: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

high performance

변수 선언 위치

성능 향상을 위한 코딩 패턴

...● Extreme JavaScript Performance

참고자료

● JavaScript 자바스크립트 성능 최적화

Page 76: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

multi browser

브라우져 마다 특성 다름...;;● 시각적 결과● 지원 기능● 성능

● 개개의 브라우져에 대응하도록 소스 코드 튜닝● 특정 브라우져만 지원, 해당 브라우져 설치 유도

Page 77: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

debug - html5 & javascript

Firefox - FirebugChrome - Chrome developer tool● 브레이크 포인터, 라인 단위 실행 등 디버깅 기능● 변수값 표시● 로그 출력● 성능 프로파일링● 호출 스텍 표시● 리소스 로딩 모니터링● 기타 등등

Page 79: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

IDE - cocosBuilder

Page 80: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

IDE - cocosBuilder

CocosBuilder 3 Animation Editor

Page 81: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

html5 - javascript그래서...

Page 82: Html5+js with game engine   cocos2d-html5 분석 @KGC2012

Q & A살살요 ... ^^ 굽신~