지난글에서 작성한 코드가 서로 다른 예제 2개를 섞어서 만든 코드였다. 그러다보니 문제가 생겼을 때, 그 문제가 어디에서 생겼는지 파악하기가 힘들어 예제 하나만 보고 코드를 다시 작성했다.
// obj_player
// Collision - obj_npc
if (!obj_textbox.visible)
{
if(keyboard_check_pressed(ord("Z")))
{
with(other)
{
with(obj_textbox)
{
ds_queue_copy(text_queue,other.text_queue);
visible=true;
draw_say="";
index=0;
my_say=ds_queue_dequeue(text_queue);
alarm=delay;
}
}
}
}
// obj_textbox
// Create
text_queue=ds_queue_create(); // 큐 생성
my_say=ds_queue_dequeue(text_queue); // 큐에서 꺼내온 문자열 저장
draw_say=""; // draw로 보여줄 문자열
index=0; // dtext의 문자에 글자 번째
delay=5; // 텍스트 출력 간격
visible=false;
// Alarm 0
if (index < string_length(my_say)) // 텍스트 하나씩 출력
{
index++; // 출력할 텍스트 위치 증가
draw_say+=string_char_at(my_say,index); // 큐에서 가져온 텍스트 내용을 출력 변수에 복사
alarm[0]=delay; // 텍스트를 모두 출력할 때 까지 반복
}
// Draw
// Draw GUI
draw_self();
draw_set_valign(fa_center);
draw_set_halign(fa_middle);
draw_text(x, y,string_copy(draw_say, 1, index));
// Key Pressed - X
if(visible)
{
draw_say=my_say; // 큐에서 가져온 텍스트 내용과 출력할 텍스트 내용을 같게 함
index=string_length(draw_say); // 글자 위치 맞춤
}
// Key Pressed - Z
if (alarm[0]==-1) // 출력할 문자가 없을 때
{
if(!ds_queue_empty(text_queue)) // 큐가 비어있지 않다면
{
my_say=ds_queue_dequeue(text_queue); // 큐에 문자열을 가져옴
draw_say=""; // 출력 변수 초기화
index=0; // 텍스트 위치 초기화
alarm[0]=delay; // 텍스트 출력
}
else // 큐가 비었다면(출력할 대화를 모두 출력 했다면)
{
visible =false; // 대화 종료
}
새로운 함수에 대해 알아보겠다.
- with문 : 어떤 인스턴스(들)에게 코드명령을 실행하라고 하는 문(괄호 안에는 인스턴스 id, 오브젝트 이름, all을 쓸 수 있음)
- other
- (with문에서)자기 자신을 뜻함
- ex) with(obj_test) { x=other.x; y=other.y;}라는 코드에서 x, y : obj_test의 x,y/other.x, other.y : 이 코드를 실행한 인스턴스의 x, y
우선은 변수명도 예제를 그대로 따라 만들었다. 이 부분은 나중에 수정될 수도 있다.
하지만 아직 한가지 문제가 남아있다. 대화 시작과 대화 넘기기 모두 Z키로 설정되어 있어 마지막 문자열을 출력하고 Z를 누르면 대화가 종료된 후 바로 다시 대화가 시작된다.
+)추가
문제를 해결했다. Press Key - Z 이벤트에 if(visible){ ... } 를 추가 하니 해결이 되었다. 다른 곳에는 이 조건을 추가했는데 여기에만 추가를 안해놓았다...