Notice
Recent Posts
Recent Comments
Link
12-27 15:30
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

킹머핀의 제작 일지

로그) 대사 출력 구현 본문

인디 게임 개발/개발 일지

로그) 대사 출력 구현

KingMUffin 2021. 3. 4. 15:44

₩ : Event
- : Log
@ : Problem
& : Soved
※ : Need search


3.2

- 글자 특수 효과를 조절하는 지역 변수 추가
- 글자 특수 효과를 조절하는 함수 추가
// 특수 효과와 관련된 다른 함수와 같은 그룹에 있는데도 지역 변수가 초기화되지 않고 잘 작동한다.
※ 지역 변수가 초기화되는 '정확한' 기준은?
- 대사 파일 작성법 정하기
// Wait for previous actions은 비동기 액션(함수)에만 사용할 수 있다.
- 대사 순서 인스턴스 변수 추가
- 출력 속도 조절 특수문자 추가
// 정적 효과 태그는 특수문자로 치환하지 않아도 출력이 어렵지 않겠지만, 그래도 모든 효과를 치환하는 게 더 직관적이다.
- 제곱 계산 함수 정의
- 무지개 특수 효과 조절 함수 정의, 관련 코드 수정
※ 제곱 계산의 원리가 뭐지? (음수나 소수 제곱은 어떻게?)
- 상호작용을 처리하는 이벤트 시트를 삭제하고 그 안의 함수를 데이터를 처리하는 이벤트 시트로 옮김

₩ 대사 파일을 처리하는 방법
// 1. 하나의 파일에 모두 때려박는다. (그럼 모든 대사 시트를 하나의 파일에서 편집해야 하므로 부적절)
// 2. 특정 파트마다 모두 때려박는다. (이게 낫겠다)
// 3. 한 이벤트마다 한 파일에 담는다. (개별 파일이 너무 많아서 편집이 번거로우므로 부적절)
// 2번 방법으로 결정했다면, 파일 이름을 위해 현재 속한 파트 또는 장소와, 객체 이름을 위해 특정 상황의 이름이 필요하다.
// 대사 파일은 현재 파트만 미리 읽어야 하므로 파트가 바뀔 때마다 한 번만 불러온다.
- 현재 속한 파트를 저장할 전역 변수 추가
- 파트가 바뀔 때마다 데이터를 불러올 함수 선언
- 레이아웃 이름에 파트 이름이 포함되어 있는지 판단하는 조건문 생성
- 위 조건문 대신 레이아웃 이름의 언더바를 기준으로 비교
- 기존 데이터 시트를 불러오는 코드도 함수로 정의, 관련 코드 수정
- 대사 넘기기 가능 여부 전역 변수 추가

₩ 대사와 이벤트를 작성하는 방법
// 대사와 이벤트 시트(구글 스프레드, not Construct 3)를 따로 작성하려던 이유는 조작 가능성 때문인데, 어차피 따로 작성해도 보안에 큰 차이가 없나..?

3.3

