메뉴 건너뛰기

창작에 관련된 질문이나 간단한 팁, 예제를 올리는 곳

2편 : 기본적인 캐릭터 움직임

일단 강좌를 시작하기 전에 2가지 사항을 이야기 하겠습니다.
사실 안 읽으셔도 별로 상관없습니다.

/*------------------------------------ 주석인 셈입니다. -----------------------------------------------------------

1. 흥크립트 자동 대화창 기능에서 메모리 누수 현상이 발견되었습니다
치명적인 것은 아니지만 집의 메모리가 128MB이하라면 곤란할 수도?

처음에는 매 출력마다 대화창을 자동으로 크게에 맞게 그리는 식이었는데
속도 낭비가 너무 심해서 메모리를 할당해 미리 그린 후 빠르게 출력하게 했습니다.
그런데 어디가 잘못되었는지 계속해서 조금씩 메모리가 낭비되더군요.

1) 어쨌든 강좌를 하다보면 이것 저것 라이브러리의 문제점이 발견될지도 모르고
2) 아직은 대화창에 관련된 강좌는 하지 않을 것이고
3) 저 메모리 누수로 컴퓨터 다운 시키려면 상당히 대규모 게임을 만들어야 할 테니 발생할 확률도 적고
4) 자동대화창 기능을 그냥 없애고 싶지 않아서 손 볼려는 데, 시간이 꽤 걸릴 듯

이런 이유로 일단은 덮어 두겠습니다.


2. 과거에 문D라이브 강좌를 한 적이 있습니다.

1편
http://blog.naver.com/kfgenius.do?Redirect=Log&logNo=130014444939

2편
http://blog.naver.com/kfgenius.do?Redirect=Log&logNo=130014480937

3편
http://blog.naver.com/kfgenius.do?Redirect=Log&logNo=130014567046

4편
http://blog.naver.com/kfgenius.do?Redirect=Log&logNo=130014707401

대화창 클래스(CTextDlg) 빼고는 지금 버전에 그대로 적용되니
안 해보신 분은 이걸 연습해 보시는 것도 좋습니다.

//------------------------------------------------------------------------------------------------------------------------*/


그럼 다시 본론으로 돌아와서 더블 드래곤 같은 액션 게임 만들기 입니다.

Source2.zip

이걸 받아서 MoonD.sln이 있는 폴더에 풉니다.
하위 폴더 만드시지 마시고 그 자리에 풀어 주십시오.

원래는 Mayday님이 만드신 무투를 그대로 구현하는 게 쉬울 것 같아서 그걸 보여 드리려고 했는데
알고보니 그래픽 파일이 모두 xyz으로 되어 있어서 일단 접어두고,
이 샘플 소스로 하겠습니다. 여기 배경은 알만툴 것이고 그림은 독고진님이 그리셨던 건데...
뭐 설마 이거 가지고 뭐라고 하시겠습니까?
Mayday님은 혹시 괜찮다면 무투 소스 좀 보내주세요.
무투 그대로 재현하는 것을 강좌 3부터 해보도록 하죠.

일단 소스를 어디에 적어야 하나?
강좌1에 있었던 Sample에서 MoonD.sln을 더블클릭해서 프로젝트를 엽시다.
일단 main.cpp로 가야하는데 아무것도 안 떠 있다면...



화면 왼쪽이나 오른쪽 구석에 있을 솔루션 탐색기를 선택해서



main.cpp를 더블 클릭하십시오.
만약 솔루션 탐색기가 안 보이면 보기 메뉴에서 - 솔루션 탐색기를 선택하십시오.



VC++ 툴을 다루는 것은 그다지 어렵지 않으니 잘 익혀두십시오.
제가 하나하나 설명하기에 지면 낭비가 심할 듯 싶군요.

자, 이제 main.cpp가 열렸다면 고쳐야 할 부분은 친절하게도 주석 (일종의 설명으로 컴파일때는 처리되지 않고
코드를 작성할 때만 보여서 코드의 이해를 돕는 문장)이 달려있습니다.

