[[TableOfContents]] = 스터디 소개 = * 그래픽스 엔진 등 공학ì ì¸ ì£¼ì œì— ì´ˆì ì„ ë§žì¶¤ * RPG만들기 ì—ë®¬ë ˆì´í„° ìŠ¤ë§ˆíŠ¸í° ë²„ì „ * ì°¸ê³ ìœ„í‚¤: [http://ko.wikipedia.org/wiki/RPG_%EB%A7%8C%EB%93%A4%EA%B8%B0 RPG만들기 한글], [http://en.wikipedia.org/wiki/RPG_Maker_VX ì˜ë¬¸] * ~~[http://www.jpct.net/ Javaë¡œ ë§Œë“ 3D 물리 엔진]으로 2D 엔진 만들기~~ * íˆ´ì´ ì•„ë‹Œ ì—ë®¬ë ˆì´í„° 위주 * UDKë¡œ ë”ê°€ 삽질 하다가 ë©˜ë¶•í•˜ê³ ì„ íšŒí•œ 스터디 -ã……- == ì°¸ê°€ìž == * [권순ì˜], [박재민], [박한기] == 진행 시간 == * 여름방학: 매 주 í™”, 목 ì €ë… 7ì‹œ ë°˜ ~ 10ì‹œ * 2학기: 매 주 ëª©ìš”ì¼ ì˜¤í›„ 5ì‹œ ì´í›„ = 목표 = * 알피지 만들기(RPG Maker, ì´í•˜ 알만툴)ì€ ëˆ„êµ¬ë“ ì§€ ì†ì‰½ê²Œ 바람ì˜ë‚˜ë¼ ê°™ì€ í˜•ì‹ì˜ 2D ë¡¤í”Œë ˆìž‰ ê²Œìž„ì„ ë§Œë“¤ 수 있ë„ë¡ ë„와주는 툴ì´ë‹¤. 요즘 한창 ë‚ ë¦¬ëŠ” UDK(ì´ì’¸....)나, Unityê°™ì€ ê²Œìž„ì—”ì§„ê³¼ ë”¸ë ¤ì˜¤ëŠ” 툴과 ê°™ì€ ê°œë…ì´ë‹¤. 현재 VX Aceë²„ì „ê¹Œì§€ 나와있으며 ì•„ì§ë„ ì „ì„¸ê³„ì—ì„œ ë§Žì€ ì´ë“¤ì´ 알만툴로 ê²Œìž„ì„ ë§Œë“¤ê³ ìžˆë‹¤. * PCì—ì„œ ëŒì•„가는 게임 엔진(런타임)ì€ ìžˆì§€ë§Œ 요즘 ëŒ€ì„¸ì¸ ëª¨ë°”ì¼ì—ì„œ ëŒë¦´ 수 있는 ëŸ°íƒ€ìž„ì´ ì¡´ìž¬í•˜ì§€ 않는다. ë”°ë¼ì„œ ì´ë²ˆ ê¸°íšŒì— ì•Œë§Œíˆ´ìš© ëª¨ë°”ì¼ ë²„ì „ ì—”ì§„ì„ ë§Œë“¤ì–´ ë³´ë ¤ê³ í•œë‹¤. * ì œìž‘ 순서는 다ìŒê³¼ ê°™ì´ ì§„í–‰í•˜ë ¤ê³ í•œë‹¤. RPGMaker VX Versionì„ Javaë¡œ -> Android용으로 -> Windows용으로... (겨울 ë°©í•™ ëë‚ ë•Œ 쯤엔 완성 ë˜ê² 지...) 실질ì 으로 2단계서부터 모바ì¼í™”ê°€ 진행ë˜ë©° 1단계가 가장 오래 걸릴 듯 싶다. == ì–»ê³ ì‹¶ì€ ê²ƒ == * 3D 그래픽스 ì§€ì‹ ë° ê¸°ë³¸ 그래픽스 ê°œë… * 리버스 ì—”ì§€ë‹ˆì–´ë§ ë…¸í•˜ìš° * ëª¨ë°”ì¼ í”„ë¡œê·¸ëž˜ë° * 게임 ë¡œì§ ë° íë¦„ì˜ ì´í•´ * 설계 패턴 * 다양한 í”„ë¡œê·¸ëž˜ë° ì–¸ì–´ì˜ ìŠµë“(Java, Ruby, C# 등등..) = ì¼ì • ê¸°ë¡ = == 2012.07.26 == === í•œ 것 === * jpct 설치 ë° RPG 만들기가 어떻게 ìƒê²¨ ë¨¹ì€ ë†ˆì¸ì§€ í™•ì¸ * jpct íŠœí† ë¦¬ì–¼ ë³´ê³ ë”°ë¼ í•´ 보기 - Hello World! ==== 프로ì 트 ì„¤ì • ==== 1. ì´í´ë¦½ìŠ¤ 프로ì 트 ìƒì„±ì€ ìƒëžµ. 게다가 ì´ë¯¸ [http://nforge.zeropage.org/projects/rma/code?viewfunc=browse svn repository]ì— ë“±ë¡í•´ë†“ì•˜ìŒ 1. [http://www.jpct.de/download/net/jpctapi.zip PCìš© jPCT 엔진]ì„ ë°›ëŠ”ë‹¤ 1. ë°›ì€ ì—”ì§„ 안ì—는 jpctì— í•´ë‹¹í•˜ëŠ” jpct.jarê³¼ ë˜ë‹¤ë¥¸ 그래픽 ë¼ì´ë¸ŒëŸ¬ë¦¬ì¸ lwjglì´ ìžˆë‹¤. lwjgl.jar까지 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¡œ 등ë¡í•œë‹¤ 1. lwjgl.jarì€ ë‚´ë¶€ì 으로 native 함수를 호출한다. ì´ native함수는 dll파ì¼ì— ë‹´ê²¨ì ¸ ìžˆëŠ”ë° ì´í´ë¦½ìŠ¤ì—ì„œ Window -> preferences -> java/installed JREs ì—ì„œ vm ì„¤ì •ì— -Djava.library.path=D:\Workspace\rma\libs 형ì‹ìœ¼ë¡œ lwjgl.dll ë˜ëŠ” lwjgl64.dllì˜ í´ë” 경로를 ìž…ë ¥í•¨ìœ¼ë¡œì¨ ì°¸ì¡°í•˜ê²Œ 한다. ì´ì™€ ê´€ë ¨ëœ ì˜¤ë¥˜ëŠ” java.lang.UnsatisfiedLinkErrorì´ë‹¤. ==== ë˜ë‹¤ë¥¸ 방법(2012.08.30) ==== 3. ì´í´ë¦½ìŠ¤ 메뉴ì—ì„œ window -> preferences -> java -> build_path -> user_librariesë¡œ 가면 ìœ ì € ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 등ë¡í• 수 있다. jPCT와 LWJGLì„ ë“±ë¡í•˜ëŠ”ë° ë‘˜ì´ ë¬¶ì–´ì„œ í• ìˆ˜ë„ ìžˆê³ ì„œë¡œ 다른 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¡œ 등ë¡í•´ë„ ëœë‹¤. lwjglì˜ ê²½ìš° 참조하는 dll(안드로ì´ë“œë¼ë©´ so) 파ì¼ì„ 등ë¡í•´ì•¼ í•˜ëŠ”ë° ì´ê±´ native library locationì—ì„œ 경로를 ì§€ì •í•´ì£¼ë©´ ëœë‹¤. 4. 프로ì 트 ì†ì„± -> java build pathì—ì„œ 방금 등ë¡í•œ ìœ ì € ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 추가한다. (ê°œì¸ì 으로 ì´ê²Œ ë” ê¹”ë”í•œ ë°©ë²•ì¸ ê²ƒ 같다) === ì°¸ê³ === * [http://ppparkje.tistory.com/entry/Java%EB%A5%BC-%EC%9C%84%ED%95%9C-3D-%EC%97%94%EC%A7%84-jPCT ìž¬ë¯¼ì´ ë¸”ë¡œê·¸] - jpct 설치?ì— ëŒ€í•œ ë‚´ìš© == 2012.07.31 == === í•œ 것 === * 3Dì—ì„œ ì •ì , UV좌표, 삼ê°í˜•ì˜ í‘œí˜„ì— ëŒ€í•´ ì„¤ëª…í•˜ê³ ì‹¤ì œë¡œ ê°ì²´ë¥¼ ì œìž‘í•´ë´„ * ë‹¤ìŒ ìŠ¤í„°ë””ê¹Œì§€ ê³¼ì œë¡œ 오ê°í˜• 만들어오삼 * íŒŒì¼ ë¶„ì„ ì •ë³´ë¥¼ 기반으로 parser ì œìž‘ 시작함. *.rvdata는 들어가는 ì •ë³´ì˜ ì¢…ë¥˜ëŠ” 다르지만 ì¼ì •í•œ í¬ë§·ì´ 있는듯함 예ìƒë³´ë‹¤ 파ì¼ë¶„ì„ì€ ë¹¨ë¦¬ ëë‚ ì§€ë„. == 2012.08.02 == === í•œ 것 === * ê³¼ì œ 검사(FAIL) - ì½”ë”©ì— ì•žì„œ 엄밀한 수학 모ë¸ë§ì„ ë¨¼ì € 해보는 ê²ƒì´ í•„ìš”í• ë“¯ * Actors íŒŒì¼ í•´ì„ë²•ì„ ì†Œê°œí•˜ê³ ë‹¤ë¥¸ 파ì¼ì„ 맛보기로 분ì„í•´ë´„ * Actor를 ì½ì–´ë“¤ì´ëŠ” [http://wiki.zeropage.org/wiki.php/Code/RPGMaker#s-5 Actors.rvdataìš© íŒŒì¼ íŒŒì„œ] ì œìž‘ 완료 == 뻘짓(2012.08.09) == * ì•Œë§Œíˆ´ì„ ì´í•´í•˜ê¸° 위해 ë°ì´í„°ë² ì´ìŠ¤ì— 해당하는 *.rvdata를 뜯어ë´ì•¼ê² 다 ë¼ëŠ” ìƒê°ì„ ì´ˆê¸°ì— í–ˆì—ˆì§€ë§Œ 곧 ë»˜ì§“ìž„ì„ ì•Œì•˜ë‹¤ -_-;; .rvdata 파ì¼ì€ 단지 í´ëž˜ìŠ¤ë“¤ì„ [http://www.ruby-doc.org/core-1.9.3/Marshal.html Marshal 모듈]ì„ ì´ìš©í•˜ì—¬ ë¤í”„í•œ ë‚´ìš©ì„ ê¸°ë¡í•œ ê²ƒìž„ì„ ì•Œê²Œ ë˜ì—ˆê¸° 때문ì´ë‹¤. 게다가 알만툴ì—ì„œ F1키 누르면 나오는 ë„움ë§ì— Built-in í´ëž˜ìŠ¤ë‚˜ ëª¨ë“ˆì„ ì œì™¸í•œ ëª¨ë“ ìžë£Œêµ¬ì¡°(RPG::Actor, RPG::Map 등등..)ì˜ ì†ŒìŠ¤ê°€ 오픈ë˜ì–´ 있었다. * ë”°ë¼ì„œ 파ì¼ë¶„ì„ì€ ê³§ë°”ë¡œ ë•Œë ¤ì¹˜ê³ ë£¨ë¹„ìŠ¤í¬ë¦½íŠ¸ë¡œ ê°ì¢… .rvdataë“¤ì„ ë¶ˆëŸ¬ì˜¤ëŠ” ìž‘ì—…ì„ ì‹œìž‘í–ˆë‹¤. == 2012.08.14 == === í•œ 것 === * built-in classì œìž‘ 시작함 워ë°ì—…으로 Font, Color í´ëž˜ìŠ¤ ì œìž‘í•¨ == 2012.08.23 == * [박한기] 참가 === í•œ 것 === * 프로ì 트 오리엔테ì´ì…˜ ë° ê¸°ì´ˆì´ë¡ 소개 * Audio 초기화 오류 ë¬¸ì œ íƒìƒ‰ * ê·¸ëž˜í”½ì´ ìž˜ë¦¬ë˜ ë¬¸ì œ íƒìƒ‰ == 2012.08.28 == === í•œ 것 === * 오디오는 ì—¬ì „ížˆ ë§ì½(...) * BufferedImage í´ëž˜ìŠ¤ë¥¼ 사용하여 글ìžë¥¼ ì¶œë ¥í•˜ëŠ” 방법 학습 == 2012.09.07 == === í•œ 것 === == 2012.09.13 == === í•œ 것 === * 글ìžì˜ ì •ë ¬ 구현 * í”„ë ˆìž„ì›Œí¬ì—ì„œ 비트맵과 스프ë¼ì´íŠ¸ì˜ ê°œë…, uvì¢Œí‘œì— ëŒ€í•œ 과외(...) * oggíŒŒì¼ ì¶œë ¥ * Tilemap ìž‘ì—… Tilemapì€ loopì´ ìžˆëŠ” 경우ì—는 ì¢€ë” ë¨¸ë¦¬ë¥¼ ì¨ì•¼í• 듯 싶다 == 2012.09.18 == * 그래픽 ì—”ì§„ì„ 2D ë¼ì´ë¸ŒëŸ¬ë¦¬ì¸ [http://slick.cokeandcode.com/ Slick2D]ë¡œ êµì²´í•˜ê³ 작업중 branch 주소 [http://nforge.zeropage.org/svn/rma/branches/slick_version] - 메모리 사용 í¼í¬ë¨¼ìŠ¤ê°€ ë§Žì´ ì¢‹ì•„ì¡Œë‹¤. - 코드가 '많ì´' 간결해졌다. * 3Dì—ì„œë„ 2D를 êµ¬í˜„í• ìˆ˜ 있ìŒì„ jPCT를 통해 충분히 ë³´ì˜€ê³ ì´ ì´ìƒì˜ ìž‘ì—…ì€ 3D지ì‹ì„ 필요로 하지 않기 ë•Œë¬¸ì— 3Dêµ¬í˜„ì€ ì—¬ê¸°ì„œ ëë‚´ë„ ì¢‹ì„ ê²ƒì´ë¼ íŒë‹¨ë˜ì—ˆë‹¤. = System = == 게임 루프 == ì¼ë°˜ì ì¸ ì‹±ê¸€ ìŠ¤ë ˆë“œ ê²Œìž„ì˜ ê²½ìš° 다ìŒê³¼ ê°™ì€ í° ë£¨í”„ë¥¼ 가진다. {{{#!java void run() { initialize(); while( !isGameEnded() ) { logicUpdate(); renderScene(); } finish(); } }}} ì´ ì¤‘ì—ì„œ 가장 ë§Žì€ ì‹œê°„ì„ ë Œë”ë§ì— 소모한다. 안드로ì´ë“œì—ì„œ 위 ë‘ê°œì˜ í° í•¨ìˆ˜ë¥¼ ê°™ì€ ìŠ¤ë ˆë“œì—ì„œ 루프를 ëŒë¦¬ëŠ” ê²ƒì€ ìƒë‹¹í•œ ì†ë„ ì €í•˜ê°€ ë°œìƒí• 수 있다. ë”°ë¼ì„œ logicUpdate() 함수와 renderScene() 함수를 서로 다른 ìŠ¤ë ˆë“œë¡œ 분리하는 ê²ƒì´ ì„±ëŠ¥ì—ë„ ë„ì›€ì´ ë˜ë©° 프로그램 설계ìƒìœ¼ë¡œë„ 보기 좋다. ì•Œë§Œíˆ´ì€ pcë²„ì „ì˜ ê²½ìš° 싱글 ìŠ¤ë ˆë“œì´ë‹¤. ë”°ë¼ì„œ ìŠ¤ë ˆë“œë¥¼ 분리하는 ìž‘ì—…ì„ í•´ 주어야 한다. - [http://warmz.tistory.com/762 커맨드 패턴]ì„ ì‚¬ìš©í• ì˜ˆì •. = Graphics = == ì§êµíˆ¬ì˜ ë Œë”ë§ == * jPCTì—서는 명시ì 으로 Orthographic rendering(ì§êµíˆ¬ì˜ ë Œë”ë§)ì„ ì§€ì›í•˜ì§€ 않는다 [http://www.jpct.net/forum2/index.php/topic,1789.msg13175.html#msg13175] ë”°ë¼ì„œ 근사ì 으로ë¼ë¡œ ì§êµíˆ¬ì˜ì„ ë§Œë“ ë‹¤ * 근사 ì§êµíˆ¬ì˜ 좌표계 만들기 : [http://blog.jidolstar.com/826 안드로ì´ë“œ jPCT-AEë¡œ (근사) ì§êµíˆ¬ì˜(Orthogonal Projection) 실현하기] 한줄요약: ì¹´ë©”ë¼ë¥¼ ê²ë‚˜ 멀리 갖다ë‘ë©´ 근사ì 으로 ì§êµíˆ¬ì˜ì´ ë¨ã…‹ * [http://wiki.zeropage.org/wiki.php/Code/RPGMaker?action=show#s-1 ì‹¤ì œ 구현 코드] === ë³´ì •(Interpolation) === * ì´ë¥¼ ì´ìš©í•˜ë©´ ì§êµíˆ¬ì˜ 좌표가 ëœ ê²ƒì²˜ëŸ¼ ë³´ì´ê¸´ 하지만 depthì— í•´ë‹¹í•˜ëŠ” zê°’ì´ ë°”ë€Œë©´ 조금ì´ë¼ë„ 오차가 ìƒê¸°ê¸° ë•Œë¬¸ì— ì´ë¥¼ ë³´ì •í•˜ì—¬ì•¼ 한다 특히 ë Œë”ë§ ìˆœì„œë¥¼ zê°’ì„ ì¡°ì •í•¨ìœ¼ë¡œ ê²°ì •ì‹œí‚¤ê¸° ë•Œë¬¸ì— ì •í™•í•œ ë Œë”ë§ì„ 위해서는 ë³´ì • í…Œí¬ë‹‰ì„ 아는 ê²ƒì´ í•„ìˆ˜ì´ë‹¤. attachment:projection.png * 위 그림ì—ì„œ ë³¼ 수 ìžˆë“¯ì´ ì‹¤ì œ Objectì˜ ì¤‘ì ê³¼ ì‚¬ëžŒì´ ëŠë¼ëŠ” Objectì˜ ìœ„ì¹˜ëŠ” 다르다. í¬ê¸° ì—ì‹œ 마찬가지ì´ë‹¤. 만약 위 그림처럼 Objectê°€ 스í¬ë¦°ì—ì„œ deltaë§Œí¼ ë–¨ì–´ì ¸ 있다면 간단한 비례ì‹ìœ¼ë¡œ (length-delta)/length ë§Œí¼ í¬ê¸°ê°€ ì¡°ì •ë˜ì–´ì•¼ 한다 ì¤‘ì‹¬ì˜ ì´ë™ì€ Objectì˜ ì¤‘ì‹¬ì„ O, Projectionì˜ ì¤‘ì‹¬ì„ Pë¼ê³ í• ë•Œ 벡터 PO만í¼ì„ ì´ë™ì‹œí‚¤ë©´ ëœë‹¤. 벡터 PO는 ì¹´ë©”ë¼ ìœ„ì¹˜ì™€ Object ì¤‘ì‹¬ì„ ìž‡ëŠ” ì§ì„ ì˜ ì—°ìž¥ì„ ìƒì— 있다는 ê²ƒì„ ìƒê°í•˜ë©´ ê³„ì‚°ì´ ê°„íŽ¸í•´ì§„ë‹¤. * [http://wiki.zeropage.org/wiki.php/Code/RPGMaker#s-4 interpolation 구현 코드] == 오브ì 트 그리기 == === 삼ê°í˜• === * ëª¨ë“ ë„í˜•ì˜ ê¸°ì´ˆê°€ ë˜ëŠ” ë„형ì´ë‹¤. ëª¨ë“ ë„í˜•ì€ ì‚¼ê°í˜•ë§Œìœ¼ë¡œ êµ¬ì„±í• ìˆ˜ ìžˆê³ ë˜ ìª¼ê°¤ 수 있다. * jpctì—ì„œ í…ìŠ¤ì³ ìžˆëŠ” 삼ê°í˜•ì„ 그리기 위해 필요한 ì •ë³´ëŠ” 다ìŒê³¼ 같다 * ì •ì (vertex, ê¼ì§€ì ) : 삼ê°í˜•ì€ 서로 다른 3ê°œì˜ í•œ ì§ì„ ìœ„ì— ìžˆì§€ ì•Šì€ ì •ì 들로 구성ëœë‹¤. * uv좌표 : í…스ì³ê°€ 매핑ë˜ëŠ” 좌표계를 ì„¤ì •í•œë‹¤. (0, 0)부터 (1, 1)ê¹Œì§€ì˜ ì¢Œí‘œì— í…ìŠ¤ì³ í•˜ë‚˜ê°€ 들어가게 ëœë‹¤ í…스ì³ì— 대해서는 ë‚˜ì¤‘ì— í• ë§ì´ 있ì„것. * ì •ì ë“¤ì„ ìž‡ëŠ” 순서 : ì´ ìˆœì„œì— ë”°ë¼ ì‚¼ê°í˜•ì˜ ë³´ì´ëŠ” ë©´ê³¼ ë³´ì´ì§€ 않는 ë©´ì´ ê²°ì •ëœë‹¤. 다른 ê³³ì€ ìž˜ ëª¨ë¥´ê² ìœ¼ë‚˜ openGLì—서는 ì˜¤ë¥¸ë‚˜ì‚¬ì˜ ë²•ì¹™ì— ë”°ë¼ ì—„ì§€ê°€ 가리키는 ë°©í–¥ì˜ ë©´ì´ ë³´ì´ëŠ” ë©´ì´ë‹¤. [http://niceyth.springnote.com/pages/3165274 CCW íŒë³„ ì•Œê³ ë¦¬ì¦˜]ì„ ì´ìš©í•´ì„œ 순서를 하드코딩하지 ì•Šê³ ìžë™ìœ¼ë¡œ 계산하게 í• ìˆ˜ë„ ìžˆë‹¤. * Texture : ë„í˜•ì„ ìƒ‰ì¹ í•˜ê¸° 위한 ì •ë³´ê°€ 들어있는 2ì°¨ì› ì •ì‚¬ê°í˜•ì´ë¼ê³ ìƒê°í•´ë„ 좋다. í•œ ë³€ì˜ ê¸¸ì´ëŠ” ì†ë„를 위해 2ì˜ ì œê³±ìˆ˜ì—¬ì•¼ 한다. === ì§ì‚¬ê°í˜•(FillRect) 그리기 === * 왼쪽 위, 오른쪽 아래 좌표만 알면 그릴 수 있다. * 사ê°í˜•ì€ 2ê°œì˜ ì‚¼ê°í˜•ìœ¼ë¡œ 구성ëœë‹¤. * [http://wiki.zeropage.org/wiki.php/Code/RPGMaker?action=show#s-2 ì‹¤ì œ 구현] === ì§ì„ (Line) 그리기 === * ì§ì„ ë„ ì‹¤ì œë¡œëŠ” 너비를 ê°€ì ¸ì•¼ ë Œë”ë§ì´ 가능하기 ë•Œë¬¸ì— ë‹¤ìŒê³¼ ê°™ì€ êµ¬ì¡°ë¥¼ ê°€ì ¸ì•¼ 한다 attachment:line.png * vLine = vEnd - vStart * normal(vLineê³¼ 수ì§ì¸ 벡터) = vLine × (-zë°©í–¥ 벡터) -> normalize하여 길ì´ê°€ 1ì¸ ë²¡í„°ë¡œ 만듦. * (u1, v1)ê³¼ (u1, v2)는 vStart ± (normal/2) * (u2, v1)ê³¼ (u2, v2)는 vEnd ± (normal/2) * [http://wiki.zeropage.org/wiki.php/Code/RPGMaker?action=show#s-3 ì‹¤ì œ 구현] == Viewport == ë·°í¬íŠ¸ëŠ” ì¼ì¢…ì˜ ì°½ì´ë¼ê³ í• ìˆ˜ 있다. attachment:viewport.png ìš´ì˜ì²´ì œ 윈ë„ìš°ì˜ ê°œë…ì„ ìƒê°í•˜ë©´ 편한ë°, ê° ìœˆë„ìš°ì˜ ì˜ì—ì„ ë²—ì–´ë‚˜ëŠ” 그래픽 ì¡°ìž‘ì€ ì² ì €ížˆ 차단ëœë‹¤. ì´ ì°¨ë‹¨í•˜ëŠ” ê³¼ì •ì„ ê·¸ëž˜í”½ìŠ¤ì—서는 '''clipping'''ì´ë¼ 한다. jPCTì—서는 FrameBufferì—ì„œ setClippingPlane 함수를 통해 í´ë¦¬í•‘ì„ ì§€ì›í•˜ë¯€ë¡œ ì´ì™€ ì ì ˆí•œ ì¹´ë©”ë¼ ì¡°ìž‘ìœ¼ë¡œ ë·°í¬íŠ¸ë¥¼ êµ¬í˜„í• ìˆ˜ 있었다. 아래는 ì‹¤ì œ 구현 화면ì´ë‹¤. attachment:viewportTest.png 위 사진ì—서는 ê°€ìš´ë° ì•„ëž˜ìª½ 윈ë„ìš°ê°€ ë·°í¬íŠ¸ì´ë‹¤. 윈ë„우를 가로지르는 êµµì€ ì„ ì„ ì¶œë ¥í–ˆìœ¼ë‚˜ ë·°í¬íŠ¸ 바깥으로는 나가지 않는걸 확ì¸í• 수 있다. == 그래픽 ì—”ì§„ì˜ êµ¬ì¡° == ※ ì´ ì„¤ê³„ëŠ” ë³€í• ìˆ˜ ìžˆìŒ í˜„ìž¬ ì œìž‘ì¤‘ì¸ ê·¸ëž˜í”½ ì—”ì§„ì˜ êµ¬ì¡°ëŠ” í¬ê²Œ ë‘ ë¶€ë¶„ìœ¼ë¡œ 나눌 수 있으며 다ìŒê³¼ 같다. attachment:structure.png ì¸í„°íŽ˜ì´ìŠ¤ IDrawable 하위 í´ëž˜ìŠ¤ë“¤ì€ jPCTì˜ Object3D ê°ì²´ë¥¼ í¬í•¨í•˜ê³ 있으며 특히 RMPolygon ë° í•˜ìœ„ í´ëž˜ìŠ¤ëŠ” ë‚´ë¶€ì— ì—¬ëŸ¬ê°œì˜ IDrawableì„ ê°€ì§ˆ 수 있다. ë˜í•œ Viewport는 í™”ë©´ì˜ ì¼ë¶€ë¶„ë§Œì„ ë³´ì—¬ì¤„ 수 있는 í´ëž˜ìŠ¤ë¡œì„œ IDrawableì„ í¬í•¨í• 수 있으며, Sprite, Window ë“±ì˜ í´ëž˜ìŠ¤ì˜ 슈í¼í´ëž˜ìŠ¤ì´ë‹¤. 가방 ì•ˆì— ê°€ë°©ì„ ë˜ ë„£ëŠ” 것처럼 ë·°í¬íŠ¸ ì•ˆì— ë˜ ë·°í¬íŠ¸ê°€ 들어갈 수 있으며(트리 구조 가능), 최ìƒìœ„ ë·°í¬íŠ¸ëŠ” 화면 ì „ì²´ë¥¼ 아우르는 í¬ê¸°ë¥¼ 갖는다. = RPG Maker VX ë¶„ì„ = 알만툴로 ë§Œë“ ê²Œìž„ì€ í¬ê²Œ 세 부분으로 ë˜ì–´ 있다. * ê²Œìž„ì˜ ë©”ì¸ ë¡œì§ì„ 담당하는 스í¬ë¦½íŠ¸(루비로 작성ë¨) * ìºë¦í„° ì •ë³´, ì•„ì´í…œ ì •ë³´, 스킬 ì •ë³´ ë“±ì˜ ë¦¬ì†ŒìŠ¤ 부분(파ì¼ë¡œ ì €ìž¥ë˜ì–´ 있ìŒ) * 그래픽, 사운드 등 ê²Œìž„ì˜ ì—”ì§„ì— í•´ë‹¹í•˜ëŠ” 부분 .. ì´ëŸ¬ê³ 보니 ì² ì €ížˆ MVC íŒ¨í„´ì„ ì¤€ìˆ˜í•œë‹¤ê³ ë³¼ 수 ìžˆê² ë‹¤. 알만툴ì—서는 ë©”ì¸ ë¡œì§ì„ ìˆ˜ì •í• ìˆ˜ 있는 스í¬ë¦½íŠ¸ ì—디터를 ì œê³µí•¨ìœ¼ë¡œ 게임 ì œìž‘ì— ìœ ì—°ì„±ì„ ë”한다. íˆ´ì´ RPGì— ìµœì í™”ëœ í™˜ê²½ì¼ ë¿ì´ì§€, 슈팅ì´ë‚˜ 횡스í¬ë¡¤ 게임 ë“±ë„ ì–¼ë§ˆë“ ì§€ 만들 수 있다. ~~ëŒ€ì‹ ì•Œë§Œíˆ´ì˜ ê¸°ëŠ¥ì´ ì“¸ëª¨ì—†ì–´ì§ˆ ë¿.~~ == ë°ì´í„°ë² ì´ìŠ¤(리소스) == * 알만툴ì—ì„œ ë°ì´í„°ë² ì´ìŠ¤ì— 해당하는 .rvdata 파ì¼ì€ 루비 í´ëž˜ìŠ¤ë¥¼ ë¤í”„í•œ ë‚´ìš©ì„ ê¸°ë¡í•œ 것ì´ë‹¤. ì´ë¥¼ ë¶ˆëŸ¬ì˜¤ê³ ì €ìž¥í•˜ëŠ” load_data함수와 save_data함수를 ë„움ë§ì—ì„œ ì œê³µí•˜ê³ ìžˆë‹¤. {{{#!vim ruby def load_data filename File.open(filename, "rb") { |f| obj = Marshal.load(f) return obj } end def save_data filename, obj File.open(filename, "wb") { |f| Marshal.dump(obj, f) } end }}} == ê²Œìž„ì˜ ë©”ì¸ ë¡œì§(스í¬ë¦½íŠ¸) == 알만툴ì—ì„œ F11ì„ ëˆ„ë¥´ë©´ 나오는 스í¬ë¦½íŠ¸ëŠ” ê²Œìž„ì´ ì–´ë–»ê²Œ 진행ë˜ëŠ”ì§€ì— ê´€ë ¨ëœ ë‚´ìš©ì´ ë‹´ê²¨ 있다. 하지만 우리가 ì œìž‘í•˜ë ¤ëŠ” ê²ƒì€ ê²Œìž„ 콘í…ì¸ ê°€ ì•„ë‹Œ ì—ë®¬ë ˆì´í„°ì´ê¸° ë•Œë¬¸ì— êµ¬í˜„ ì°¸ê³ ìš©ìœ¼ë¡œë§Œ ì‚¬ìš©í• ê³„íšì´ë‹¤. ì—ë®¬ë ˆì´í„°ì—ì„œ ë©”ì¸ë¡œì§ê³¼ ê´€ë ¨í•´ í• ì¼ì€ 단지 ë©”ì¸ ë¡œì§ì„ 불러주는 ì¼ë¿ì´ë‹¤. === Javaì—ì„œ 루비스í¬ë¦½íŠ¸ 실행하기 === 1. [http://jruby.org/download JRuby 홈페ì´ì§€]ì—ì„œ JRuby를 설치한다. 64bit OSì—ì„œë„ 32비트 ì „ìš©ìœ¼ë¡œ 설치해야 ëŒì•„가는듯 하다. 2. JRuby설치경로/lib ì— ìœ„ì¹˜í•œ jruby.jar파ì¼ì„ 프로ì 트 ë¼ì´ë¸ŒëŸ¬ë¦¬ í´ë”ì— ë„£ëŠ”ë‹¤. 3. ì´í´ë¦½ìŠ¤ì—ì„œ .jaríŒŒì¼ ì˜¤ë¥¸ìª½ í´ë¦ 메뉴ì—ì„œ build path->add to build pathë¡œ 등ë¡í•œë‹¤. 4. 간단하게 코딩한다. 아래 코드는 프로ì 트 ë‚´ì—ì„œ src/ruby/main.rb 파ì¼ì„ 호출하는 코드. {{{#!vim ruby public static void main(String[] args) throws IOException, ScriptException { ScriptEngine rbEngine = new ScriptEngineManager().getEngineByName("jruby"); // start rubyscript rbEngine.eval(new FileReader("src/ruby/main.rb")); } }}} == 코어(엔진) == ë©”ì¸ ë¡œì§ì„ ë³´ë©´ ê°ì¢… 그래픽 처리, ìž…ë ¥ 처리, ìžë£Œêµ¬ì¡° ë“±ì€ ë”°ë¡œ ì œìž‘ëœ ëª¨ë“ˆì„ ì‚¬ìš©í•˜ëŠ” ê²ƒì„ ë³¼ 수 있다. ë„움ë§ì„ ë³´ë©´ ëŒ€ë¶€ë¶„ì˜ ê²Œìž„ ë‚´ì—ì„œ 사용하는 ì´ëŸ¬í•œ í´ëž˜ìŠ¤ì— 대한 명세를 ì œê³µí•˜ê³ ìžˆë‹¤. 하지만 ì‹¤ì œ êµ¬í˜„ì— ëŒ€í•œ 소스코드를 ì œê³µí•˜ì§€ 않기 ë•Œë¬¸ì— '''ì´ëŸ° Built-in í´ëž˜ìŠ¤ì™€ ëª¨ë“ˆì€ ëª…ì„¸ë§Œ ë³´ê³ ì§ì ‘ 구현해야 한다'''. ì˜ˆì œ: [http://wiki.zeropage.org/wiki.php/Code/RPGMaker?action=show#s-5 Table í´ëž˜ìŠ¤ì˜ 구현] === JRubyì—ì„œ ìžë°” í´ëž˜ìŠ¤ì˜ 사용 === ê·¸ë‚ ë£¨ë¹„ê°€ ì•„ë‹Œ ìžë°”ë¡œ êµ¬í˜„ëœ JRubyì˜ ê²½ìš° 루비스í¬ë¦½íŠ¸ ë‚´ì—ì„œ ìžë°” í´ëž˜ìŠ¤ë“¤ì„ ì‚¬ìš©í• ìˆ˜ 있다. ì‚¬ìš©ë°©ë²•ì€ ê°„ë‹¨í•œë‹¤. 스í¬ë¦½íŠ¸ ìƒë‹¨ì— '''require "java"'''를 ëª…ì‹œí•˜ê³ , ê°ì¢… í´ëž˜ìŠ¤ë“¤ì„ import하거나 패키지 ì´ë¦„ì„ ëª¨ì¡°ë¦¬ 명시하면 ìžë°”í´ëž˜ìŠ¤ë¥¼ 그대로 ì‚¬ìš©í• ìˆ˜ 있다. * ì˜ˆì œ: [http://wiki.zeropage.org/wiki.php/Code/RPGMaker?action=show#s-6 Color í´ëž˜ìŠ¤ì˜ 구현] === ì§ì ‘ 구현해야 하는 í´ëž˜ìŠ¤/모듈 ëª©ë¡ === * Built-in class * Bitmap: ì´ë¯¸ì§€ ë°ì´í„°ê°€ ì €ìž¥ë˜ëŠ” í´ëž˜ìŠ¤ * Color: ìƒ‰ìƒ ì •ë³´(RGBA)를 ê°€ì§€ê³ ìžˆëŠ” í´ëž˜ìŠ¤ * Font: 글꼴 ì •ë³´ë¥¼ ê°€ì§€ê³ ìžˆëŠ” í´ëž˜ìŠ¤. .ttf파ì¼ì„ 지ì›í•´ì•¼ 한다. * Plane: ì´ë¯¸ì§€ê°€ 표시ë˜ëŠ” í‰ë©´ í´ëž˜ìŠ¤. ì´ë¯¸ì§€ê°€ 타ì¼í˜•ìœ¼ë¡œ 반복표시ëœë‹¤. * Rect: top-left 코너와 너비, ë†’ì´ ì •ë³´ë¥¼ 가지는 í´ëž˜ìŠ¤. * Sprite: Bitmapì˜ í‘œí˜„ì´ ì´ë£¨ì–´ì§€ëŠ” í´ëž˜ìŠ¤. * Table: 3ì°¨ì› ë°°ì—´ í´ëž˜ìŠ¤. * Tilemap: ë§µì˜ í‘œì‹œì™€ ê´€ë ¨ëœ í´ëž˜ìŠ¤(?) * Tone: ì´ë¯¸ì§€ì˜ 색ìƒë³´ì •ì„ 위한 í´ëž˜ìŠ¤(?) * Viewport: 2Dìƒì˜ ë·°í¬íŠ¸ë¥¼ 구현한 í´ëž˜ìŠ¤ * Window: 알만툴 내부ì—ì„œì˜ ìœˆë„ìš° 표시를 담당하는 í´ëž˜ìŠ¤. * RGSSError: ì—러처리 í´ëž˜ìŠ¤. StandardErrorí´ëž˜ìŠ¤ë¥¼ ìƒì†í•¨ * Built-in module * [http://wiki.zeropage.org/wiki.php/RPGMaker/2012%EB%85%84%EC%8A%A4%ED%84%B0%EB%94%94?action=show#s-5.4 Audio]: 오디오 ì¶œë ¥ì„ ë‹´ë‹¹í•˜ëŠ” 모듈 * [http://wiki.zeropage.org/wiki.php/RPGMaker/2012%EB%85%84%EC%8A%A4%ED%84%B0%EB%94%94?action=show#s-4 Graphics]: 그래픽 ì¶œë ¥ì„ ë‹´ë‹¹í•˜ëŠ” 모듈 * Input: ìœ ì €ì˜ ìž…ë ¥(키보드)를 담당하는 모듈 * RPG: ì•Œë§Œíˆ´ì˜ ê°ì¢… ìžë£Œêµ¬ì¡°ë“¤ì„ ë‹´ê³ ìžˆëŠ” 모듈 == Audio == === ë‚˜ì™€ë¼ ì†Œë¦¬ì•¼ === * [http://www.lwjgl.org/wiki/index.php?title=Main_Page Audio를 위한 Java OpenAL íŠœí† ë¦¬ì–¼] * .wav파ì¼ì„ 불러 오는 ê²ƒì´ ë‹¤ì¸ë° ë¬¸ì œëŠ” 사용해야 í• íŒŒì¼ë“¤ì´ midi 아님 ogg íŒŒì¼ <- ì½”ë±ì´ 있어야 한다나 -ã……- * [http://blog.naver.com/PostView.nhn?blogId=harkon&logNo=120094059408&parentCategoryNo=7&viewDate=¤tPage=1&listtype=0 ì°¸ê³ 1] * [http://lwjgl.org/forum/index.php?topic=191.0 ì°¸ê³ 2] * [http://www.java2s.com/Open-Source/Android/Game/libgdx/com/badlogic/gdx/backends/openal/Mp3.java.htm ì°¸ê³ 3?] * OGG 파ì¼ì„ 사용하기 ìœ„í•´ì„ [http://www.lwjgl.org/wiki/index.php?title=Slick-Util_Library_-_Part_2_-_Loading_Sounds_for_LWJGL Loading Sound]ì—ì„œ ë§í•˜ê¸¸ Slick-Util zipì„ ë°›ì•„ ë¼ì´ë¸ŒëŸ¬ë¦¬ì— 추가하ë¼ê³ 함... 그럼 ëœë‹¤ë‚˜.. * [https://bitbucket.org/kevglass/slick/src/tip/trunk/Slick/lib/ 다운로드] * jorbis-*.jar ê³¼ jogg-*.jar library jar files 를 classpath ì— ë„£ì–´ì•¼ í•˜ëŠ”ë° ê·¸ê²Œ Slick-Util zip ìžˆë‹¤ê³ .. * 파ì¼ì´ 재ìƒì´ 안 ë¨ * 박재민: [http://lwjgl.org/forum/index.php/topic,3606.0.html ì´ ë§í¬]ê°€ 재ìƒì˜¤ë¥˜ì‹œ ë„ì›€ì´ ë 듯.. {{{#!vim ruby public void bgm_start(String filename, int volume, double pitch) { // Initialize OpenAL and clear the error bit. try { AL.create(); } catch (LWJGLException le) { le.printStackTrace(); return; } AL10.alGetError(); // Load the wav data. if (loadALData("test") == AL10.AL_FALSE) { System.out.println("Error loading data."); return; } setListenerValues(); AL10.alSourcePlay(source.get(0)); killALData(); AL.destroy(); } }}} * 맨 마지막 함수 killALData() 함수와 AL.destroy()ê°€ 실행하ìžë§ˆìž 종료시킴.. 주ì„처리 하니까 소리는 나옴 -_- === 여러 ê°œ 소리가 ê°™ì´ ë‚ ìˆ˜ 있게 만들긔 === * [http://slick.cokeandcode.com/javadoc-util/org/newdawn/slick/openal/Audio.html 오디오 ë¼ì´ë¸ŒëŸ¬ë¦¬]ì— playAsSoundEffect()를 여러번 호출하면 여러번 ìŒì•… 파ì¼ì´ 실행ë˜ëŠ” ê²ƒì„ í™•ì¸ í•¨. {{{#!vim ruby try { // you can play wavs by loading the complete thing into // a sound wavEffect = AudioLoader.getAudio("WAV", ResourceLoader.getResourceAsStream("sound/Test.wav")); } catch (IOException e) { e.printStackTrace(); } while (Keyboard.next()) { if (Keyboard.getEventKeyState()) { if (Keyboard.getEventKey() == Keyboard.KEY_T) { // play as a one off sound effect wavEffect.playAsSoundEffect(1.0f, 1.0f, false); } if (Keyboard.getEventKey() == Keyboard.KEY_G) { wavEffect.stop(); } } } }}} * 위와 ê°™ì€ ë°©ì‹ìœ¼ë¡œ 키보드를 통한 ìŒì•… 실행과 ì •ì§€ê°€ 가능하다.... * ê·¼ë° ì´ë ‡ê²Œ í•˜ê³ ë³´ë‹ˆ ê¸°ì¡´ì— í–ˆë˜ ì½”ë“œê°€ 아무ì§ì—ë„ ì“¸ëª¨ 없다는 ì‚¬ì‹¤ì„ ì•Œì•˜ë‹¤. -_-; {{{#!vim ruby public void init(InputStream filename) { try { // you can play oggs by loading the complete thing into // a sound oggEffect = AudioLoader.getAudio("OGG", filename); // java.lang.ArithmeticException: / by zero oggEffect.playAsSoundEffect(1.0f, 1.0f, false); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // polling is required to allow streaming to get a chance to // queue buffers. SoundStore.get().poll(0); } }}} * 왜 ì €ê¸°ì„œ 0으로 ë‚˜ëˆ ì„œ ë¬¸ì œê°€ ëœë‹¤ëŠ”거지??????? 박재민: ì¢€ë” ê²€ìƒ‰í•´ë³´ë‹ˆê¹Œ '''길ì´ê°€ ì§§ì€ ìŠ¤í…Œë ˆì˜¤ ogg파ì¼'''ì€ ë¬¸ì œê°€ 있는듯 ë³´ìž„. 모노로 ë³€í™˜í•´ë³´ë‹ˆê¹ ë˜ë”ë¼;; * ë‚œ ì•ˆë¨ -_- - [권순ì˜] {{{#!vim ruby public void init(InputStream filename) { URL file = null; try { file = new URL(filename); } catch (MalformedURLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { // you can play oggs by loading the complete thing into // a sound oggStream = AudioLoader.getStreamingAudio("OGG", file); oggStream.playAsMusic(1.0f, 1.0f, true); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // polling is required to allow streaming to get a chance to // queue buffers. SoundStore.get().poll(0); } }}} * 위와 ê°™ì´ ë°”ê¾¸ì—ˆì„ ê²½ìš° getStreamingAudio()ì— ë“¤ì–´ê°€ëŠ” ì¸ìžê°€ String, Stringì´ ë 수 ì—†ê³ URLë¡œ 바꾸어 주어야 함. 그래서 소리가 ë‚ ê¹Œ í–ˆëŠ”ë° no protocol: assets/rpgvx_resources/Audio/SE/Cursor.ogg ì´ë¼ëŠ” 아름다운 문ìžë¥¼ ë‚ ë ¤ì¤Œ. -ã……-... * ì´ ê²½ìš° file = new URL(filename); 를 file = new URL("file://" + filename);ë¡œ 바꾸어 주면 소리가 ë‚ ê²ƒ 처럼 ì‚¬ëžŒë“¤ì´ ì¨ ë†¨ìœ¼ë‚˜ 실패. 그래서 ì ˆëŒ€ 경로를 ëª¨ë‘ ì 어주었지만 ì—시나 파ì¼ì„ ì½ëŠ”ë° ì‹¤íŒ¨í–ˆë‹¤. {{{#!vim ruby public void init(InputStream filename) { try { // you can play oggs by loading the complete thing into // a sound oggStream = AudioLoader.getStreamingAudio("OGG", ResourceLoader.getResource(filename)); oggStream.playAsMusic(1.0f, 1.0f, true); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // polling is required to allow streaming to get a chance to // queue buffers. SoundStore.get().poll(0); } }}} * Testë¡œ ì‹¤í–‰ì´ ë˜ì—ˆë˜ 소스였으나, ì—¬ê¸°ì„ java.io.BufferedInputStream.read(Unknown Source)ë¼ë©° ì¦ì„ ë‚ ë ¤ 준다 -_-.... 아니 왜!!! * 맨 위 ì²˜ìŒ Testí•œ 방법과 ê°™ì€ ë°©ë²•ìœ¼ë¡œ ì‹œë„ í•´ 보았으나 소리가 안 나서 ë©˜ë¶•í•˜ê³ ìžˆìŒ = Porting to Android = ※ 공사중 == Project setup == pc와 안드로ì´ë“œëŠ” 다른 환경ì´ë‹¤. ìžë°”ë¼ëŠ” 언어가 플랫í¼ê°„ì˜ ì´ì§ˆì„±ì„ 초월하는 언어ë¼ê³ 는 하지만, ì–´ëŠ ì •ë„는 nativeí•œ ê¸°ëŠ¥ë“¤ë„ ìžˆê¸° ë•Œë¬¸ì— ê·¸ì— ë§žì¶”ì–´ í™˜ê²½ì„ ì„¤ì •í•´ì•¼ 한다. === ADT plugin setup === * ì´í´ë¦½ìŠ¤ì—ì„œ help - install new softwareë¡œ 가서 ì—…ë°ì´íŠ¸ 사ì´íŠ¸ì— '''http://dl-ssl.google.com/android/eclipse/''' 를 ìž…ë ¥í•˜ë©´ 가능한 ì—…ë°ì´íŠ¸ 목ë¡ì´ 나온다. * 나오는 목ë¡ë“¤ ì¤‘ì— Developer tools - '''Android DDMS''', '''Android development tools'''를 ì„ íƒí•œ ë’¤ 설치를 진행한다. * ì´í´ë¦½ìŠ¤ë¥¼ 재부팅하면 '''Android SDK'''를 ì„¤ì¹˜í• ê±°ëƒê³ 묻는 경우가 있는ë°, 설치해야 한다. === Slick-AE 빌드 === Slick2Dì˜ ì•ˆë“œë¡œì´ë“œ ë²„ì „ì¸ slick-ae는 ë”°ë¡œ jar파ì¼ì´ ì œê³µë˜ì§€ 않는다. ë”°ë¼ì„œ ì§ì ‘ 빌드를 해야 한다.(ë˜ëŠ” ë‚´ê°€ 빌드한 jarì„ í™œìš©í•´ë„ ëœë‹¤) * slickì€ [http://mercurial.selenic.com/ Mercurial(HG)]ë¡œ ë²„ì „ê´€ë¦¬ë¥¼ 하기 ë•Œë¬¸ì— ë¯¸ë¦¬ Mercurialì„ ì„¤ì¹˜í•œë‹¤. * ![hg clone https://bitbucket.org/kevglass/slick] ëª…ë ¹ìœ¼ë¡œ slickì˜ ì „ì²´ 코드를 다운받는다. * ì´í´ë¦½ìŠ¤ì—ì„œ slickì˜ ì½”ë“œë“¤ 중 Slickê³¼ Slick-AE만 ê°ê° 프로ì 트로 import한다. * 빌드하기 ì „ì— '''[http://libgdx.badlogicgames.com/ libgdx]'''를 [http://code.google.com/p/libgdx/downloads/list ìµœì‹ ë²„ì „]으로(여기서는 0.9.6) 바꿔야 하는ë°, ë²„ì „ì´ ì˜¬ë¼ê°€ë©´ì„œ InputProcessorë¶€ë¶„ì— ì¸í„°íŽ˜ì´ìŠ¤ê°€ ë°”ë€ ë¶€ë¶„ì´ ìžˆì–´ ê·¸ë¶€ë¶„ì„ ìƒˆë¡œ ê³ ì³ì£¼ì–´ì•¼ 한다. touchUp, touchDown함수는 있는 ê²ƒì„ ì‚¬ìš©í•˜ê³ , scrolled와 touchMoved ì—ì‹œ 비슷하게 구현해 주ìž. * ì´í´ë¦½ìŠ¤ì˜ package explorerì— ë³´ë©´ Slick-AEì— build.xmlì´ ìžˆë‹¤. ì´ê²ƒì„ 실행하면 빌드가 수행ë˜ë©°, targetí´ë”ì— slick-ae.jar 파ì¼ì´ ìƒì„±ëœë‹¤. === 안드로ì´ë“œ 프로ì 트 ìƒì„± === * 안드로ì´ë“œ 환경ì—ì„œ 루비스í¬ë¦½íŠ¸ë¥¼ 실행하기 위해서는 [http://ruboto.org ruboto]ë¼ëŠ” í”„ë ˆìž„ì›Œí¬ê°€ 필요하다. 내부ì 으로 JRuby를 ì‚¬ìš©í•˜ê³ ìžˆê¸° ë•Œë¬¸ì— ìš°ë¦¬ 프로ì íŠ¸ì™€ë„ ìž˜ 맞는 í”„ë ˆìž„ì›Œí¬ë¼ í• ìˆ˜ 있다. [https://github.com/ruboto/ruboto/wiki/Getting-started-with-Ruboto ì»´í“¨í„°ì— ruboto 세팅하기] ※ ruboto를 설치/빌드하기 위해서는 JRuby(ë˜ëŠ” 그냥 Ruby), Ant(ìžë°”ìš© make)ê°€ 필요하다. * ëª¨ë“ ì„¸íŒ…ì´ ì™„ë£Œëœ í›„ 커맨드ë¼ì¸ì—ì„œ '''ruboto gen app --package <ì• í”Œë¦¬ì¼€ì´ì…˜ 패키지 ì´ë¦„>''' 으로 ì•±ì„ ìƒì„±í•˜ë©´ 알아서 í…œí”Œë¦¿ì„ ë§Œë“¤ì–´ì¤€ë‹¤. ê·¸ ë’¤ ìƒì„±ëœ í´ë”ë¡œ 가서 '''rake install start'''를 하면 바로 컴파ì¼ì„ í•˜ê³ í°ìœ¼ë¡œ 옮겨 실행까지 해줘서(...) ë””ë²„ê¹…ì´ ê°€ëŠ¥í•´ì§„ë‹¤. attachment:ruboto-sample-screenshot.png?width=200 attachment:ruboto-sample-screenshot2.png?width=200 기본 ì•±ì„ ì‹¤í–‰í•œ 화면, rubotoê°€ ë™ìž‘하기 위해서는 마켓ì—ì„œ [https://play.google.com/store/apps/details?id=org.ruboto.core ruboto-core]ì„ ì„¤ì¹˜í•´ì•¼ 한다. 왼쪽 그림ì—ì„œ ì´ë¯¸ì§€ë¥¼ 누르면 ruboto-coreì„ ë°›ì„ ìˆ˜ 있는 마켓으로 ì´ë™í•œë‹¤. 오른쪽 ê·¸ë¦¼ì€ coreì„ ì„¤ì¹˜í•œ ë’¤ ì œëŒ€ë¡œ 실행ë˜ëŠ” ì•±ì˜ ëª¨ìŠµì´ë‹¤. == 안드로ì´ë“œì˜ OpenGL == 안드로ì´ë“œì—서는 OpenGLì˜ ê²½ëŸ‰í™” ë²„ì „ì¸ OpenGL-ES 1.xë²„ì „ì„ ì§€ì›í•œë‹¤. ì¼ë¶€ 기기ì—서는 2.0ì´ ì§€ì›ëœë‹¤. (하지만 ë‘ ë²„ì „ì€ ì„œë¡œ í˜¸í™˜ì´ ë˜ì§€ 않는다;) 안드로ì´ë“œ Activityìƒì—ì„œ OpenGLì„ ì‚¬ìš©í•˜ê¸° 위해서는 [http://developer.android.com/reference/android/opengl/GLSurfaceView.html GLSurfaceView]를 사용해야 한다. ë‹¤í–‰ížˆë„ ruboto wikiì— ì´ GLSurfaceViewì„ ì‚¬ìš©í•˜ëŠ” [https://gist.github.com/723691 ì˜ˆì œ]ê°€ 있다. 앞으로 ì´ë¥¼ 분ì„하여 ì‘ìš©í• ê³„íšì´ë‹¤. == Rendering Loop == 기존 slickì˜ ê²½ìš° 다ìŒê³¼ ê°™ì€ ë Œë”ë§ ë£¨í”„ë¥¼ 가진다. 주요 함수는 init()ê³¼ updateAndRender() 함수ì¸ë° 불리는 위치가 pcë²„ì „ê³¼ 안드로ì´ë“œ ë²„ì „ì´ ìƒì´í•˜ë‹¤. {{{#!vim java public void start() { init(); while(running()) gameLoop(); finish(); } protected void gameLoop() { updateAndRender(); } }}} ë‹¨ì¼ ìŠ¤ë ˆë“œì´ë‹¤. 하지만 안드로ì´ë“œì—서는 여러 ìŠ¤ë ˆë“œê°€ 존재한다. UI ìŠ¤ë ˆë“œê°€ 있으며, OpenGLì„ ìœ„í•œ GLìŠ¤ë ˆë“œë„ ìžˆë‹¤. {{{#!vim java public void start() { init(); startGLThread(); } ... protected void inThread() { while(running()) onDrawFrame(); } public void onDrawFrame(GL10 gl) { updateAndRender(gl); } }}} 구조가 약간 다르기 ë•Œë¬¸ì— ì¡°ê¸ˆ 혼ëˆì´ ì˜¤ê³ ìžˆë‹¤(...) ê²°êµ ë Œë”ë§ ìŠ¤ë ˆë“œì™€ ë¡œì§ ìŠ¤ë ˆë“œê°€ ë¶„ë¦¬ëœ ë°©ì‹ìœ¼ë¡œ ëŒì•„가야 í•˜ëŠ”ë° ì§€ê¸ˆ 프로그램 구조는 ë‘ ìž‘ì—…ì´ í•˜ë‚˜ì˜ ìŠ¤ë ˆë“œë¡œ 수행ë˜ê³ 있다. ì´ë¥¼ ê³ ì¹ ìˆ˜ 있는 ë°©ì•ˆì„ ê°•êµ¬í•´ì•¼ 한다. ---- [2012년활ë™ì§€ë„]