More actions
스터디 소개
- 그래픽스 엔진 등 공학적인 주제에 초점을 맞춤
- RPG만들기 에뮬레이터 스마트폰 버전
- 참고 위키: RPG만들기 한글, 영문
- Java로 만든 3D 물리 엔진으로 2D 엔진 만들기
- 툴이 아닌 에뮬레이터 위주
- UDK로 뭔가 삽질 하다가 멘붕하고 선회한 스터디 -ㅅ-
참가자
진행 시간
- 여름방학: 매 주 화, 목 저녁 7시 반 ~ 10시
목표
- RPGMaker VX Version을 Java로 -> Android용으로 -> Windows용으로... (겨울 방학 끝날 때 쯤엔 완성 되겠지...)
여름방학
2012.07.26
한 것
- jpct 설치 및 RPG 만들기가 어떻게 생겨 먹은 놈인지 확인
- jpct 튜토리얼 보고 따라 해 보기 - Hello World!
프로젝트 설정
- 이클립스 프로젝트 생성은 생략. 게다가 이미 svn repository에 등록해놓았음
- PC용 jPCT 엔진을 받는다
- 받은 엔진 안에는 jpct에 해당하는 jpct.jar과 또다른 그래픽 라이브러리인 lwjgl이 있다. lwjgl.jar까지 라이브러리로 등록한다
- 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이다.
참고
- 재민이 블로그 - jpct 설치?에 대한 내용
Simple rendering
직교투영 렌더링
- jPCT에서는 명시적으로 Orthographic rendering(직교투영 렌더링)을 지원하지 않는다
[1] 따라서 근사적으로라로 직교투영을 만든다
- 근사 직교투영 좌표계 만들기 : 안드로이드 jPCT-AE로 (근사) 직교투영(Orthogonal Projection) 실현하기
한줄요약: 카메라를 겁나 멀리 갖다두면 근사적으로 직교투영이 됨ㅋ
보정(Interpolation)
- 이를 이용하면 직교투영 좌표가 된 것처럼 보이긴 하지만 depth에 해당하는 z값이 바뀌면 조금이라도 오차가 생기기 때문에 이를 보정하여야 한다
특히 렌더링 순서를 z값을 조정함으로 결정시키기 때문에 정확한 렌더링을 위해서는 보정 테크닉을 아는 것이 필수이다.
- 위 그림에서 볼 수 있듯이 실제 Object의 중점과 사람이 느끼는 Object의 위치는 다르다. 크기 역시 마찬가지이다.
만약 위 그림처럼 Object가 스크린에서 delta만큼 떨어져 있다면 간단한 비례식으로 (length-delta)/length 만큼 크기가 조정되어야 한다
중심의 이동은 Object의 중심을 O, Projection의 중심을 P라고 할 때 벡터 PO만큼을 이동시키면 된다. 벡터 PO는 카메라 위치와 Object 중심을 잇는 직선의 연장선상에 있다는 것을 생각하면 계산이 간편해진다.
오브젝트 그리기
직사각형(FillRect) 그리기
- 왼쪽 위, 오른쪽 아래 좌표만 알면 그릴 수 있다.
- 사각형은 2개의 삼각형으로 구성된다.
- 실제 구현
직선(Line) 그리기
- 직선도 실제로는 너비를 가져야 렌더링이 가능하기 때문에 다음과 같은 구조를 가져야 한다
- vLine = vEnd - vStart
- normal(vLine과 수직인 벡터) = vLine × (-z방향 벡터) -> normalize하여 길이가 1인 벡터로 만듦.
- (u1, v1)과 (u1, v2)는 vStart ± (normal/2)
- (u2, v1)과 (u2, v2)는 vEnd ± (normal/2)
- 실제 구현
RPG Maker VX 분석
Actors.rvdata
- 툴에서 (데이터베이스/액터)에 해당
- 오프셋 3은 액터의 숫자+6
- (6F 3B)가 각 캐릭터 간 구분자의 역할을 하는 듯 보임
- 정보 테이블의 입력 순서는 매번 바뀌며 첫번째 캐릭터에서 제공함(구분자 0x3A)
두번째 캐릭터부터는 첫번째 캐릭터의 정보테이블 순서에 입각하여 입력하는 것으로 보임(구분자 0x3B)
- 첫번째 캐릭터의 데이터는 ID - @NAME - {TYPE} - VALUE 식으로 저장되어 있음
TYPE이 0x69(i)이면 정수(항상 +5되어 저장됨), (22 0B)이면 문자열이다
그다음부터의 데이터는 INDEX - {TYPE} - VALUE 식으로 저장되어 있다
- 정보 테이블
| ID | TYPE | NAME | 설명 |
| 0x08 | int | @id | INDEX |
| 0x0a | str | @name | 이름 |
| 0x0e | int | @class_id | 직업 ID |
| 0x0f | int | @weapon_id | 무기 ID |
| 0x0f | int | @armor1_id | 방패 ID |
| 0x0f | int | @armor2_id | 투구 ID |
| 0x0f | int | @armor3_id | 갑옷 ID |
| 0x0f | int | @armor4_id | 장신구 ID |
| 0x0f | int | @exp_basis | 경험치(기본) |
| 0x0f | str | @face_name | 얼굴 그래픽 그룹 이름(확장자 제외 파일명) |
| 0x10 | table | @parameters | 능력치 성장 곡선(뒤에 0x3a0a 붙은 후 Table 시작) |
| 0x10 | int | @face_index | 얼굴 그래픽 ID |
| 0x11 | bool | @super_guard | 강한 방어 |
| 0x11 | bool | @auto_battle | 자동 행동 |
| 0x12 | bool | @pharmacology | 회복약 효과 2배 |
| 0x13 | int | @initial_level | 초기 레벨 |
| 0x13 | int | @exp_inflation | 경험치 증가도 |
| 0x13 | bool | @fix_equipment | 장비 고정 |
| 0x14 | str | @character_name | 보행 그래픽 그룹 이름(확장자 제외 파일명) |
| 0x14 | bool | @critical_bonus | 잦은 크리티컬 |
| 0x15 | int | @character_index | 보행 그래픽 ID |
| 0x16 | bool | @two_swords_style | 이도류 |