//////////////////////////////////////////////////
//메인코드
//////////////////////////////////////////////////
int main(char* arg[])
{
     //창생성
     if(!MainInitialize("Sample", TRUE, FALSE, window_mode))return 0;

     //윈도우창이동
     if(window_mode)
     {
          jdd->OnMove(100, 100);
          SetCursor(LoadCursor(0, IDC_ARROW));
     }
    
     //메인실행
     while(!GetKey(vkey_esc))
     {
          if(!ProcessMessage())break;

          //이곳에게임을만듭니다.

          jdd->Render();
     }

     //정리하고끝내기
     jdd->DeleteFont(global_font);

     return 0;
}


바로 빨간 저 부분이지요.
저 주석은 지워버리고 새로운 코드를 적어봅시다.
팩맨 만들어 보신 분 있다면 이건 중복이겠지만 복습치고 해봅시다.

int main(char* arg[])
{
     //창생성
     if(!MainInitialize("Sample", TRUE, FALSE, window_mode))return 0;

     //윈도우창이동
     if(window_mode)
     {
          jdd->OnMove(100, 100);
          SetCursor(LoadCursor(0, IDC_ARROW));
     }

     jdd->LoadPicture("배경", "던젼6.jpg", NULL, true);
     jdd->LoadPicture("걷기1", "w1.gif", NULL, true);
     jdd->LoadPicture("걷기2", "w2.gif", NULL, true);
     jdd->LoadPicture("걷기3", "w3.gif", NULL, true);

     //메인실행
     while(!GetKey(vkey_esc))
     {
          if(!ProcessMessage())break;

          jdd->DrawPicture(backbuffer, "배경", 0, 0, NULL);
          jdd->DrawPicture(backbuffer, "걷기1", 100, 100, NULL);

          jdd->Render();
     }

     //정리하고끝내기
     jdd->DeleteFont(global_font);

     return 0;
}

간단하게 그림을 읽어 들이고(LoadPicture) 그림을 출력(DrawPictrue)하는 겁니다.
각각 어떻게 쓰는지 봅시다.

jdd->LoadPicture("그림 이름", "파일명", NULL, true);

식으로 씁니다.
뒤에 NULL과 true는 신경 끄시고 그냥 저렇게만 적어 주면 됩니다.
아마 저걸 알 필요는 없을 겁니다.

ID값은 프로그램 내에서 저 그림에 부여하는 이름입니다.
나중에 저 그림을 부를 때 쓸 이름이죠.
그리고 뒤에는 파일명, 그림파일의 지금 현재 작업 폴더로 부터 상대 경로를 적어주면 됩니다.
절대 경로 적어주셔도 먹힙니다.
단, 다른 컴퓨터에 다른 폴더가 된다면 작동 안 하니까 절대 경로는 쓰지 마십시오.

어쨌든 위에서는 "던젼.jpg"라는 그림을 "배경"이란 이름을 붙여 불렀군요.

여기서 또 하나!

게임의 메인 루프는 while의 안입니다.

 while(!GetKey(vkey_esc))
{
     (이 안)
}

LoadPicture 명령은 반드시 이 밖에서, 루프가 시작되기 전에 해야합니다.
루프는 보통 1초에 100번 도는데 로드 같은 작업을 1초에 100번 시키면 난리납니다.
그러니까 루프 들어가기 전에 딱 한번!

그럼 이번엔 불러 들인 그림을 출력해 봅시다.

jdd->LoadPicture(backbuffer, "그림 이름", X좌표, Y좌표, NULL);

역시 다른 부분은 신경 끄고 파란 부분만 봅시다.
눈치 있으신 분은 알겠지만 해당하는 X좌표와 Y좌표에 불러 들인 그림을 찍는 겁니다.
지금 게임에서는 "배경"이란 그림을 X:0 Y:0 에 찍고 있는 겁니다.
"걷기1"이란 그림은 X:100 Y:100 에 찍고요.

제대로 하셨다면 아래와 같이 출력 될 겁니다.




다음은 캐릭터를 이동시켜 봅시다.
지금은 100, 100에 무조건 찍게 되어 있습니다.
이걸 바꿔야 겠죠?

변수라고 아십니까? 모르는 분들도 있을 테니 설명을 하겠습니다.
변수는 간단히 변하는 수입니다.

지금 코드에 적어놓은 100, 100은 무슨 일이 있어도 변하지 않습니다.
프로그램을 잡고 온갖 난리를 떨어도 100, 100은 100,100입니다.

