1. 소개


이번 시간에는 이벤트 함수에 대해 알아보도록 하겠습니다. 제가 업로드했던 4인 리치마작 (역, 부수 자동계산)을 예로 들면, 마작패를 '오름패'자리에 놓았을 때, '화료'버튼이 생성되고, '오름패'자리에 마작패가 없으면 '화료'버튼은 사라지게 됩니다. 이처럼 특정한 상황에서만 스크립트를 작동되도록 하는 함수를 이벤트 함수라고 합니다.

2. 준비

2-1. 구상

스크립트 구역을 지정하고, 오브젝트가 스크립트 구역에 있을때는 버튼이 생성되고, 스크립트 구역을 벗어나면 버튼이 없어지도록 해 봅시다.

2-2. 테이블 준비

스크립트 구역 하나와 Red Checker와 White Checker를 하나씩 생성합니다. 테이블을 저장한 뒤, 불러옵니다.

3. 스크립트 작성


이번 스크립트는 Global에 작성하도록 합니다. 우선 스크립트 구역의 GUID를 정의합니다.

scriptZone_guid = 'aa7359'
3-1. 버튼 생성 함수 작성

버튼의 Parameter를 작성하고 버튼을 생성하는 함수를 작성합니다. 다만, 버튼을 생성할 오브젝트는 상황에 따라 Red Checker일 수도 있고, White Checker일 수도 있습니다. 그렇다면 오브젝트를 미리 정의해서는 안 될 것입니다. 오브젝트는 함수의 인자를 통해 전달받아, 각 상황마다 전달받은 오브젝트에 버튼을 생성하도록 합니다.

function loadButton(obj)
    button_parm = {
        click_function = 'buttonClick',
        function_owner = Global,
        label = 'Test Text',
        width = 0,
        height = 0,
        position = {0, 0.5, 0},
        font_size = 200
    }
    obj.createButton(button_Parm)
end

크기가 0인 버튼

위 함수에서 버튼의 Parameter를 보면 width와 height의 값이 0인 것을 확인할 수 있습니다. 버튼의 크기가 0인 셈입니다. 게임 내에 문자열을 띄우고 싶을 때, 제가 주로 이용하는 방법입니다. TextTool을 이용할 수도 있지만, 이는 게임 중 유저가 좌측 메뉴에서 문자를 모두 날려버리면 삭제되므로 여차할 때 곤란한 상황이 발생할 가능성이 있습니다. 버튼의 크기가 0이므로 클릭할 수 없고, 버튼의 label만 보이게 되어, 마치 TextTool처럼 작동합니다. 하트 오브 크라운 한글 (스크립트)에서 개인 보드에 점수를 표기하는 방식도 이를 활용한 것입니다.

3-2. 이벤트 함수 작성

이벤트 함수는 테이블 탑 시뮬레이터에서 미리 지정되어있는 함수로, 특정한 조건이 되었을 때 실행되도록 만들어져 있는 함수입니다. 우리가 매번 사용해왔던 onload()함수 역시 이벤트 함수 중 하나입니다. onload()함수는 게임이 불려올 때 실행된다면, 이번에 필요한 이벤트 함수는, 스크립트 구역에 오브젝트가 들어올 때와 나갈 때 작동되는 함수입니다.
바로 onObjectEnterScriptingZone() 함수와 onObjectLeaveScriptingZone() 함수입니다. 이 외에도, 오브젝트가 충돌할 때 실행되는 함수, 가방에 오브젝트가 들어가고 나올 때 실행되는 함수, 채팅 메시지를 입력할 때 실행되는 함수 등, 다양한 함수를 테이블 탑 시뮬레이터 API에서 제공하고 있습니다.

우선, onObjectEnterScriptingZone()함수를 이용해, 스크립트 구역에 오브젝트가 들어올 때, 버튼을 생성하도록 하는 함수를 작성해봅시다. onObjectEnterScriptingZone()함수는 실행될 때 오브젝트가 들어온 스크립트 구역과 스크립트 구역에 들어온 오브젝트, 이 2가지 인자를 전달합니다.