// 대사와 이벤트 파일을 암호화하면? 자바스크립트 블록을 사용하면 편하지만, Export하면 경로가 바뀌잖아?
※ 자바스크립트 블록에서 추출 후에도 파일 경로를 유지하는 방법은?
// 이럴 바엔 그냥 누구나 쉽게 열람과 조작 가능하게 대사와 이벤트 파일을 하나로 퉁치면 어떨까? ㅎㅎㅎ
// 그러고 나중에 필요하다면 통째로 암호화하고 저장해서 다시 불러오고 복호화하는 거지. 새 이벤트 시트에서. '비밀키'도 거따 놓고.
※ 암호화 알고리즘?
- 위 변경사항에 의해 파일 읽기 속도가 0.1초 내외로 바뀜을 확인, 주의
- 길이가 1인 mid()를 right()로 변경해보았더니 출력이 이상함, 되돌림
※ mid()와 right()의 차이?
※ Regex 관련 함수의 용도?
- 대사 표시 순서 함수를 비동기로 변경
- 태그 미표기 글자 mid()의 길이를 -1로 수정
// 1. 대사 시트마다 대응하는 이벤트 시트를 만들면 작성 규칙을 정할 수 있음.
// 2. 대사 시트에 이벤트를 포함하면 셀 하나를 배열로 만들어야 함.
// 이벤트와 대사 시트를 분리할지 또 고민하는 이유는 편집 용이성 때문인데, 아무래도 생각해보니 시트가 적을수록 관리에 용이하다.
// 2번 방법으로 결정.
// 그렇다면 언어는? 다른 파일에서 아님 같은 시트에서?
// 1. 다른 파일에서 작성한다면 파일명을 언더바로 구분하고, 분류는 그대로. (수정사항이 생기면 일일이 수정해야 해서 번거로움)
// 2. 같은 시트에서 작성한다면, 번역이 필요한 모든 셀 옆에 번역한 내용의 셀을. (셀과 메모리를 차지함)
// 번거로운 게 제일 미련하다. 2번으로 결정.
- 대사 넘기기 인스턴스 논리 변수 추가
- 대사 자동 넘기기 함수 정의
- 대사창에 이름과 그림 인스턴스 변수 추가, 상호작용마다 초기화
- 대사 줄 번호 인스턴스 변수를 지역 변수로 옮김
- 대사 변속 인스턴스를 절대값이 아닌 배속으로 변경
// 작동 순서
// 1. 이름과 그림 저장.
// 2. 이벤트가 있다면 실행. (모두 실행할 때까지)
// 2-1. 실행 도중 기다려야 할 수 있으므로 비동기 함수로 정의. 
// 3. 이벤트가 없거나, 모두 실행했다면, 대사 있다면, 대사 출력 시작.
// 4. 2번으로 돌아가 배열의 마지막까지 반복.
- 대사 파일을 한 줄씩 순서대로 읽는 함수 정의
- 대사 자동 넘기기 함수 삭제
- 모든 이벤트 실행하는 재귀 함수 비활성화하고 반복문으로 대체
- 혹시나 해서 실행해봤더니 의외로 작동은 함
@ 출력 속도가 매우 느림

3.4

& 그냥 연산자 잘못씀, 수정
// 2-1. 기다리기 이벤트를 한 셀에 여러 개 넣으려면 비동기 함수로 정의해야 하지만, 하나만 넣기로 결정함, 동기 함수로 정의.
- 대사가 시작할 때에서 끝날 때 초기화하도록 수정
- 초기화되었다면 다음 대사 함수가 작동하지 않도록 조건 추가
@ 대사가 넘겨지지 않음


3.6

- 파일 읽기 함수부터 호출
@@ 화살표 위치 정보를 또 불러올 수 없음
- 데이터 임시 저장 변수 초기화 함수 정의
- 표시 순서 증가 함수 중단 조건 추가
- 글자 출력 순차 변경 (글자가 즉시 출력되지 않음)
- 다른 인스턴스 변수 값을 정하는 함수 정의, 관련 코드 수정
- 화살표 방향도 함수로 제어 [0]
- 갑자기 화살표 위치 정보가 가져와짐, 그런데 화살표 방향이 전부 같아짐
- 필터링을 무시해서 생긴 문제. [0]을 되돌림.
&& 여러 번 시도한 결과, AJAX 동작이 추가되어 기존 파일을 읽는 시간이 약간 지연됨. 해결할 건 없었지만 주의는 필요. (수정 : 코드의 순차가 원인이었음. 파일 읽는 시간은 차이 없음.)
- 또 지역 변수 초기화 문제로 작동이 멈춘 것을 확인.
// 아무래도 그룹 내 이벤트가 발생할 때마다 지역 변수(정적 아니고 동적)가 초기화되는 것이 확실하다.
- 해당 변수 세 개를 정적 변수로 변환
- 해당 변수 두 개를 인스턴스 변수로 옮김, 관련 코드 수정
& 언어 코드 오타 수정 해결
@ 다음 대사가 바로 출력됨
@@ 다음 대사가 두 번 출력됨 ('해봐'가 '해봐해봐'으로)
- 글자만 가져오면 '안녕해봐', 실제 출력은 '해봐해봐' 표시 순서는 2
& 이번에도 초기화를 안 해서 생긴 문제. 수정
&& 동시에 해결

3.7