그럼 어떻게 해야 할까?
이렇게 해야 합니다.

 jdd->DrawPicture(backbuffer, "걷기1", x, y, NULL);

숫자 대신 x와 y라고 적었습니다.
이게 변수입니다.
그런데 이렇게 쓰고 실행시켜 보면 에러가 날겁니다.
왜냐면 C++에는 선언이 필요하기 때문이죠.

while이 시작되기 전에 변수를 선언해줍시다.

int x = 100;
int y = 100;

int란 정수란 뜻입니다. integer죠.
'변수 x는 내가 정수로 쓸텐데 일단 초기값은 100이다.' 라고 선언하는 겁니다.
프로그램에게 선언하는 거죠. 나 이렇게 쓸거야 하고.

이것만 넣고 테스트 해봐야 같을 테니 소스를 이렇게 바꿔봅시다.
선언부분도 포함해 두었으니 이걸 보고 아까 코드를 수정해 봅시다.


//////////////////////////////////////////////////
//메인코드
//////////////////////////////////////////////////
int main(char* arg[])
{
     //창생성
     if(!MainInitialize("Sample", TRUE, FALSE, window_mode))return 0;

     //윈도우창이동
     if(window_mode)
     {
          jdd->OnMove(100, 100);
          SetCursor(LoadCursor(0, IDC_ARROW));
     }

     jdd->LoadPicture("배경", "던젼6.jpg", NULL, true);
     jdd->LoadPicture("걷기", "w1.gif", NULL, true);
     jdd->LoadPicture("걷기", "w2.gif", NULL, true);
     jdd->LoadPicture("걷기", "w3.gif", NULL, true);

     int x = 100;
     int y = 100;

     //메인실행
     while(!GetKey(vkey_esc))
     {
          if(!ProcessMessage())break;

          if(GetKey(vkey_up,1))y-=5;
          if(GetKey(vkey_down,1))y+=5;
          if(GetKey(vkey_left,1))x-=5;
          if(GetKey(vkey_right,1))x+=5;

          jdd->DrawPicture(backbuffer, "배경", 0, 0, NULL);
          jdd->DrawPicture(backbuffer, "걷기", x, y, NULL);

          jdd->Render();
     }

     //정리하고끝내기
     jdd->DeleteFont(global_font);

     return 0;
}

이렇게 고친 후 실행 해 보면 키 조작에 의해서 상하좌우로 이동하는 캐릭터를 보실 수 있습니다.
일단 GetKey부터 설명해야 겠군요.

GetKey(키ID, 연속입력 간격)

키 ID는 반드시 지정된 것을 써야 인식을 합니다.
약 90여개가 있지만 사실 그 키들을 다 쓸 일은 없을테고 나올 때마다 설명하기로 하죠.
처음부터 다 알고 싶은 분은 donglib.h에서 vkey로 검색해 보시길.
다 정의되어 있습니다.

아무튼 해당 키ID의 입력이 들어오면 GetKey는 '참'이란 값을 돌려 줍니다.
'참'이란 값을 돌려 주다니? 무슨 소리... 라고 아직 C++의 표현에 익숙하지 않으신 분들을 일단 넘어갑시다.
나중에 if 이야기하면서 설명하겠습니다.

다음 값인 연속입력 간격에 대해 설명하겠습니다.
일단 저 값을 안 적고 GetKey(vkey_up)으로 한번 바꿔 보십시오.
그러면 위쪽 화살표를 누른 순간에만 인식을 하고 그 후로는 안 먹힙니다.
손을 뗀 후 다시 눌렀을 때 먹힙니다.
이동 할 때마다 따다다닥 눌러 댈 순 없으니 꾹 누르고 있으면 그냥 움직이게 하고 싶겠죠?
그럴 때는 저 값을 적어줍니다. 1이라고 적으면 1/100초를 기다렸다가 다시 확인해본다는 겁니다.
1/100가 지나서 다시 확인해봤는데도 누르고 있는 상태라면 해당 이벤트를 한 번 더 일으킵니다.
확실히 익히시고 싶으시면 저 값을 바꿔 보십시오. 마이너스 값은 의미 없습니다.
단, -1은 특별 값으로 -1을 적으면 한 번 인식한 후 뗐다가 다시 누를 때까지 인식하지 않습니다.
아무 것도 안 적었을 때와 같은 값이죠.

