시작 글

이번에는 확실히 주말에 개발 일지를 작성한다. 지금은 일요일 점심. 여자친구와 함께 식사를 하고 망원동 카페 부부에 와서 느긋하게 노트북을 펼쳤다. 여자친구는 학교 시험 문제를 제출하고 나는 개발 일지를 작성하고. 느긋하고 생산적인 주말 오후의 모습이다.

셋팅도, 커피도 완전히 준비되었으니 이제 시작해볼까.


작업

screenshot
이번주 작업 분량


1. 말풍선 대사 버그 수정

대사 스크립트를 추가하다 보니 거슬리는 부분이 있었다. 말풍선에 딱 맞게 대사가 끝나면 쓸데없이 new line이 하나 들어가서 말풍선 밑에 쓸모없는 공간이 조금 생기는 문제였다. 무슨 문제일까. 이번주를 시작하는 간단하고 생산적인 활동으로 어울리는 듯 하여(즉 간단할 듯 하여) 이 문제를 붙잡아 보기로 했다.

역시나 간단한 문제였다. 글자를 특정 char 갯수 별로 끊어서 new line char를 넣어주고 있었는데 특정 상황에서는 가장 마지막 문장의 끝에도 들어가는 문제였다. 즉, 문자 갯수가 Pivot 갯수와 일치하면 추가해주는 상황이니 마지막 라인에서도 문자 갯수가 Pivot 갯수와 일치하는 상황에서 문제가 생겼다. 간단하게 마지막 줄인지 아닌지 체크를 넣어줘서 해결했다.


2. 맵 전환 시 Fade 기능 추가

맵 변경 기능을 넣고 난 이후에 계속 불만이었던 기능을 드디어 폴리싱(사실상 추가 기능이지만)하였다. 기존에는 아무런 화면 전환 효과 없이 맵을 바꾸다 보니 깜빡이며 갑작스럽게 맵이 바뀌는 동작을 취하고 있었다. 물론 이상하다. 화면 전환 관련해서는 코로나에서도 지원해주는 기능이 있지만, 사실상 씬 전환이 아니라 씬 내에서 맵을 새로 로드하는 기능이기 때문에 씬 전환 기능은 일단 배제하고 생각했다.(씬 전환 기능을 사용하려면 맵 로드 기능을 씬 기준으로 로드하도록 변경해줘야 하기 때문이다.)

해결 방법은 대충 Rect를 사용해서 페이드 인 아웃 기능을 써보는 것. 아무래도 페이드로 맵을 전환하면 좀 무미건조할 수 있겠지만, 그래도 없는 것보다는 낫겠지 하는 생각에.

Rect를 띄우고 페이드 기능을 넣고 중간에 callback으로 맵 reload 기능을 넣는다. 끝. 간단하다.

간단한 기능이라도 넣고 나서 효과적으로 동작하면 기분이 좋다.


3. 맵 전환 시 획득물 유지 기능

맵 전환 시에는 획득했던 획득물이 모두 초기화되는 문제를 해결했다. 뭐, 모든 오브젝트를 새로 생성하니까 당연하다면 단연한 일이지만. 이것도 간단하게 해결.

기존 주인공의 획득물을 카피해둔다.
맵을 리로드한다.
카피해둔 획득물을 새로 생성된 주인공에게 추가해준다.

쉽다 쉬워.


4. 환경광 기능 추가

이름은 거창하게 환경광이라고 지었지만, 사실상 알파값이 있는 색을 화면에 씌운 것에 불과하다. 시나리오 상 아침을 표현해야 하는데 적당하게 안개 낀 느낌을 내어보려고 알파가 들어간 흰색을 씌워보려다 보니 이런 기능을 추가하게 되었다. 사실상 빛은 아니지만 그래도 일관성을 위해 기존 light 오브젝트의 타입으로 넣었다. Tiled에서도 추가할 수 있도록.

환경광은 object 패널에 붙지 않고 map 패널에 붙임으로써 스크롤링 되지 않게 해두고 딱 화면 크기로 만들어지도록 하였다.


5. 캐릭터 별 애니메이편 파일 분리

이전에 임시로 처리했던 캐릭터 별 애니메이션들을 정의하는 파일을 따로 분리했다. 이전에 꼬맹이가 누워있다 일어서는 애니메이션을 그냥 worldCharacter에서 공용으로 처리해 버렸는데, 역시 너무 별로지. animating 할 때 필요한 table들을 그대로 리턴해주는 파일을 따로 떼어내어 animSet 폴더 내부에 넣어버렸다.

애니메이션은 오브젝트를 생성할 때 정의해주지 않으면 사용할 수 없기 때문에 기존의 customSequence 설정 기능을 그대로 활용했고, 거기에서 animSets 폴더를 탐색하여 자신의 아틀라스 이름과 동일한 파일이 있다면 애니메이션 시퀀스를 로드하도록 처리하였다.

그래서 처리한 꼬맹이의 일어나는 애니메이션 셋 파일은 아래와 같다.

afterAnim은 animating 후 플레이할 애니 이름이다. 없다면 지금 애니를 유지하도록 했다.

local animSets =
{
    {
        name = "wakeUp",
        time = 1000,
        loopCount = 1,
        afterAnim = "idle"
    }
};

return animSets;


맺음 글

이번주는 꽤 많이 했네. 기존에 뒤로 미뤄뒀던 부채들을 꽤 많이 해결했다. 부채였지만 그렇게 복잡하고 어려운 기능들은 아니었기 때문에 이렇게 한번에 해결 가능했던 것이겠지만..

이제 다시 뇌의 활용 범위를 바꾸어서 시나리오와 게임 연출을 제작하는 모드로 들어가야 한다.

오늘 더 작업할 지도 모르지만, 아무튼 이번 주 평일의 작업은 이렇게 정리된다. 수고했다!