글 작성자: Doublsb

비장한 BGM을 틀면서 작업을 했더니 강해짐을 느낀다. 하여간, 작업은 아마도 순조로운 상태다.

이걸 봐라. 멋지게 구현하지 않았는가.

 

해당 커밋 보러가기

 

Show("이것은 /size:17/대화창이다. /emote:Sad/하지만  /color:red/'언젠가는' /color:white/ 완성되겠지. /emote:Happy/^O^", character);

#1 구현

 

구현은 이전과 마찬가지의 방법으로 진행했다. 

그리고 닫는 태그는 어떻게 처리했느냐? 출력하는 텍스트와 마지막에 붙여질 텍스트를 구분하였다.

 

이렇게 하면, isColoring과 isSizing을 키는것만으로 color와 size 닫는 태그의 처리를 해줄 수 있다. 아래와 같은 방식으로 말이다.

 

_coloring과 _sizing의 내용은 사실상 같아서 리팩토링은 해야겠지만. 아무튼 아이디어는 간단하다.

 

- color 태그나 size 태그가 하나라도 들어 있으면, 어차피 닫는 태그는 항상 존재한다.

- 이미 isColoring이나 isSizing이 켜져 있으면, 해당 위치에 닫는 태그를 만들어주면 된다.

 

자, 이렇게 간단하게 해결하였다. 스스로에게 박수를 쳐 주도록 한다!

 

...그러면 그렇지.


#2 원인

 

원인은 간단하다. 아래의 예시 코드 중, 첫 번째는 되고 두 번째는 안 된다.

Show("/size:18//color:red/^O^", character);
Show("/color:red//size:20/^O^", character);

 

해당 구문들은 아래와 같이 파싱된다.

<size=20><color=red>^O^</color></size>
<color=red><size=20>^O^</color></size>

 

첫 번째 구문은 color=red가 /color와 짝을 이루어 순서가 맞게 들어가고 있다.

그러나, 두 번째 구문은 보다시피 size=20과 /color가 짝이 이루어지지 않아 순수한 문자열 그대로 출력되고 있는 것이다.

 

이걸 해결하기 위해서는, tag가 선언된 순서대로 스택에 넣고, 스택에서 해당 문자열을 치환하여 밖으로 빼 줘야 한다.


#3 해결

 

사악했던 isColoring과 isSizing을 없애 버리고, CloseCommands라는 리스트를 만들었다. 이는 스택으로 사용될 것이다.

coloring과 sizing 메서드를 처리 할 때마다, CloseCommands에 Enum의 형태로 리스트가 쌓일 것이다.

 

BackText는 다음과 같은 형태가 된다.

 

매 WaitTime마다 BackText를 새 string으로 받아오는 것은 미미하더라도 성능 상으로 좋지 않다. 이는 이후에 해결하도록 하고.

BackText는 리스트의 뒷부분부터 하나씩 꺼내 result string을 만들어준다.

 

해결... 해결하였다...

 

해당 커밋 보러가기

반응형