그럼 if를 볼까요? 게임에서는 if가 가장 중요합니다.
조건문 없이는 게임이 아닌 영화가 되겠지요. 뭐 잡설은 그만하고.

if(GetKey(vkey_up, 1))y-=5;

풀어서 설명해 보겠습니다.

만약 GetKey에서 '참'이란 값을 주면 y를 5 감소(y-=5)시켜라.

...란 뜻입니다.
아까전에 참, 거짓을 이야기 했는데 그것은 이 if를 위한 것이지요.
if는 돌아온 참이면 그 다음에 적힌 코드를 실행하고
거짓이라면 그냥 쌩까 버립니다.
그런 녀석이지요.

GetKey는 위쪽 화살표(vkey_up)를 눌렀을 때만 참이란 값을 돌려 주므로
위쪽 화살표를 누르지 않는 한 y-=5는 실행되지 않는 것이죠.

마찬가지로 밑에는 아래쪽 화살표(vkey_down), 왼쪽 화살표(vkey_left), 오른쪽 화살표(vkey_right)에 의한 반응들입니다.


어느 정도 이해하셨는지 몰라도 모르시는 것 있으시면 나중에 물으시도록 하십시오.
일단 지금은 캐릭터가 그냥 화면을 벗어나 버릴 겁니다.
그걸 막아야 겠죠.
그걸 위해 이 코드를 추가합니다.


  if(x<0)x=0;
  if(x>SCREEN_X-19)x=SCREEN_X-19;
  if(y<0)y=0;
  if(y>SCREEN_Y-29)y=SCREEN_Y-29;


어디에 추가해야 되고 무슨 뜻인지는 과제로 남기겠습니다.
만약 캐릭터가 화면을 빠져 나가지 않는다면 성공한 것입니다.

흑곰

2008.04.18
07:24:55
(*.146.136.211)

잘 봤습니다. 비베로 구현해 본 것이라 쉬웠구요.
다만 GetKey를 Getkey로 쓰는 바람에 빌드가 안되어 고생 좀 했습니다.

jdd->LoadPicture("배경", "던젼.jpg", NULL, true);은
jdd->LoadPicture("배경", "던젼6.jpg", NULL, true);이었구요.

3강은 언제쯤 되나요?

똥똥배

2008.04.18
09:16:18
(*.193.78.73)
흑곰//"던젼6.jpg"로 수정했습니다.
3강은 내일 출발하기 전에 아침에 끝낼려고 하는데 가능할지 어떨런지...
안 그러면 워크샵 다녀온 토요일이 되겠군요.
이미 과거에 해봤던 흑곰님과 대슬님에겐 죄송하지만 다른 분들도 생각해서 천천히 가겠습니다.

다른 분들도 '어려웠다', '보통이다', '쉬웠다' 정도라도 적어주십시오.
레벨 조정을 위해서...

A.미스릴

2008.04.19
03:02:00
(*.234.10.203)

근데 While문이 1/100초마다 돌아가는거였나여?
전 While문이랑 For문 둘다 그냥 CPU가 되는 한 간격을 두지 않고 온 힘을 다해 끊임없이 루프하는줄 알았는데요 ㅡ,.ㅡ;

Mayday

2008.04.19
10:16:40
(*.106.221.253)

아니 캐릭터소스는 제가 공개하기도 전에 하드에서 날려먹었던 게임에 있던 소스인데
어떻게 구하셨지..;;;;;

똥똥배

2008.04.19
23:27:12
(*.193.78.73)
Mayday님이 저한테 주신 겁니다.
그때 제가 프로그래밍하고, Mayday님이 그래픽해서
열혈물어같은 게임 만들어보려고 했었죠.
아쉽게도 실패했지만...

똥똥배

