혹시 게임북이라는 도서 장르를 아시나요?
1980~1990년도에 대 유행한 어드벤처(모험)을 책을 읽으면서 느끼게 할 수 있었던 장르였습니다.
어느 특정 내용을 읽고 갈림길이 나오지요, "~페이지로 가세요" 류의 책들을 많이 아실 것이라 생각합니다.
최근에도 나오고 있더군요(최근 유행하는 마법 천자문 시리즈로 나오는 것을 보았습니다.)
비주얼 노벨의 원류는 텍스트 어드벤처이며, 게임북 / 텍스트 어드벤처 작품들이 가지고 있었던 갈림길은
"선택지" 로 표현됩니다.
<탐정퀴즈 게임, 각 페이지마다 이동지시가 나오고, 선택에 따라 다른 결말이 나온다. >
<KEY社의 클라나드>
선택지 시스템은 일본식 텍스트 어드벤처의 가장 특징적인 부분으로, 한방향이 아닌 여러갈레의 이야기가 나올 수 있게 만들어져 있습니다.
그렇기 때문에 선택지는 필수 사항이 되었습니다.
자세한 것은 연구실 메뉴의 글을 참조해 주시고, 본 강좌에서는 분기, 그리고 변수와 플레그(flag)를 이용한 분기를 알아 보도록 하겠습니다.
[Lecture 08. 분기 만들기.]
① select
선택하다는 뜻의 이 명령어는 선택지를 만들수 있는 명령어입니다.
먼저, 이 명령어를 사용하기 전에, 전 강좌에서 들었던 내용을 다시 언급하겠습니다.
지금까지는 scenario.txt 파일에 모든 명령어를 적었던 것에 비해, 분기는 다른 텍스트 파일을 필요로 합니다.
(물론 무조건 그렇게 하지 않아도 됩니다만, 수정을 할 시에 매우 어렵습니다.)
분기이기 때문에 2개 이상의 다른 텍스트 파일이 필요합니다.
그리하여 예제에서는 snr01.txt 와 snr02.txt 라는 다른 텍스트 파일 2개를 준비했습니다.
위에 예를 들었던 것처럼 선택지가 나타났음을 알 수 있습니다.
"유키에게 말을 건다" 를 선택하면 snr1.txt의 내용이 나타나고,
"교실에 간다"를 선택하면 snr2.txt의 내용이 나타납니다.
추후에도 계속 다루겠지만, 시나리오 파일을 불러오는 명령어인 loadsnr과 개념이 비슷하다는 것을 확실히 인지하셔야 합니다.
[명령어 Check]
loadsnr 텍스트파일
: 다른 텍스트 파일을 읽어온다.
이 명령어가 실행되면 지정된 파일을 읽게 되고, 추가적인 조치를 취하지 않는 이상 원래 파일로 돌아오지 않는다.
선택지를 더 추가시키시려면 다음 줄에 + snr3.txt 전화를 건다. 라는 식으로 추가를 시키시면 됩니다.
<이 경우에는 windowsize FULL을 넣어서 큰 화면에서 선택지를 넣으면 좋겠지요.>
여기서 더 좋은 모양으로 선택지를 나타낼 수도 있습니다.
바로 ncselect 명령어입니다.
아래와 같이 scenario.txt 파일에 적고, 실행시켜 봅시다.
사용법은 완전히 동일합니다만, ncselect 로 출력된 부분이 더 이해도 쉽고 보기가 좋기 때문에
개인적으로는 분기 명령어를 ncselect 로 사용하는것을 추천합니다(^^)
자, 가장 기본적인 분기방법을 배웠습니다.
하지만, 좀더 나가서 변수를 점목시켜서 분기를 짜게되면, 더욱 치밀한(!) 구성이 가능해집니다.
② init
이 명령어는 미소녀 게임에서는 특정 이벤트가 발생하기 위한 값을 의미합니다.
변수는 미소녀 게임에서 주로 호감도에 사용되는 요소입니다.
가령 예를 들어 소녀1이라는 케릭터를 공원에서 만나고, 다음날 다시 공원에서 만나는 경우
그녀와의 새로운 이벤트가 발생하게 되는 경우가 그런 것입니다.
앞에서 배웠던 분기의 개념과 특정 조건을 만족했을 때만 특정한 이벤트가 발생하게 만드는 것이야말로
진정한 의미의 분기의 목적이라고 할 수 있겠습니다 :)
프로그래밍을 공부하셨다면 변수 선언을 알고 계실겁니다. 안배우셨다고 하더라도 걱정은 꽉 붙들어매십시오.
매우 간단히 사용이 가능하니까요 ^^
변수의 사용은 다음 순서에 따릅니다.
① 변수 선언
② 변수에 값 대입
③ if구문을 이용하여 변수값에 맞는 결과를 출력
머리가 지끈거린신다구요?
괜찮습니다. 이게 전부입니다 ^^;
그림으로 쉽게 설명해 드리겠습니다.
① 변수의 선언
init 명령어가 이용됩니다.
사용법은
init 변수이름 = 초기값
으로 이용하게 됩니다.
변수이름 : 사용할 변수의 이름입니다. 예제에서는 호감도를 표현하기 위해 like라고 지정했습니다.
초기값 : 변수가 선언될때 가장 초기의 값입니다. 후에 변수에 값이 들어갑니다.
숫자(정수)와 문자가 들어갈 수 있습니다.
② 변수에 값 대입
set 명령어가 이용됩니다.
사용법은
set 선언한 변수이름 = 변수값
으로 이용하게 됩니다.
선언한 변수이름 : init로 선언한 변수의 이름입니다. 역시 예제에서는 like입니다 ^^;
변수값 : 여기서는 공원에 같이 갔을때 고백이 성공하게 하려합니다.
그러므로 공원에 갔을때(선택문에서 공원에 간다 선택시 snr1_1.txt로 가게 되겠지요?)
변수를 변화시켜야 합니다.
여기서는 1을 대입시켰습니다.
③ if구문을 이용하여 변수값에 맞는 결과를 출력
if 명령어가 이용됩니다.
앞에서도 배웠지만, 어떤 조건에 맞는지 검사하는 명령어입니다.
여기서는 공원에 갔다면 호감도(여기서 선언한 변수 like)가 올랐을때(여기서 공원에 간다를 선택시 like가 1이 되었죠?)
고백 이벤트가 성공하고, 집에 갔다면 호감도에는 변화가 없기 때문에 고백 이벤트는 실패합니다.
변수가 이용되었지만 if 명령어의 기본적인 사용법과 동일하게 괄호 안의 내용이 참이면 첫번째로,
거짓이면 두번째의 파일 내지는 라인을 읽게 됩니다.
※ snr2.txt파일을 참고하세요.
※참조
변수는 게임이 시작될때마다 값이 초기화 되기 때문에 사용자가 if 명령어가 나오기 전에 세이브 하고
다시 플레이하면 값이 초기값 그대로이기 때문에 이를 주의해서 시나리오 양을 조절하셔야 하셔야 합니다.
게임 저장을 하고 로드를 하시면 변수까지 저장됩니다만, 그것을 이용하여 스크립트를 짜시면 문제 없지만
개인적으로는 조금 더 어려워도 앞으로 배울 Flag명령어가 오류를 원천적으로 막는 방법이라 생각이 듭니다.
③ Flag
깃발이라는 뜻의 이 명령어는 어드벤처 게임에서는 특정 이벤트가 발생하기 위한 조건을 의미합니다.
변수를 이용하는 것과 같이, 분기를 만드는 쌍두마차라고 할 수 있겠습니다(거창하군요 ^^;)
먼저 준비해야 할 것을 들자면 아래와 같습니다.
⑴ 구상도. |
⑵ 각 상황에 맞는 텍스트 파일. |
구상도라는 것은 이벤트의 흐름을 어떻게 할 것인가를 정해놓은 것입니다.
저는 보통 분기를 만들때 아래와 같이 미리 그려두고 작업을 시작합니다.
위와 같이 개요를 만들어 두고, 분기를 짜야 치밀하고도 쉽게 만들 수 있습니다.
간단한 것 같아보이지만, 이 뒤에는 수많은 본인의 포크레인질이 있었습니다(침묵[...])
... 강요는 아니지만 삽질은 피하는 것이 좋은겁니다 ㅠ_ㅠ
개요를 만든 뒤에는 그에 맞는 내용을 준비해야겠지요.
snr1.txt에서 선택지가 2개입니다.
그렇기 때문에 snr1.txt 라는 파일에서 선택할 2개의 파일을 각각 snr1_1.txt snr1_2.txt 라고 해두었습니다.
그리고 파란 ※ 표시를 해둔곳을 플레그를 설정하기 위하여 미리 적어두었습니다.
snr2.txt에서는 snr1.txt 에서 무슨 선택지를 선택했는가에 따라 내용이 달라지게 설정해두었습니다.
그렇기 때문에 빨간 ※ 표시를 해둔곳을 플레그가 설정되어 있는지 체크하기 위하여 미리 적어두었습니다.
위의 구상도를 실제로 옮겨보도록 합시다.
* setflag : snr1_1.txt 파일에 있는 빨간 줄은 플레그를 설정하는 명령어입니다.
ifflag : snr2.txt 파일에 있는 빨간 줄은 플레그를 체크하는 명령어입니다.
ifflag park 뒤에 파일명이 2개가 적혀 있는데,
플레그가 설정되어 있으면 앞의 파일을 읽고, 없으면 뒤의 파일을 읽도록 되어있습니다.
따라서, 공원에 갔을때 park라는 플레그가 설정되어서(setflag), snr2.txt에서 플레그를 체크하여(ifflag)
snr2_1.txt를 읽게 되어 고백 이벤트가 성공합니다.
공원에 가지 않고 집에 가면 park 플레그가 설정되지 않아서 snr2_2.txt 파일을 읽게 되어 고백 이벤트가 실패합니다.
※ 첨부한 파일에 강좌를 참고하여 명령어를 바꾸어 시험해보세요^^
위의 분기 방법은 플레그를 이용한 방법이기 때문에 테스트 해보실때 공원에 간다를 먼저 누르시게 되면
플레그의 특성상 지워지지 않으므로, 나중에 다시 저 선택문에 돌아와서 집으로 간다고 선택문을 누른다 해도
고백 이벤트가 성공하는 알고리즘적 버그[...]가 있습니다.
이와 같은 버그를 방지하기 위하여 아래와 같이 수정하시면 해결됩니다만, 이해가 어려우신 분들은 일단 개념만을 익히시고,
나중에 익숙해지시면 도전해보시면 되겠습니다.
※ 논리적 플레그 사용법
: 아래의 "더 보기"를 눌러주세요.
강좌 파일.
Copyright ⓒ 2005-2009. 아우름이. All rights Reserved.
미디어 연구소(http://mediastudio.tistory.com/)
앞 강좌의 버퍼(buffer) 명령어를 배웠습니다.
버퍼 명령어는 주로 케릭터 CG에 이용되어서 자연스럽고 실제로 움직이는 듯한 효과를 주었습니다.
이번에는 배경 CG에 실제로 움직이는 듯한 효과를 줄 수 있는 명령어인 cgeffect와 cgeffect2 에 대해 알아보겠습니다.
역시 자주 이용되는 명령어 위주로 알아보겠습니다.
실력이 붙으시면 VNAP 제작 위원회에서 제공하는 스크립트 가이드만을 보더라도 충분히 부족한 부분을 알 수 있습니다.
본 강좌는 어디까지나 뼈대를 잡아드릴 뿐이니까요^^
[Lecture 07. 이미지 연출법.]
1. cgeffect
먼저, cgeffect 명령어의 일반적인 사용법입니다.
VNAP 제작 위원회에서 제공하는 스크립트 가이드를 열어보시면 아래와 같이 나올것입니다.
cgeffect effecttype time filename pos
⑴ effecttype : 효과 타입을 말합니다. 주로 FADETO, BLINDSHOW, SCROLL, QUAKE, ZOOMIN, ZOOMOUT 이 사용됩니다.
⑵ time : 그림 파일이 나타나는데 걸리는 시간을 의미합니다.
⑶ filename : 그림 파일을 적습니다.
⑷ pos : 세부 조정이 가능한 옵션입니다.
위에 든 일반적인 사용법에 맞춰 그대로 사용하시면 됩니다.
필요에 따라서는 모두 갖춰주어야 하는 명령어도 있고, 생략해도 되는 명령어도 있습니다.
여기서는 자주 사용되는 양식으로 설명하겠습니다 ^^
자, 그러면 직접 사용해 보도록 합시다.
① FADETO
배경 CG를 서서히 나타나게 하는 명령어입니다. 앞에서 배웠던 buffercg와 기능이 동일합니다.
사용법은 아래 스크립트를 참고하세요.
실행해 보시면, 아주 서서히 그림이 나타납니다.
cg 명령어보다는 cgeffect FADETO 명령어를 자주 이용하는 것이 깔끔한 작품을 만들 수 있습니다. ^^
② SCROLL
스크롤 기능을 말합니다. 즉, 그림이 좌 우 위 아래로 움직이는 효과를 말합니다.
하지만, 실제로는 긴 그림을 끌어주면서 보여주는 것이랍니다.
(애니메이션의 한 기법입니다 ^^)
자, 우선 그림 파일을 준비합시다.
필요한 그림 파일의 조건은 기본 크기에서 한쪽을 늘려주는 것입니다.
⑴ 왼쪽, 오른쪽으로 스크롤하기.
<명령어 체크>
LSCROLL : 이미지를 왼쪽으로 스크롤.
RSCROLL : 이미지를 오른쪽으로 스크롤.
준비물 : 왼쪽, 오른쪽으로 스크롤을 하려면 양 옆으로 긴 그림이 필요합니다.
예를 들어 1280*480 픽셀의 그림을 사용하면 왼쪽, 혹은 오른쪽으로 스크롤이 가능합니다.
물론 800*480같은 크기같이, 기본 크기의 가로 크기보다 크면 상관없습니다.
다만, 가로의 길이를 늘리되, 세로는 고정해야 합니다.
⑵ 위 아래로 스크롤하기.
<명령어 체크>
USCROLL : 이미지를 위쪽으로 스크롤.
DSCROLL : 이미지를 아래쪽으로 스크롤.
준비물 : 위 아래로 스크롤을 하려면 위 아래로 긴 그림이 필요합니다.
예를 들어 640*960 사용하면 위, 아래로 스크롤이 가능합니다.
역시 640*800 같은 크기같이, 기본 크기의 세로보다 크면 상관없습니다.
다만, 세로의 길이를 늘리되, 가로는 고정해야 합니다.
첨부 파일을 뜯어 고쳐 보시면서 익히시길 바랍니다.
③ BLINDSHOW
화면의 일부분을 가리면서 그림이 나타나는 효과입니다.
주로 장소의 이동시에 많이 이용되는데요, 이 명령어는 별도의 설명 없이 직접 사용해 보세요.
<명령어 체크>
LBLINDSHOW : 이미지를 왼쪽부터 블라인드효과를 적용해 출력.
RBLINDSHOW : 이미지를 오른쪽부터 블라인드효과를 적용해 출력.
UBLINDSHOW : 이미지를 위쪽부터 블라인드효과를 적용해 출력.
DBLINDSHOW : 이미지를 아래쪽부터 블라인드효과를 적용해 출력.
2. cgeffect2
위에서 다룬 cgeffect명령어와는 비교하면, cgeffect2 명령어는 별도의 연결 파일이 필요하며,
지정한 시간동안 효과는 지속된다는 점에서 다릅니다.
연결 파일은 VNAP의 플러그 인(Plug-In) 파일 모음인 RVPF(Ricanet VNAP Plugin Factory) 에서 제공합니다.
그리고, VNAP폴더에 cgeffect 라는 폴더를 생성한 후에 이 파일들을 복사해넣어야만 하지요.
그리고 vnap.ini파일을 열어서 아래의 빨간 줄과 같이 추가합니다.
CGEFFECT_DIRECTORY=".\cgeffect\"
RVPF의 플러그인 파일을 다운 받으셔서 VNAP폴더의 cgeffect폴더에는 화면효과이름.cpp 파일과
화면효과이름.dll파일을 복사해옵니다.
경우에 따라서는 추가적인 파일 모두를 복사해와야 합니다.
이 파트에서도 가장 널리 사용되는 명령어 위주로 설명하겠습니다.
① Rain
비가 내리는 효과를 가진 명령어입니다. 구조는 아래와 같습니다.
cgeffect2 rain 개수 수직 최대 속력 수직 최소 속력 크기
⑴ rain : rain 효과 타입을 사용합니다.
⑵ 빗줄기 개수 : 세부옵션. 한 화면에 나타나는 빗줄기의 개수. 수의 제한은 없으나 30~300의 값을 추천합니다.
⑶ 빗줄기의 수직 최대 속력 : 세부옵션. 빗줄기의 수직 최대속력. 10~50의 값을 추천합니다.
⑷ 빗줄기의 수직 최소 속력 : 세부옵션. 빗줄기의 수직 최소속력. 3~15의 값을 추천합니다.
⑸ 빗줄기의 크기 : 세부옵션. 빗줄기의 크기. 100~500의 값을 추천합니다.
세부 옵션은 모두 생략이 가능하기 때문에 아래와 같이 간단히 사용해봅시다.
② SmoothCu
부드럽게 화면을 전환시키는 명령어로, 위의 FADETO 명령어와 사용이 비슷합니다.
구조는 아래와 같습니다.
cgeffect2 SmoothCU 전환 시간 전환할 파일 페이딩 폭
⑴ SmoothCU : smoothCU 효과 타입을 사용합니다.
⑵ 전환 시간 : 몇 초동안 효과를 지속할지 결정합니다. 1000이면 1초동안 지속됩니다.
⑶ 전환할 파일 : 바뀔 화면 파일의 이름을 지정합니다.
⑷ 페이딩 폭 : 페이딩(바뀌는 부분) 될 픽셀의 폭입니다. 50이면 50픽셀씩 페이딩됩니다.
* 사용상 주의사항
해상도 제한 - 세로 768픽셀까지 가능합니다.
현재 왼쪽에서 오른쪽으로 페이딩하는 것만 지원합니다.
<변환 장면은 캡쳐가 안되는 고로[...]>
③ Snow
눈이 내리는 듯한 효과를 가진 명령어입니다.
구조는 아래와 같습니다.
cgeffect2 Snow 개수 수평 최대 속력 수직 최대 속력 수직 최소 속력 수평 최대 가속도 크기
⑴ Snow : Snow 효과 타입을 사용합니다.
⑵ 눈송이 개수 : 세부옵션. 한 화면에 나타나는 눈송이의 개수. 최대 제한 100개.
⑶ 눈송이의 수평 최대 속력 : 세부옵션.
⑷ 눈송이의 수직 최대 속력 : 세부옵션.
⑸ 눈송이의 수직 최소 속력 : 세부옵션.
⑹ 눈송이의 수평 최대 가속도 : 세부옵션. 빗줄기의 크기. 100~500의 값을 추천합니다.
⑺ 눈송이의 크기 : 세부옵션. 눈송이의 크기. 1000~2000의 값을 추천합니다.
이 역시 세부 옵션 모두를 생략 가능하기 때문에 아래와 같이 사용해도 됩니다.
<제가 예전에 연출한WA-DE 중 한 장면입니다. 부족하지만, 응용하면 이렇게도 만들 수 있습니다;;>
다른 명령어도 많지만, 가장 많이 사용되는 명령어에 대해 이야기했습니다.
나머지는 스크립트 가이드를 보시더라도 충분히 알 수 있는 내용이기에 생략하겠습니다.
첨부한 파일을 참고하시면서 뜯어고치며 공부하시길 바랍니다 ^^
강좌 파일
CG EFFECT모음(RVPF)
Copyright ⓒ 2005-2009. 아우름이. All rights Reserved.
미디어 연구소(http://mediastudio.tistory.com/)
지금껏 그림과 글을 띄우는 명령어를 배웠습니다만, 여타의 상용작품들과 비교했을때 만족스럽지 못한 부분이 많았을 것입니다.
특히 작품상에서 출력되는 그림이 썩 부드럽게 나타나지 않은 부분이 아쉬었으리라 생각합니다.
그렇지만, 버퍼(buffer)를 이용하게 되면, 부드러운 화면 연출이 가능하게 됩니다.
[Lecture 06. 버퍼(Buffer)의 사용.]
먼저 버퍼(buffer)에 대해 간단히 알아보면, 임시 저장공간을 의미합니다.
VNAP에서는 기본적으로 drawbuffer라는 명령어와 같이 사용하게 되는데요,
임시저장공간인 버퍼에 이미지나 글을 담고(buffer), 담은 파일을 화면에 뿌려주는(drawbuffer)구조로 되어있습니다.
VNAP에서는 주로 케릭터와 그림을 불러내는데 많이 이용하고 있습니다.
이번 강좌에서는 가장 많이 사용되는 명령어를 위주로 다루기로 하겠습니다.
① bufferchar
케릭터를 불러내는 char에서 앞에 buffer가 붙은 명령어입니다.
기본적으로 케릭터를 불러내는 명령어이지만, bufferchar 명령어는 둘 이상의 케릭터 CG를 출력했을때 주로 이용됩니다.
예를 들어, 두 케릭터중 한 케릭터만 사라지게 한다든가, 표정을 바꾸는데 이용되지요.
먼저, 케릭터를 부드럽게 나타내는 것부터 설명드리도록 하겠습니다.
지금껏 써왔던 char 명령어에서 출력되는 시간을 조절하는 것입니다.
아래는 비교를 해 두었습니다.
char 명령어는 케릭터가 처음 등장시에는 출력되는 시간을 조절하여 자연스레 나타나지만, 표정이 바뀔때에는 어색합니다.
하지만, bufferchar 명령어는 표정이 바뀌는 것도 자연스럽습니다.
bufferchar와 char 명령어가 다른점은 바로 명령어 뒤에 써주는 값들입니다.
그리고 출력되는 시간은 drawbuffer 뒤에 써주는 것이지요.
<스크립트 해석>
15번째 줄에 bufferchar 에는 임시 저장 공간에 아무것도 담기지 않습니다. (※ 자연스러운 표정변화를 위한 코드.)
17번째 줄에 bufferchar yuki_smile.png 에서 임시저장 공간에 yuki_smile.png 파일을 담습니다.
18번째 줄에 drawbuffer 1000 에서 1초동안 변화가 되며 yuki_smile.png 파일이 나타나게 됩니다.
아래는 하나의 케릭터만이 표정이 바뀝니다.
<스크립트 해석>
6번째 줄의 bufferchar yuki_smile.png 0 32 부분에서 임시저장공간에 yuki_smile.png 파일을 담습니다.
8번째 줄의 bufferchar misaki_surprise.png 296 48 부분에서 임시저장공간에 misaki_surprise.png 파일을 담습니다.
9번째 줄인 drawbuffer 100 에 와서야 yuki_smile.png 과 misaki_surprise.png 이 동시에 나타나게 되어,
결론적으로는 왼쪽의 케릭터의 표정이 바뀜을 알수 있습니다.
한 케릭터만을 지우려면 어떻게 할까요?
아래와 같이 표현할수 있습니다.
<스크립트 해석>
6번째 줄에 bufferchar에는 아무것도 담지 않습니다.
8번째 줄에 bufferchar yuki_smile.png 0 32 에서 yuki_smile.png이라는 파일이 임시저장공간에 담깁니다.
9번째 줄에 drawbuffer 100에서 yuki_smile.png 파일만이 출력되지요.
그렇게 하면 한 케릭터만 사라지는것을 볼 수 있습니다.
② buffercg
기본적으로 cg명령어와 기능이 비슷합니다만, 부드러운 화면연출을 가능하게 하는 명령어입니다.
여기서 출력되는데 걸리는 시간을 잘 조절해야 하는데요, 적당한 시간으로 맞추면 마치 동영상처럼 변하는 모습을 보실 수 있습니다.
강좌에 사용된 파일을 여기저기 고쳐보시면서 익히시길 바랍니다.
강좌 파일
P.S 중급 강의로 넘어왔으니 이미지는 자제[...]
-> 여러분의 수준이 올라갔다고 쓰고, 귀챠니즘이라고 읽습니다.(맞는다.)
Copyright ⓒ 2005-2009. 아우름이. All rights Reserved.
미디어 연구소(http://mediastudio.tistory.com/)