GameXP → DreamFactory로 바뀌다?

by 아방스 posted Jun 08, 2009
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

아래 내용은 gamexp개발자이신 하앙이(kernys)님이 작성하신 글입니다.

 

DreamFactory 라는 이름은. 예전에 끼로형이 만든 아마추어 게임 개발팀에서 쓰였던 이름인데..

아까워서 내가 몰래 훔치게(?)되었다..

끼로형은 착해서 이해해주겠지...

-------

GameOVEN을 보고 약간 실망감을 갖게되어 그 툴이 가진 단점을 보완하면서 더욱 좋은 기능을 담고자 한 툴이다..
(간단히 말해서 GameXP가 바뀐 것이라고 보면된다..)

사실상 GameXP를 개발하면서 많은 회의감을 느꼈던 것이.. 차라리.. 게임 개발툴이면 범용 게임을 만들 수 있는 것이 낫지 않느냐..

RPG 제작툴을 베껴서 온라인 RPG 제작툴을 만들다니.. 뭔가 좀 그래보였다..

여튼... 각설하고... DF의 커다란 기능은 '블럭 배치 기반 제작' 이라는 점인데

이것은 맵이든 어떤 캐릭터든지 간단히 화면에 배치하는 것으로 게임을 만들 수 있다는 점이다.

블럭은 두가지 종류가 있는데 하나는 엔진에 내장되어있는 내장 블럭이고,
나머지는 외부에서 설치할 수 있는 외장 블럭이다..

기본적으로 제공되는 내장 블럭 :

Timer
Camera
HelloGUI(비주얼적으로 GUI를 디자인 할 수 있는)
Image
Sprite(참고 : 플래시와 비슷한 기능을 제공해야한다.)
BgMusic
Sound
Character
Controller(키보드나 마우스로 캐릭터 조정을 위한)

기본적으로 제공되는 외장 블럭 :

ToriMapTool(RPG 맵 형식의 제작을 위한)
NetReady(네트워크 기능을 위한)
ShootingMapTool(슈팅 맵을 제작 할 수 있는)
ABParticle(3차원 화면 이펙트를 만들 수 있는)

(모든 블럭은 스크립트와 연결되어 하나의 클래스 정의와 대응한다.)

HelloGUI에 제공되는 서브 블럭 : Button, Image, Label, Textbox, Listbox, Combobox, Progressbar, Dialog

블럭에는 각각의 블럭 에디터가 있고, 이 블럭 에디터를 통해서 모양이나 기타 설정 등을 변경할 수 있다.
그러나 맵 블럭 에디터의 경우에는 프로젝트의 저장소에 저장된 맵을 가지고 만지작 하는 역할만 한다..

★ 유저가 직접 블럭의 클래스를 상속하여 자신만의 블럭을 만들 수도 있다.. 이런경우 스크립트를 작성하고 블럭 관리자에서 연결하는 방식으로 해야할 것이다.
★ 연결되는 블럭은 각 개별 설정이 있고, 게임 전체에 해당되는 설정이 존재한다.

-------

일단 게임 프로젝트를 처음 만들게 되면 스크린이라는게 하나 만들어진다. 그리고 이 스크린을 기반으로 게임 화면이 완성되어지게 된다. 여기에다가 이미지를 배치하거나 배경음악을 배치함으로써 게임 화면을 구성할 수 있다..

그리고 각 블럭에는 이벤트가 존재하는데.. 이 이벤트를 통해서 게임 흐름을 조정할 수 있다..
예를 들면 버튼을 하나 화면에 배치했는데 이 버튼의 '클릭했을 때'의 이벤트를 스크립트에 연결한다면 그 스크립트에서 버튼을 클릭한 후 어떤 일을 할 것인지 결정할 수 있다.
(그런데, 여기서 스크립트의 갑작스런 도입은 순수하게 게임을 만들고자 했던 유저들을 바깥으로 내몰 수 있으므로, 스크립트를 프로그램에서 마우스와 간단한 키보드 조작으로 작성할 수 있는 기능이 꼭 필요하다.)

스크린도 하나의 클래스에 대응하며, 스크린 내에서 정의된 블럭을 접근하는 것은 내장 변수로 접근해주면 된다..

아마 이것 처럼..
 카메라.FadeOut();

-------

오른쪽 탐색 창에는 각 스크린과 그 안에 있는 블럭을 관리할 수 있는 트리 구조로 되어있으며, 사용자가 가상 폴더를 만들어 묶어서 그것들을 관리할 수도 있다.
예)
-테스트스크린
  - 리소스
    - 이미지1.png
  - 블럭
    - 게임맵
    - 내캐릭터