₩ 선택지와 대사 뛰어넘기 구현
// 대사 출력 완료 시점에 선택지 표시.
- 선택 가능 인스턴스 불 변수 추가
- 대사 출력 완료 함수 정의
- 기다림 여부 인스턴스 불 변수 추가
// 인스턴스 변수 이제 겁나 많은데, 뭐 상관 없겠지!!
// 게다가 1byte 차지하는 불 변수잖아?!
// 복잡하게 코딩하지 말자. 예를 들어, 기다림 여부에 따라 넘기기 여부를 결정한 후 넘기기 여부에 따라 넘길지 결정하지 말고, 넘길 때 기다림 여부와 넘기기 여부를 확인하자. 단순하게..!
@ 스킵하면 다음 대사로 넘어가지 않음
& 스킵 시 출력 완료 함수 호출
- 입력했던 화살표 키를 저장하는 문자열과 함수 정의
- 입력 개수 조건을 페이더 이벤트 시트로 이동
- 선택지 인스턴스 불 변수 삭제, 선택목록 인스턴스 문자열 추가, 관련 코드 수정
- 선택지 함수에 이전 선택지에 대한 조건 추가
// 나중에 효과 여부 인스턴스 변수를 지역 변수로 옮겨봐야겠다

3.8

- 배열은 문자열로 가져올 시 0이 반환됨을 확인
- 선택한 번호 저장 인스턴스 변수 추가
- 데이터 관리에 쓰이는 인스턴스 변수 두 개를 지역 변수로 옮김
- 나머지 데이터 관련 인스턴스 변수를 지역 변수로 옮기고 함수로 값을 가져옴
- 모든 지역과 전역 변수를 이름 앞에 설명
// 로그 확인해보니 효과 여부 저장하는 불 변수가 인스턴스일 필요가 없음
- 효과 여부 저장 불 변수를 지역 변수로 옮김
- 이전에 선택했을 경우 선택지 처리하는 조건과 함수 정의
- 대사 넘기기 여부를 여러 인스턴스에 대응하는 조건 추가
- 출력 완료 시 스킵 비활성화 순차를 맨 아래에서 위로 변경 (위 조건에 영향)

3.9

- 불필요하게 나누어진 함수 제거하고 하위 조건문으로 옮김
- 선택지 입력 함수 정의
- 화살표 입력 함수 매개변수 이름 간소화
- 입력 함수 호출 시 선택지 입력 함수 호출
- 함수 분류를 기존 3개에서 '소리'를 제외한 나머지를 핵심 기능 별로 정리
- 대사 인스턴스 변수 초기화를 출력 마지막으로 옮김
- 출력이 끝나면 내용이 사라져서 다시 되돌림
// 넘기기 키를 직관적으로 데이터 이벤트 시트에서만 받기에 초기화도 함께 처리해야 마땅

3.10

