Gam   html5 with  e engineJS+cocos2d- html5 분석                   ANBSoft          게임공학기술연구소 송찬호              yellow@anbgam...
d game eng ine or libJ S+html5 an FlashJS                             LimeJS                     Jaws HTML5               ...
Cocos2D
cocos2d2D 게임 같은 인터렉티브 어플리케이션을 만들기 위한 오픈 소스 프레임워크
cocos 2d 기본 컨셉1.   CocosNode2.   Director3.   Scene4.   Layer5.   Sprite6.   Action
본 컨셉 - CocosNode   cocos2d 기cocos2d의 모든 클래스가 CocosNode를 상속하여 구현● position, scale, visible 등 기본 속성● 계층 구조를 위한 add, remove, ...
기본 컨셉 - Director  cocos2d어플리케이션을 구성하는 여러 Scene들 가운데 무엇이 활성화 되는지 흐름을 관리
- Scene  cocos 2d 기본 컨셉스테이지 나 타이틀 처럼 어플리케이션의 흐름의 독립적인 한 부분을 정의하는 단위
- Layer  cocos 2d 기본 컨셉화면을 구성하는 단위로 하나 이상의 Layer를정의하여 하나의 Scene을 구성
- Sprite  cocos 2d 기본 컨셉이동, 회전, 크기변환, 애니메이션 등을 적용할수 있는 2D 이미지
- Action   cocos 2d 기본 컨셉CocosNode 객체(Scene, Layer, Sprite 해당됨)에 position, rotation, scale 등과 같이 객체의 속성을 시간에 따라 변경하는 것을 처리
co cos2d의 가족cocos2d  +cocos2d-iphone   +cocos2d-android   +cocos2d-javascript   +cocosBuilder +cocos2d-x   +cocos2d-html5 ...
cocos2d-html5
coc os2d-html5현재 버전은 2.0●   files must load from HTTP server●   Google Closure Compiler surpport●   Unified Javascript API...
Closure Co mpiler - 1  GoogleJavascript를 최적화 해서 브라우져에서 다운로드와 실행 속도를 향상
Closure Co mpiler - 2  Google"Advanced mode" 적용● 게임 로직과 묶어서 하나의 파일로 패키징   가능● 코드 최소화(주석 및 비칸 제거 등)● 사용하지 않는 코드 제거● 코드 난독화
DOM M enu / UIhtml DOM 방식으로 메뉴 구성 가능● 정적인 메뉴를 구성시 매 프레임 다시 그리  지 않아 속도향상● 텍스트 출력 속도 향상
d Javascript API style            Uni      fie   cocos2d-iphone 및 cocos2d-x의 JS-Binding   의 스크립트와 cocos2d-html5 코드가 같음For ...
cocos2d -html5 1/2   cocos2d-x 와cocos2d-x 기반 제작비슷한 구조로 비교 분석이 쉽다.● Cocos2d-html5-v2.0.zip 안의 cocos2d폴더  와 cocos2d-2.0-x의 c...
cocos2d -html5 2/2cocos2d-x 와
라이 브러리 구성cocos2d-x● cocos2dx 폴더 내부의 cpp를 컴파일 .lib나 .  a 등 라이버러리 생성cocos2d-html5● cocos2d 폴더 내부의 js 파일을 google  closure com...
d-html5-v2 .0.min.jsCocos2
SampleHello HTML5 World
HelloH TML5World
게 임의 구성html 파일 + js 파일 로 구성● html 파일은 canvas 정의 - id와 크기 지정● js 파일은 어플리케이션 로직 및 엔진
파일 구성index.html -    캔버스 정의 및 cocos2d.js 로딩cocos2d.js -    엔진 초기화 및 게임 코드 파일 로딩main.js -   엔진에 게임 객체 생성 및 전달resource.js - ...
l 파일 - in dex.html    htm                             Canvas 정의x                                JS 호출
파일 - coc os2d.js 1/2JS                      엔진 정보 설정                   게임 로딩 정보 설정
파일 - coc os2d.js 2/2JS                   게임의 코드 파일 목록              패키지 및 엔진 로딩 방법 정의
JS 파일 - m ain.js 1/3                       게임 객체 정의                       게암 객체 생성
JS 파일 - m ain.js 2/3                        엔진 초기화               디렉터 초기화 (AppDelegate)
JS 파일 - m ain.js 3/3                       게임 초기화 완료             게임의 시작 씬
JS 파일 - r esource.js               리소스 과련 매직 넘버 정의                       전체 리소스 목록
파일 - myA pp.js 1/2  JS                Hello World화면 갱신 알림                     엔진 로고엔진 정보                         종료 버튼
파일 - myA pp.js 2/2    JSCircleSprite (화면 갱신 알림)● 매 프레임 갱신되는 객체● 기본 도형 그리는 함수로 그림Helloworld (cc.Layer 확장)● 종료 버튼 이미지 및 이벤트 ...
Hello HTM L5 World           hello HTML5 world
l 파일 - build.xml 1/2xm                          컴파일러 정의                     (google closure compiler)                     ...
l 파일 - build.xml 2/2xm                          엔진 소스 목록                          게임 소스 목록
ant 빌드 1/2                                                               ant 빌드 실패     엔진 파일 목록에 존재하지 않는 파일이 있어 빌드 실패     ...
ant 빌드 2/2                                                                     ant 빌드 성공   !! 정상적인 결과 파일을 만들기 위해 build.xml...
과 - myAp p-v0.1.js빌드 결
cocos2d-html5게임 시작 과정 분석
- cocos2d- x win32 1/3b oot engine                            run() 호출
- cocos2d- x win32 2/3b oot engine                        mainLoop() 호출
- cocos2d- x win32 3/3     b oot engine1. main.cpp  a. CCApplication::sharedApplication()->run();2. platform/CCApplication...
- cocos2d- html5 1/8b oot engine                       cocos2d.js 로딩
- cocos2d- html5 2/8b oot engine                        DOM 로딩 완료                       엔진 및 게임                      스크립트 ...
- cocos2d- html5 3/8b oot engine                        엔진 로딩 목록                   main.js 로딩 목록 추가
- cocos2d- html5 4/8b oot engine                      리소스 로딩중 표시                       로딩 완료 후 호출
- cocos2d- html5 5/8b oot engine                           run() 호출
- cocos2d- html5 6/8b oot engine               applicationDidFinishLaunching()                             호출             ...
- cocos2d- html5 7/8   b oot engine1. index.html  a. cocos2d.js 로딩2. cocos2d.js  b. 즉시 실행 함수에서 DOM로딩 직후 jsloader.js 로딩3. j...
- cocos2d- html5 8/8     b oot engine4. main.js - ctor()  a. cc.Loader.shareLoader().onload 이벤트로 cc.      AppController.sh...
boot up 비교cocos2d-x● 플랫폼 별 다른 엔트리 포인트에서 CCApplication.cpp  의 run() 호출● 윈도의 경우 platform/win32/CCApplication.cpp 의  run() 에서...
2개의 main Loop() ??      etc -                           mainLoop() 호출Loopingcallback 등록                mainLoop() 호출Loopin...
html5 - javascript게임 개 발을 위한 기능들
패턴 1/2     을 위한 Jav ascript 사용  게임모듈 패턴 -   네임스페이스 패턴, 즉시 실행 함수 등상속 패턴 -   프로토타입 목록 및 객체 정보 복사를 이용
패턴 2/2      을 위한 Jav ascript 사용   게임객체 상수 -    매직 넘버를 정의하기 위한 객체 정의 방법                      ... JavaScript Patterns - 자바스크...
Displa y - Canvas
Displa y - WebGL
lay - Canva s vs WebGL   DispCanvas● 모든 시스템에서 지원● 상대적으로 느리지만 지속적으로 개선WebGL● gles 2.0 과 비슷한 사양● Canvas에 비해 매우 빠르고 동작 한다면 호환...
performanc e test 1/2     Display -2012-3-19 internet-explorer-10-fast-and-native-has-gone-to-other-browsers
performanc e test 2/2Display -   2011-11-18 html5-2d-gaming-performance-analysis
D isplay - cocos2d-html5                           canvas 생성
InputaddEventHandler● 첫번째 인자로 원하는 이벤트를 지정  ○ keyup, keydown  ○ mousedown, mouseup, mousemove  ○ touchstart, touchmove, tou...
yboard coc os2d-html5Input - ke                          키 이벤트 등록
- mouse coc os2d-html5Input                    마우스 버튼 누름 이벤트                     마우스 버튼 업 이벤트                      마우스 이동 ...
Audio
io - codec in browserAud
Audio현재● 단순한 기능● 메모리에 로딩된 사운드만 출력● 브라우져 별 지원 코덱 다름● 아이폰의 경우 전체 화면이 아닌 경우 출력되지 않음미래● 기능 확장을 위한 다양한 시도중  ○ 스트리밍 처리에 대해 W3C 제...
A udio - cocos2d-html5
N etwork - W eb socket
o rk - Web so cket client    NetwWeb socket - client● TCP 기반의 실시간 양방향 통신 가능● 다수의 사용자와 통신 가능● 사용하기 쉽다안드로이드 계열에서는 지원하지 않음 ;;...
o rk - Web so cket server    NetwWeb socket - server● 기존 TCP 소켓 서버와 약간 다른 구현이 필요● 다양한 언어를 위한 오픈 소스 서버 프레임 존재  ○ jwebsocket...
high p erformance변수 선언 위치성능 향상을 위한 코딩 패턴...● Extreme JavaScript Performance참고자료● JavaScript 자바스크립트 성능 최적화
multi browser브라우져 마다 특성 다름...;;● 시각적 결과● 지원 기능● 성능● 개개의 브라우져에 대응하도록 소스 코드 튜닝● 특정 브라우져만 지원, 해당 브라우져 설치 유도
- html5 & javascript     debugFirefox - FirebugChrome - Chrome developer tool●   브레이크 포인터, 라인 단위 실행 등 디버깅 기능●   변수값 표시●   ...
IDE - C onstruct 2         Make HTML5 games with Construct 2
IDE - coc osBuilder
IDE - coc osBuilder          CocosBuilder 3 Animation Editor
html5 - javascript    그래서...
Q&A살살요 ... ^^ 굽신~
Upcoming SlideShare
Loading in...5
×

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