블럭은 자기 자신을 복제할 수 있다. 그래서 슈팅 게임에서도 총알 한개를 미리 만들어 놓고 그것을 유저가 키 입력시 복제하여 발사하도록 할 수 있다.

또한 각 스크린에는 임의로 폴더를 만들 수 있어 그 안에다 배치한 블럭들을 모아 보관할 수 있다.(그러나, 화면 우선순위에는 영향을 미치지 않는다.)

블럭 안에는 또 다른 블럭을 만들어 계층 구조를 만들어낼 수 있으며, 이것은 해당 부모 블럭의 속성에 따라 가능여부가 결정된다.

-------

배포 방식은 두가지가 있을 것이다.. 풀 버전 배포 방식과, 패치 파일 배포 방식.
풀 버전은 말 그대로 압축화 해서 풀 버전으로 배포하는 것이고, 패치 파일 배포 방식은 이전에 작성된 배포 정보를 바탕으로 새로운 패치 정보를 작성해주는 기능이다. 아마 CRC32 라이브러리가 쓰이지 않을까 한다...

그리고 패키징시에는 Zlib를 기본적으로 사용할 것인데 여기서 특정한 알고리즘을 사용하여 해당 키를 넣어야만 열릴 수 있도록 해야 할 것이다.. Zip파일과 같은 암호화 방식을 쓰자..

-------

기본적으로 블럭에 제공되는 프로퍼티
 - Name : 구별되는 이름(중복될 수 없다.)
 - ID : 각 블럭을 구별하는 아이디, 기본값은 -1
 - Lock : 몇번 잠겼는가(잠기면 블럭은 마우스나 키보드 이벤트를 받을 수 없다.)
 - Position(x,y,z) : 3차원 위치
 - Direction(x, y, z) : 3차원 방향
 - CollisionCheck : 충돌 체크를 사용할 것인가 ?
 - Tag : 데이터 보관 장소(기본적으로는 문자열이나 스크립트를 통해 여러가지 저장 가능)
 - BaseClass : 기반이 되는 클래스(비어있으면 기본적으로 해당 블럭 클래스로 지정됨)
 - Visible : 출력되는가 ?

-------

기본적으로 블럭에 제공되는 이벤트
 - OnScreenIn : 화면 안으로 들어왔을 때
 - OnScreenOut : 화면 밖으로 나갔을 때
 - OnCollision : 다른 블럭과 충돌 하였을 때
 - OnUpdate : 매 프레임마다 실행
 - OnGo : 이동을 시작할 때
 - OnStop : 정지 했을 때
 - OnChangeDirection : 방향을 바꿨을 때
 - ExportingData : 외부에 블록 고유의 데이터를 내보냄.
 - ImportingData : 외부로부터 블록 고유의 데이터를 전송받음.

-------

Undo/Redo 기능이 필요함.
레퍼런스 카운터를 가지고 객체를 연결함.

-------

DreamFactory의 게임 제작툴인 DreamMaker를 제외하고는 모두 C++로 만들것이며, DreamFactory는 CLI로 만들 것이다..(C#으로 하려다가.. C++와 C#을 연결할때 토나올 것 같아서..)

엔진의 그래픽은 DirectX를 사운드는 FMOD(이건 좀 고려해봐야함 .. 왜냐하면 상업적이게 되면 돈을 내야하기 때문에..)를 쓸것이다..

스크립트는 Squirrel-Lang을 쓸것이다.. 이전에 한번 쓰려고 했다가 낭패를 봤던적 있는데.. 한글 프로그래밍 그리고 객체지향 프로그래밍을 위해서 어쩔 수 없이 도입하게 되었다..

-------

* 아직 고민하고 있는 문제들

1. 메모리에 로드된 모든 리소스들을 어떻게 효율적으로 관리할 것인가..
아시다시피 미니 게임의 경우엔 문제가 없다.. 그러나 RPG와 같이 지속적으로 컨텐츠가 추가되는 게임에서 문제가 되는데 이건 현재 레시아 온라인도 마찬가지이다.. 지금 대안으로는 일단 3가지 정도를 지원하려고 한다.. 화면이 닫힐 때 까지 계속 지속되는 방식과 일정 시간 사용하지 않으면 해제되는 방식, 유저가 임의로 해제하는 방식..
이부분은 게임 프로그램에 있어서 핵심적인 부분이므로 꼭 다시 짚어볼 필요가 있다.