// 선택을 어느 이벤트 시트에서 처리할 것인가? (선택지 말고)
- 대본 넘기기 지역 불 변수를 상호작용 첫 부분에서 참으로
- 위 함수에서 필요 없는 조건 제거
- 각 선택지를 반복문으로 호출
- 미선택 시 선택 번호를 -1에서 0으로
// 1) 선택지를 표시하는 함수를 반복문으로 네 번 호출한다.
// 아 그럼 모든 선택지를 저장하고 있을 필요가 없잖아.
- 선택지 저장 인스턴스 변수 삭제
- 선택 가능 여부 불 인스턴스 변수 생성
// 1) '대사 출력이 끝나면' 선택지를 표시하는 함수를 반복문으로 네 번 호출한다. (선택지는 어떤 텍스트로?)
// 2) 같은 화살표를 두 번 누르면 선택한다. 화살표 이벤트 시트에서 처리.
// 3) 선택하면 텍스트 내용과 선택 번호를 처리하는 함수를 호출한다.
- 화살표 선택지 함수를 입력 함수로 변경
// 선택지 역시 같은 텍스트를 사용하기로 결정
- 선택 가능 여부 인스턴스 불을 지역 변수로 옮김
- 대사와 대사창 초기화를 항상 맨 마지막으로
// 그럼 그 텍스트의 내용을 가져오는 방법은?
// 1. 첫 번째 인스턴스의 자식으로 저장해두기.
// 2. 이름을 정해서 생성해두기.
// Construct 3는 필터링을 거치지 않으면 모든 인스턴스에서 액션이 실행되기 때문에 새로 생성할 인스턴스를 고려하려면 복잡하다.
// 일단 1번 방법으로 결정한다. 선택지를 표시할 때 대사 출력 인스턴스가 두 개 이상이면 자식 번호가 항상 일정하지 않지만, 그런 연출을 적용할지 미지수이며 당장 작동이 가능한지 확인하는게 우선이기 때문에 지금 할 수 있는 것을 하는 것이다.
- 대사 선택지와 뛰어넘기 조건 수정
// 이럴거면 플로우차트라도 만들걸 그랬나..
// 지금이라도 만들까?
// 몰라
// 친구와 대화해봤다. 플로우차트가 분명 도움은 되겠지만, 애초에 이전에 다짐했던 대로 효율을 포기하고 모든 기능을 독립적으로 구현했다면 전혀 어려운 고민이 아니었을 것이다. 독립적일수록 직관적이고 "시간적으로" 효율적이다.
- 텍스트의 내용을 '일단은' 가져오기 쉽게 지역 정적 문자열을 선언하여 저장
- 선택 가능 여부 지역 불을 대사 이벤트 시트 그룹으로 옮김
// 1. 배열을 하나씩 문자열에 저장한다.
// 2. 선택지 문자열에 하나씩 저장한다.
// 3. 지역 문자열 또는 선택지 문자열에서 일부를 가져온다.
- 선택지 개수와 각 항목을 가져오는 함수 정의
- 해당 함수를 선택지 인스턴스 생성 함수에서 사용
- 두 번의 입력이 같으면 선택하는 함수 정의
- 초기화 시 원문도 함께
- 글자 크기 조절 효과 지역 불 제거, 조절 시 태그 열기만 함
// 그냥 지역 문자열에 선택지 저장해뒀다가 번호 받으면 꺼내쓸 수 있는데, 어차피 생성한 선택지 인스턴스 삭제하려면 정보도 가져올 수 있음. 그래서 그 방법을 고민중..
// 근데 아까 1번 방법으로 결정할거고 당장 작동 가능한지가 중요하다면서 똑같은 고민을 하는 중이었다. ㅋㅅㅋ 이러면서 배우는 거지..
- 선택 가능 지역 불을 참으로 하는 함수 호출
- 인덱스 아이디로 선택한 내용과 모든 선택지 인스턴스 삭제
- 대본을 담아두는 JSON 객체 이름 변경
- 선택지 번호를 가져오는 함수 삭제
- 뛰어넘을 대본 번호를 받을 파라미터 생성
- 선택지 저장 내용 변경
- 화살표 입력 조건문 통과 불가 확인
// 갑자기 드는 생각인데, 시도를 안 하고 생각만 하면서 시간을 보내면 나중에 보이는 결과가 의외로 없어서 성취감 하나도 안들게 되는 것 같다. 그러니 바로바로 하자.
- 정수를 문자열로 변환해서 비교
// 그리고 로그도 지나치게 자세하게 쓰진 말자.
- 배열 개수와 내용 가져오는 함수 잘못된 경로 수정
@ 모든 인스턴스가 마지막 인스턴스의 내용과 동일하게 출력되는 문제
// 액션의 객체가 모든 인스턴스에 해당하는 문제! 정확한 이해와 수정이 필요하다. 나중에 하자.
- 스킵 여부로 대사 출력 완료 구별
// 다짐대로라면 대사 출력 완료 여부 인스턴스 불을 만들어야 하는데.. 흠......
- 일단 선택지에 따른 대사 넘기기가 정상 작동함



3.13

// 각자 자신의 인스턴스 변수에만 접근하는 방법?
// 1. 인스턴스 변수를 제어하는 함수에 전부 인스턴스 반복문을 적용한다. 이 방법밖에 없는 듯.
- 인스턴스마다 반복 조건을 필요한 모든 함수에 추가 [0]
- 대사 표시 순서를 지역 변수로 옮기려다 되돌림
// 가장 긴 표시 순서만 알면 된다고 생각했다가 출력 속도가 같아지는 문제를 떠올림.
// 호출한 함수에서 해당하는 인스턴스만 수행하는 방법은?
// 1. 기존 인수와 IID를 함께 전달
// 2. 기존 인수만 전달하고 반복 조건문으로 해당하는 인스턴스 다시 확인
// 3. IID만 전달하고 인스턴스 직접 확인
// 함수를 호출할 때부터 UID를 전송하면 반복이 필요 없다. 한 곳에서 처리하는 게 제일 효율적. 1번 방법으로 결정.
- 태그를 직접 적용하는 함수를 리턴하는 함수로 교체
// 태그를 적용하기 위해 호출하는 함수를 전부 리턴 가능하게 변경하면 UID를 전송할 필요가 없어진다.
- [0]을 되돌림
- 태그 관련 함수를 모두 리턴 가능하도록 변경, 관련 코드 수정