4,109

Published on

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

Published in: Technology
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,109
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
71
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

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

  1. 1. Gam html5 with e engineJS+cocos2d- html5 분석 ANBSoft 게임공학기술연구소 송찬호 yellow@anbgames.com twitter : copperwhale
  2. 2. d game eng ine or libJ S+html5 an FlashJS LimeJS Jaws HTML5 From : jswiki/Game-Engines
  3. 3. Cocos2D
  4. 4. cocos2d2D 게임 같은 인터렉티브 어플리케이션을 만들기 위한 오픈 소스 프레임워크
  5. 5. cocos 2d 기본 컨셉1. CocosNode2. Director3. Scene4. Layer5. Sprite6. Action
  6. 6. 본 컨셉 - CocosNode cocos2d 기cocos2d의 모든 클래스가 CocosNode를 상속하여 구현● position, scale, visible 등 기본 속성● 계층 구조를 위한 add, remove, reorder● schedule 기능
  7. 7. 기본 컨셉 - Director cocos2d어플리케이션을 구성하는 여러 Scene들 가운데 무엇이 활성화 되는지 흐름을 관리
  8. 8. - Scene cocos 2d 기본 컨셉스테이지 나 타이틀 처럼 어플리케이션의 흐름의 독립적인 한 부분을 정의하는 단위
  9. 9. - Layer cocos 2d 기본 컨셉화면을 구성하는 단위로 하나 이상의 Layer를정의하여 하나의 Scene을 구성
  10. 10. - Sprite cocos 2d 기본 컨셉이동, 회전, 크기변환, 애니메이션 등을 적용할수 있는 2D 이미지
  11. 11. - Action cocos 2d 기본 컨셉CocosNode 객체(Scene, Layer, Sprite 해당됨)에 position, rotation, scale 등과 같이 객체의 속성을 시간에 따라 변경하는 것을 처리
  12. 12. co cos2d의 가족cocos2d +cocos2d-iphone +cocos2d-android +cocos2d-javascript +cocosBuilder +cocos2d-x +cocos2d-html5 <- !!!
  13. 13. cocos2d-html5
  14. 14. coc os2d-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
  15. 15. Closure Co mpiler - 1 GoogleJavascript를 최적화 해서 브라우져에서 다운로드와 실행 속도를 향상
  16. 16. Closure Co mpiler - 2 Google"Advanced mode" 적용● 게임 로직과 묶어서 하나의 파일로 패키징 가능● 코드 최소화(주석 및 비칸 제거 등)● 사용하지 않는 코드 제거● 코드 난독화
  17. 17. DOM M enu / UIhtml DOM 방식으로 메뉴 구성 가능● 정적인 메뉴를 구성시 매 프레임 다시 그리 지 않아 속도향상● 텍스트 출력 속도 향상
  18. 18. d Javascript API style Uni fie 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));
  19. 19. cocos2d -html5 1/2 cocos2d-x 와cocos2d-x 기반 제작비슷한 구조로 비교 분석이 쉽다.● Cocos2d-html5-v2.0.zip 안의 cocos2d폴더 와 cocos2d-2.0-x의 cocos2dx 폴더가 비슷 한 구조로 구성 되어 있음
  20. 20. cocos2d -html5 2/2cocos2d-x 와
  21. 21. 라이 브러리 구성cocos2d-x● cocos2dx 폴더 내부의 cpp를 컴파일 .lib나 . a 등 라이버러리 생성cocos2d-html5● cocos2d 폴더 내부의 js 파일을 google closure compiler 로 라이브러리 js파일 생 성
  22. 22. d-html5-v2 .0.min.jsCocos2
  23. 23. SampleHello HTML5 World
  24. 24. HelloH TML5World
  25. 25. 게 임의 구성html 파일 + js 파일 로 구성● html 파일은 canvas 정의 - id와 크기 지정● js 파일은 어플리케이션 로직 및 엔진
  26. 26. 파일 구성index.html - 캔버스 정의 및 cocos2d.js 로딩cocos2d.js - 엔진 초기화 및 게임 코드 파일 로딩main.js - 엔진에 게임 객체 생성 및 전달resource.js - 리소스 목록 정의myApp.js - Hello World 메시지 및 이미지 출력build.xml - google closure compiler를 이용한 통합 파일 생성을 위한 ant 빌드 스크립트
  27. 27. l 파일 - in dex.html htm Canvas 정의x JS 호출
  28. 28. 파일 - coc os2d.js 1/2JS 엔진 정보 설정 게임 로딩 정보 설정
  29. 29. 파일 - coc os2d.js 2/2JS 게임의 코드 파일 목록 패키지 및 엔진 로딩 방법 정의
  30. 30. JS 파일 - m ain.js 1/3 게임 객체 정의 게암 객체 생성
  31. 31. JS 파일 - m ain.js 2/3 엔진 초기화 디렉터 초기화 (AppDelegate)
  32. 32. JS 파일 - m ain.js 3/3 게임 초기화 완료 게임의 시작 씬
  33. 33. JS 파일 - r esource.js 리소스 과련 매직 넘버 정의 전체 리소스 목록
  34. 34. 파일 - myA pp.js 1/2 JS Hello World화면 갱신 알림 엔진 로고엔진 정보 종료 버튼
  35. 35. 파일 - myA pp.js 2/2 JSCircleSprite (화면 갱신 알림)● 매 프레임 갱신되는 객체● 기본 도형 그리는 함수로 그림Helloworld (cc.Layer 확장)● 종료 버튼 이미지 및 이벤트 정의● Hello World 문구, 화면 갱신 알림 및 엔진 로고 이미지 객체 생성 및 에이 메이션 정의HelloworldScene (cc.Scene 확장)● Helloworld 레이어 생성 및 등록
  36. 36. Hello HTM L5 World hello HTML5 world
  37. 37. l 파일 - build.xml 1/2xm 컴파일러 정의 (google closure compiler) 컴파일 결과 정의
  38. 38. l 파일 - build.xml 2/2xm 엔진 소스 목록 게임 소스 목록
  39. 39. ant 빌드 1/2 ant 빌드 실패 엔진 파일 목록에 존재하지 않는 파일이 있어 빌드 실패 <file name="keypad_dispatcher/CCKeypadDelegate.js"/> <file name="keypad_dispatcher/CCKeypadDispatcher.js"/>
  40. 40. 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"/> 로 수정해야 합니다.
  41. 41. 과 - myAp p-v0.1.js빌드 결
  42. 42. cocos2d-html5게임 시작 과정 분석
  43. 43. - cocos2d- x win32 1/3b oot engine run() 호출
  44. 44. - cocos2d- x win32 2/3b oot engine mainLoop() 호출
  45. 45. - cocos2d- x win32 3/3 b oot engine1. main.cpp a. CCApplication::sharedApplication()->run();2. platform/CCApplication.cpp - run() b. applicationDidFinishLaunching() c. looping CCDirector::sharedSirector()->mainLoop()
  46. 46. - cocos2d- html5 1/8b oot engine cocos2d.js 로딩
  47. 47. - cocos2d- html5 2/8b oot engine DOM 로딩 완료 엔진 및 게임 스크립트 파일 정의 스크립트 로딩 (jsloader.js)
  48. 48. - cocos2d- html5 3/8b oot engine 엔진 로딩 목록 main.js 로딩 목록 추가
  49. 49. - cocos2d- html5 4/8b oot engine 리소스 로딩중 표시 로딩 완료 후 호출
  50. 50. - cocos2d- html5 5/8b oot engine run() 호출
  51. 51. - cocos2d- html5 6/8b oot engine applicationDidFinishLaunching() 호출 mainLoop() 호출 mainLoop() 호출
  52. 52. - cocos2d- html5 7/8 b oot engine1. index.html a. cocos2d.js 로딩2. cocos2d.js b. 즉시 실행 함수에서 DOM로딩 직후 jsloader.js 로딩3. jsloader.js - (여러 js을 읽는 경우) c. 즉시 실행 함수에서 모든 엔진 코드 및 main.js 로딩
  53. 53. - cocos2d- html5 8/8 b oot engine4. 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();
  54. 54. boot up 비교cocos2d-x● 플랫폼 별 다른 엔트리 포인트에서 CCApplication.cpp 의 run() 호출● 윈도의 경우 platform/win32/CCApplication.cpp 의 run() 에서 mainLoop() 호출cocos2d-html5● 엔진 및 어플리케이션 코드 로딩● 로딩 과정에서 즉시 실행 함수로 초기화● 로딩 완료 이벤트 수신 후 platform/CCApplication.js 의 run() 에서 mainLoop() 호출
  55. 55. 2개의 main Loop() ?? etc - mainLoop() 호출Loopingcallback 등록 mainLoop() 호출Loopingcallback 등록
  56. 56. html5 - javascript게임 개 발을 위한 기능들
  57. 57. 패턴 1/2 을 위한 Jav ascript 사용 게임모듈 패턴 - 네임스페이스 패턴, 즉시 실행 함수 등상속 패턴 - 프로토타입 목록 및 객체 정보 복사를 이용
  58. 58. 패턴 2/2 을 위한 Jav ascript 사용 게임객체 상수 - 매직 넘버를 정의하기 위한 객체 정의 방법 ... JavaScript Patterns - 자바스크립트 코딩 기법과 핵심 패턴
  59. 59. Displa y - Canvas
  60. 60. Displa y - WebGL
  61. 61. lay - Canva s vs WebGL DispCanvas● 모든 시스템에서 지원● 상대적으로 느리지만 지속적으로 개선WebGL● gles 2.0 과 비슷한 사양● Canvas에 비해 매우 빠르고 동작 한다면 호환성 이슈 적 음● WebGL tutorial - Opera 개발자(Erik Moller)● WebGL Terrain Editor
  62. 62. performanc e test 1/2 Display -2012-3-19 internet-explorer-10-fast-and-native-has-gone-to-other-browsers
  63. 63. performanc e test 2/2Display - 2011-11-18 html5-2d-gaming-performance-analysis
  64. 64. D isplay - cocos2d-html5 canvas 생성
  65. 65. InputaddEventHandler● 첫번째 인자로 원하는 이벤트를 지정 ○ keyup, keydown ○ mousedown, mouseup, mousemove ○ touchstart, touchmove, touchend, touchcancel● 두번째 인자로 이벤트 처리 함수 지정● 세번째 인자로 캡쳐 방식의 이벤트 처리 ○ 일반적인 경우 부모 객체에게 이벤트 전달 ○ 캡쳐 방식의 경우 부모객체에게 이벤트 전달을 하지 않음
  66. 66. yboard coc os2d-html5Input - ke 키 이벤트 등록
  67. 67. - mouse coc os2d-html5Input 마우스 버튼 누름 이벤트 마우스 버튼 업 이벤트 마우스 이동 이벤트
  68. 68. Audio
  69. 69. io - codec in browserAud
  70. 70. Audio현재● 단순한 기능● 메모리에 로딩된 사운드만 출력● 브라우져 별 지원 코덱 다름● 아이폰의 경우 전체 화면이 아닌 경우 출력되지 않음미래● 기능 확장을 위한 다양한 시도중 ○ 스트리밍 처리에 대해 W3C 제안 ○ 하위 수준의 API 개발
  71. 71. A udio - cocos2d-html5
  72. 72. N etwork - W eb socket
  73. 73. o rk - Web so cket client NetwWeb socket - client● TCP 기반의 실시간 양방향 통신 가능● 다수의 사용자와 통신 가능● 사용하기 쉽다안드로이드 계열에서는 지원하지 않음 ;;;● iframe 나 Ajax 등 비동기 JS 계열의 기술을 이용
  74. 74. o rk - Web so cket server NetwWeb socket - server● 기존 TCP 소켓 서버와 약간 다른 구현이 필요● 다양한 언어를 위한 오픈 소스 서버 프레임 존재 ○ jwebsocket ○ pywebsocket ○ phpwebsocket ○ web-socket-ruby ○ socket.io-node ○ ...
  75. 75. high p erformance변수 선언 위치성능 향상을 위한 코딩 패턴...● Extreme JavaScript Performance참고자료● JavaScript 자바스크립트 성능 최적화
  76. 76. multi browser브라우져 마다 특성 다름...;;● 시각적 결과● 지원 기능● 성능● 개개의 브라우져에 대응하도록 소스 코드 튜닝● 특정 브라우져만 지원, 해당 브라우져 설치 유도
  77. 77. - html5 & javascript debugFirefox - FirebugChrome - Chrome developer tool● 브레이크 포인터, 라인 단위 실행 등 디버깅 기능● 변수값 표시● 로그 출력● 성능 프로파일링● 호출 스텍 표시● 리소스 로딩 모니터링● 기타 등등
  78. 78. IDE - C onstruct 2 Make HTML5 games with Construct 2
  79. 79. IDE - coc osBuilder
  80. 80. IDE - coc osBuilder CocosBuilder 3 Animation Editor
  81. 81. html5 - javascript 그래서...
  82. 82. Q&A살살요 ... ^^ 굽신~
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×