onObjectEnterScriptingZone(zone, enter_object)

전달받은 zone 인자를 미리 지정한 스크립트 구역과 비교하여, 참이라면 미리 작성했던 loadButton()함수를 이용해 enter_object에 버튼을 생성하도록 하는 함수를 작성합니다.

function onObjectEnterScriptingZone(zone, enter_object)
    if zone == getObjectFromGUID(scriptZone_guid) then
        loadButton(enter_object)
    end
end

여기까지 작성하였다면, 게임을 저장하고 테스트해보도록 합시다. Red Checker를 집어서 스크립트 구역이 있는 곳으로 가져가면 버튼이 생성되는지 확인합니다. 다만, 아직 스크립트 구역 밖으로 꺼내더라도 버튼이 사라지지는 않을 것입니다.

3-2. 버튼 제거 함수 작성

버튼을 생성하는 함수를 완성했으니, 버튼을 삭제하는 함수를 작성하도록 합니다. 버튼을 제거하는 함수는 .removeButton(index) 함수와, .clearButtons() 함수가 있습니다.

removeButton(index) 함수와 clearButtons() 함수

버튼을 제거하는 함수 두 가지입니다. 둘의 차이는 다음과 같습니다. clearButtons()함수는 오브젝트에 생성된 모든 버튼을 제거하는 함수입니다. removeButton(index)함수는 지정된 번호의 버튼 하나만을 제거하는 함수입니다. 오브젝트에 생성되는 버튼은 생성 순서대로 0부터 index값을 갖습니다. 이를 이용해 특정한 버튼만 삭제할 수 있습니다.

주의: removeButton()함수를 이용해 특정한 버튼을 삭제하면, 이후에 생성된 버튼들의 index가 하나씩 당겨집니다. 이때문에 removeButton()함수로 여러 버튼을 동시에 삭제하는 경우 문제가 발생할 수 있습니다.

이번 예제에서는 버튼이 하나뿐이므로 clearButtons()함수를 이용해 통채로 삭제하도록 하는 방법을 이용하도록 하겠습니다. onObjectLeaveScriptingZone()함수를 이용해 오브젝트가 스크립트 구역에서 나가면 버튼을 제거하는 함수를 작성합니다.

onObjectLeaveScriptingZone(zone, leave_object)

전달받은 zone 인자를 미리 지정한 스크립트 구역과 비교하여, 참이라면 clearButtons()함수를 이용해, leave_object의 버튼을 삭제하도록 하는 함수를 작성합니다.

function onObjectLeaveScriptingZone(zone, leave_object)
    if zone == getObjectFromGUID(scriptZone_guid) then
        leave_object.clearButtons()
    end
end

여기까지 작성했다면 완성입니다.

4. 스크립트 전문


scriptZone_guid = 'aa7359'

function loadButton(obj)
    button_parm = {
        click_function = 'buttonClick',
        function_owner = Global,
        label = 'Test Text',
        width = 0,
        height = 0,
        position = {0, 0.5, 0},
        font_size = 200
    }
    obj.createButton(button_Parm)
end

function onObjectEnterScriptingZone(zone, enter_object)
    if zone == getObjectFromGUID(scriptZone_guid) then
        loadButton(enter_object)
    end
end

function onObjectLeaveScriptingZone(zone, leave_object)
    if zone == getObjectFromGUID(scriptZone_guid) then
        leave_object.clearButtons()
    end
end

5. 마무리


이번 강의는 평소보다 짧은 강의가 되었지만, 그 활용도는 무궁무진하다 할 수 있습니다. 테이블 탑 시뮬레이터에서는 다양한 이벤트 스크립트를 제공하고 있습니다. 이를 활용하면 버튼으로만 조작되는 스크립트가 아닌, 조건에 따라 자동으로 작동을 시작하는 스크립트를 작성하실 수 있을 것입니다. 궁금하신 점 댓글로 달아주시면 아는 범위에서 최대한 답변드리도록 하겠습니다. 읽어주셔서 감사합니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기