C++ 전투 로그 스크롤 시스템 & 좌표 최적화
게임 화면의 BATTLE LOG 박스 내부에 대사가 순차적으로 쌓이고, 오래된 로그는 위로 밀려 올라가는 스크롤링 기능을 구현하며 겪은 시행착오와 해결 과정을 정리함.
1. 데이터 조립: std::string의 활용
std::cout으로 즉시 출력하는 방식에서 벗어나, 출력할 문장을 미리 조립하여 변수에 보관하는 방식을 채택함.
- 네이밍 센스:
fullMsg같은 모호한 이름 대신, 현재 처리 중인 데이터임을 명확히 하는 currentMsg를 사용하여 코드 가독성을 높임.
// 출력 전 보관용 데이터 조립
std::string currentMsg = "[" + name + "] " + msg;
2. 로그 관리의 핵심: std::vector (FIFO 구조)
새로운 로그는 뒤로 넣고, 오래된 로그는 앞에서 지우는 큐(Queue) 방식을 벡터로 구현함.
- 작동 원리:
push_back()으로 새 로그 추가 → 설정한maxLog수치를 넘으면erase(logList.begin())실행. - 효과: 데이터가 한 칸씩 앞으로 당겨지며 자연스러운 스크롤링 효과를 얻음.
3. 좌표 계산과 Off-by-one Error 탈출
컴퓨터의 숫자 세기(0부터 시작)와 인간의 직관 사이의 간극을 이해하는 것이 핵심이었음.
- 원리 이해:
gotoxy(startX, startY + line)에서line은 0부터 시작함. - 인덱스 매칭: 7줄을 보여주고 싶다면 인덱스는 0~6까지 사용됨을 명확히 함.
maxLog + 1연산이 왜 필요한지 논리적으로 파악함.
유지보수를 위한 '상수(const)' 설계
코드 곳곳에 5, 6 같은 '매직 넘버'를 적지 않고 const int maxLog 변수로 통합 관리함.
나중에 로그 창 크기를 키우고 싶을 때, 코드 전체를 뒤질 필요 없이 변수 한 곳만 수정하면 전체 시스템에 반영되도록 설계함. 이것이 유지보수의 기본