2008.04.24
03:26:44
(*.239.144.2)
A.미스릴//while문이 1/100초에 도는 것이 아닙니다.
jdd->Render(); 이부분에서 프레임 수를 1/100로 조절하는 겁니다.
왜냐면 컴퓨터 사양에 따라서 어디서는 빠르게 돌아가고 어디서는 늦게 돌아가면 안 되니까요.
보통 1/100초 전에 작업이 끝나게 되고 jdd->render에서는 1/100초가 될 때까지 대기를 하게 됩니다.
List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
105 흥크립트 또 질문 [2] A.미스릴 1712   2008-01-02 2008-03-17 04:37
@그림 0, "XX"를 했었는데 그후 나중에 @그림 0, 'YY"를 해서 그림을 바꿔버릴 수 있나요 추가로 다음버전에서 {{사람이름}체력} 형식도 사용할 수 있게 해주세요 * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:00)  
104 아아, 그렇다면... 흥크립트에서 [1] 장펭돌 1712   2008-02-02 2008-03-17 04:37
제가 타이틀을 만들고 나서 @마우스지원 해놓고 나니까 선택지에서 키보드로 선택할수 있는 커서가 사라지더라구요? 이건 원래 그런건지... 키보드로 선택해도 되긴 되는데 커서가 없어서 지금 뭘 고르고 있는건지 알수가 없는데.. 원래 이런건가요? 으음, 그...  
103 질문 하나더. [3] 흑곰 1715   2008-02-13 2008-03-17 04:37
1 아무 것도 없이 빈 줄 혹은 주석이 속도에 영향을 미치는지. @이동 등에서 영향을 미칠 것으로 추측됨. 2 @이동 -1 을 하면 무시되어 다음 줄을 읽게 되나요? * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:26)  
102 흥크립트로 만든 예제 4 file 대슬 1723   2007-12-02 2008-03-17 04:37
 
