게임메이커 스튜디오 2 - 텍스트 창에 텍스트 출력 (2)

TXMAY·2023년 3월 12일

GMS2

목록 보기
3/4
post-thumbnail

지난글에서 작성한 코드가 서로 다른 예제 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){ ... } 를 추가 하니 해결이 되었다. 다른 곳에는 이 조건을 추가했는데 여기에만 추가를 안해놓았다...

profile
게임 개발 공부하는 고양이

0개의 댓글