3.15

- 출력 완료 인스턴스 불 추가
- 했다가 삭제, 스킵 완료 인스턴스 불을 출력 완료로 변경
- 모든 대사 출력 완료 여부 판단 조건 추가
- 글자만 저장하는 함수를 리턴 가능하게 변경
// 대사를 여러 개 출력하려면?
// 1. 기존 인스턴스를 유지하려면 코드나 레이아웃 드래그로 새로 생성한 인스턴스에 대사를 따로 적용할 코드 필요 (인스턴스마다 미리 다른 값을 정할 수 있음) (별로 어렵지 않음)
// 2. 기존 인스턴스를 없애고 모든 대사를 생성과 제거로 관리 (레이아웃마다 대사 인스턴스를 하나씩 일일이 추가하는 수고가 필요 없음) (Garbage Collect 문제가 있지만 신경 안 써도 될 정도이며 내가 알기론 Construct 3에서 알아서 처리해준다. 아 그리고 쓰레기 메모리 문제가 여기서만 생기는 것도 아니잖아? ㅎㅎㅎ) (이게 훨씬 직관적이고 자동임)
// 2번으로 결정.
- 대사 인스턴스 초기화 함수 삭제
- 효과 적용 지역 불을 다시 인스턴스 변수로 모두 변경
- 관련 코드 전부 교체
// 인스턴스가 어느 레이아웃이든 하나라도 있으면 다른 인스턴스는 기존 인스턴스에서 복제된다. 그럼 마지막으로 생성된 인스턴스가 원본인가??
- 반복문에서 글자 순서를 올리는 조건 수정
- 글자 표시순서 함수에 UID 매개변수 추가
// 생성한 대사 인스턴스는 언제 삭제하는 게 좋을까?
// 1. 이벤트가 끝난 후.
// 2. 대사를 출력할 때마다.
// 현재 2번으로 구현되어 있다. 코딩할 때는 할까 말까 할 때는 하지 말자. 2번으로 결정.
@ 입력 해제 시에만 함수를 호출하는데도 입력 시작 시 작동함
// 반복문 중단은 적어도 반복문의 끝까지는 실행한다.
@@ 속도 저하 문자에 속도 저하게 걸리는 문제


3.17

- 출력 완료 처리 함수에서 막혀서 그냥 내용을 다 지워버림
- 다시 조건을 생성하고 함수 완성
& 해결, 원인 불명
// 역시 감이 안 잡힐 땐 싹 지우고 다시 하는거다
- 출력 함수에서 각 대사에 대응하도록 조건 추가
- 대사 인스턴스 생성 함수에 요소 매개변수 추가
- 선택지 함수로 생성
@ 선택지 인스턴스가 끊임없이 생성됨
& 선택중인지 여부 지역 불 추가, 조건으로 해결
- 조건을 하위로 분리하여 잘못된 else 방지

₩ 기다리기 구현




3.22

- 일부 이벤트 시트의 이벤트를 그룹화
- 데이터 경로 전달 매개변수 추가
@ 선택지에 따른 대사 뛰어넘기 버그
- 대사 인스턴스가 삭제된 후 생성되지 않음을 확인
// 역시 매번 삭제하고 생성하길 잘 했어!!
& 해결
@ 기다림 기능 때문에 게임이 정지함
- 가져온 데이터의 첫 번째가 0이거나 루프가 작동하지 않음을 확인
- 콘솔에서 타입 에러를 확인
- 이벤트를 데이터에서 가져오고 있지 않음을 확인, 수정
- 매핑 함수 호출 함수 인수에 아무 값이 없음을 확인
& 무슨 타입이든 문자열로 변환해서 인수로 보내기

끝! 마지막 로그는 정말 대충 썼다.