101 흥크립트 질문 [3] A.미스릴 1729   2007-12-07 2008-03-17 04:37
마우스 커서 생겼을때 마우스 커서의 좌표를 취득할순 없나요?-0-; * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:00)  
100 똥똥배님께 질문 [6] 흑곰 1730   2008-01-09 2008-03-17 04:37
1. 시스템메모리와 비디오메모리의 차이는 무엇입니까? 각각의 장단점은 무엇인지..? 그리고 무엇을 (주로) 사용하시는지? 2. 흥크립트는 txt파일을 한줄 읽고 처리하고, 또 한줄읽고 처리하나요? 아니면 전부 다 읽고 몇줄씩 한꺼번에 처리하나요? 3. 한줄읽...  
99 흥크립트 질문 [1] 장펭돌 1733   2008-02-01 2008-03-17 04:37
흥크립트에서 if처럼 변수1이 1이면 어떻게되고 변수1이 2면 어떻게되고 이렇게 어떻게하나요? 역전심판에서 1+1 답 얘기할때, 정답을 말하느냐 오답을 말하느냐에 따라서 달라지는것 처럼 말이죠... 봐도 잘 모르겠네요... * 똥똥배님에 의해서 게시물 이동되...  
98 갑자기 급질문.. 궤레브 1737   2008-02-08 2008-03-17 04:37
별 특별한건 아니구요 변수 강좌 보니까 ? 가 사용되더라구요? ?는 무슨 의미인가요? [분기] ([레벨]==16)?91:[분기] [분기] ([레벨]==15)?92:[분기] [분기] ([레벨]==14)?93:[분기] [분기] ([레벨]<=13)?94:[분기] @이동 [분기] 여기서 보면 [레벨]==16 이런...  
97 액션알피지 원거리 무기 질문 [8] 아리포 1741   2006-01-18 2008-03-17 04:37
원거리 무기를 가까이에서쏘면 연속으로 발사됩니다 계속 ;; 아주빠르게 이거 어떻게 고침 * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:24)  
96 조건분기할 때 [5] 흑곰 1745   2008-02-12 2008-03-17 04:37
&& and || or == 같다 != 같지 않다 원래 vc++ 에서 쓰는 것인데 흥크립트에도 쓰여요. (마지막 것은 확인 못해봤음) 흥크립트도 조건문을 활용하면 if문이 가능합니다. if문을 여러개 구현하다보면 그렇게 빠르진 않은 것 같습니다만 * 똥똥배님에 의해서 게...  
95 흥크립트 질문.. [3] 궤레브 1747   2008-02-07 2008-03-17 04:37
흔히 알만툴에서 쓰이는 조건분기를 어떻게 쓰나요? 펭돌님 말로는 if문이 있다던데.. 그리고.. 흥크립트 테스트인가? 슬라임같이 생긴 사람이 돌아다니면서 사람들 만나면 대화 나오게 만드신게 있더군요? 거기서처럼 그냥 아무 추가 이벤트가 없어도 꺼지지 ...  
94 마우스 포인터 바꾸기가 안되네요... +질문2 장펭돌 1748   2008-02-04 2008-03-17 04:37
어떻게 해도 자꾸 마우스 모양이 안보이길래... 아예 mlc 파일을 DATA폴더 밖으로 꺼내고... System.txt와 같이 둔 상태로 그림 파일명이 "마우스" 이므로.. {#커서} "마우스" 이렇게 해봤는데도 안되네요... 으음,, 어떻게 해야하는겁니까... ㅇ 질문 2 "DIVX...  
93 흥크립트배경 어떤식으로 넣어야됨? [2] 세균맨 1751   2007-12-10 2008-03-17 04:37
갈쳐주셈 그리고 그림 순서 똑같게 잡으면 뭐나옴? * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:00)  
92 흥크립트 버그발견 [7] 네모상자 1754   2008-01-22 2008-03-17 04:37
한 줄에서 맨 앞에 {글자변수}를 사용하면 인식하지를 않음 예) {쥔공이름} : 네, 제 이름은 {쥔공이름}입니다(인식안함) 네, 제 이름은 {쥔공이름}입니다(인식함) * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:03)  
91 흥크립트 다루다 보니 알아낸게 있는데... [4] 네모상자 1765   2008-01-18 2008-03-17 04:37
그림이 없으면 대화창이 투명해지지 않는군요. * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:03)  
90 [re] 흥크립트 질문 똥똥배 1782   2008-02-01 2008-03-17 04:37
조금 복잡하지만 이렇습니다... ====================================== [분기] ([레벨]==16)?91:[분기] [분기] ([레벨]==15)?92:[분기] [분기] ([레벨]==14)?93:[분기] [분기] ([레벨]<=13)?94:[분기] @이동 [분기] ^91 당신의 랭크 : S @이동 95 ^92 당신의...  
89 흥크립트에서 반복문 실행하기 (덤추가) [9] 대슬 1790   2007-12-01 2008-03-17 04:37
[엔] 0 ^0:연산하는부분 //원하는 연산 내용을 자유롭게 적으면 됩니다. [엔] [엔]+1 ^1 [체크] ([엔]==10)?2:0 //↑[엔]의 값이 10인지 아닌지를 판별하고 10이면 [체크]에 1이, //10이 아니면 [체크]에 0이 들어갑니다. ([엔]==10)에서 10부분에 다른 수를 //...  
88 [re] 흥크립트 질문.. [2] 똥똥배 1797   2008-02-07 2008-03-17 04:37
>흔히 알만툴에서 쓰이는 >조건분기를 어떻게 쓰나요? 펭돌님 말로는 if문이 있다던데.. >그리고.. >흥크립트 테스트인가? 슬라임같이 생긴 사람이 >돌아다니면서 사람들 만나면 대화 나오게 만드신게 있더군요? >거기서처럼 그냥 아무 추가 이벤트가 없어도 ...  
87 클릭 문제.... ㄱ- [1] 장펭돌 1801   2008-01-31 2008-03-17 04:37
~클릭 100, 123, 0, 276, 186 @계속 ^100 이벤트 발생! 그림판에서 좌표수를 확인하고나서 123,0 부터 276,186의 위치를 위 처럼 정한뒤 흥크립트 실행후 아무리 클릭해봐도 안되네요... 또하나 궁금증은 창모드가 아닌 전체화 모드에선 마우스가 안나오는데.....  
86 마우서 포인트 바꾸기 질문 다시 ㄱ- [2] 장펭돌 1807   2008-02-05 2008-03-17 04:37
똥똥배님이 알려주신대로, DATA 폴더내에 mlc 파일을 하나 생성하고, 커서에 "파일명" 이렇게 재대로 했는데.. 안됩니다. 똥똥배님은, Global.mlc 를 이용할수 있지만, 저는 Global.mlc 내에 그림파일을 추가시킬수가 없어서 안되는거 아닙니까? * 똥똥배님에 ...