Post

2026-03-26 TIL (23일차)

2026-03-26 TIL (23일차)

Team Name (팀 프로젝트)

● 팀 프로젝트 매니저끼리 데이터 흐름도 구현

매니저 흐름도

연관되어 있는 코드들은 서로 충돌이 최대한 안나게 틀을 정하고 갔습니다.


● SceneManager 구현

게임 내에서 타이틀 화면, 전투 화면, 메뉴 창 등 다양한 ‘씬(Scene)’ 사이의 전환을 효율적으로 관리하기 위해 설계된 클래스입니다.


● 설계 패턴: Singleton

  • 목적: 게임 전체에서 SceneManager 인스턴스가 단 하나만 존재하도록 보장합니다.
  • 특징:
    • 생성자를 private으로 두어 외부 생성을 차단합니다.
    • 복사 생성자와 대입 연산자를 delete하여 복사를 원천적으로 방지합니다.
    • getInstance()를 통해 어디서든 동일한 매니저에 접근할 수 있습니다.


● 데이터 구조: Stack

  • 장점: 씬 위에 새로운 씬(예: 일시정지 메뉴, 인벤토리)을 쌓았다가, 해당 씬이 끝나면 바로 이전 상태로 돌아가는 ‘되돌아가기’ 기능을 구현하기에 편한 자료구조입니다.


● 주요 멤버 함수 상세 설명

함수명역할상세 내용
Update()로직 갱신현재 스택 Top에 있는 Scene의 데이터 계산 및 로직 처리
Render()화면 출력현재 스택 Top에 있는 Scene의 UI 및 그래픽 출력
Add_Scene()씬 추가 (Push)새로운 Scene을 스택에 쌓음 (이전 씬의 데이터가 유지됨)
Return_Scene()이전 씬 복구 (Pop)현재 Scene을 제거하고 바로 아래에 있던 Scene으로 돌아감
Replace_Scene()씬 교체현재 Scene을 완전히 제거하고 새 Scene을 추가 (일회성 화면 전환)
SceneStack_Clear()메모리 해제게임 종료 시 스택에 남은 모든 Scene을 비워 메모리 누수 방지


● Scene 전환 방식의 차이점

Add vs Return (계층적 구조)

  • 흐름: 전투 씬 ➡️ 인벤토리 씬(Add) ➡️ 인벤토리 닫기(Return) ➡️ 전투 씬 복귀
  • 특징: 이전 Scene의 데이터(밤,낮,요일 등등)를 유지해야 할 때 사용합니다.

Replace (단발성 교체)

  • 흐름: 타이틀 화면 ➡️ 마을 화면(Replace)
  • 특징: 데이터 저장이 필요없는 일회성 UI에 사용합니다.

핵심 포인트

  • 메모리 관리: Scene* 포인터를 다루므로, Pop을 하거나 스택을 비울 때 반드시 delete 과정을 거쳐 메모리 누수가 발생하지 않도록 주의해야 합니다.
  • 상태 유지: 스택 구조 덕분에 별도의 데이터 저장 로직 없이도 자연스러운 ‘뒤로 가기’ 구현이 가능하다는 것이 장점입니다.


● 데이터 유지되는 Scene 전환 영상

위에서 설계한 스택 구조(Add_SceneReturn_Scene)를 통해, 화면을 전환했다가 돌아와도 기존 씬이 들고 있던 데이터가 그대로 유지되는 모습을 보여주는 시연 영상입니다.

● vcxproj.filters , .vcxproj 충돌 오류

프로젝트에 파일 하나만 추가하거나 폴더를 옮겼을 뿐인데, Git에서 병합(Merge) 충돌이 발생하는 경우가 생겼습니다.
그 원인은 바로 비주얼 스튜디오가 깐깐하게 관리하는 두 개의 장부 파일 때문입니다.


두 파일의 역할

비주얼 스튜디오는 파일을 추가/수정하거나, 이름을 바꾸거나, 폴더를 옮길 때마다 아래 두 파일을 자동으로 수정합니다.

  • .vcxproj 파일: 실제 파일이 컴퓨터의 어디에 있는지, 빌드는 어떻게 할지 적혀 있는 ‘건축 설계도’입니다.
  • .vcxproj.filters 파일: 비주얼 스튜디오 솔루션 탐색기에서 보이는 가짜 폴더(필터) 구조가 적힌 ‘진열대 명단’입니다.


충돌 이유

이 두 파일은 내부적으로 복잡한 XML 코드로 이루어져 있어서 달라져도 Git에서 충돌이 일어납니다.

① 장부의 같은 줄에 서로 다른 이름을 적을 때 SceneManager 폴더를 만들고 파일을 옮기고 팀원이 그사이에 다른 브랜치에서 새로운 몬스터 클래스나 이펙트 파일을 추가했다면 이렇게 됩니다.

  • : “장부 10번 줄에 SceneManager 경로 추가함!”
  • 팀원: “장부 10번 줄에 MonsterManager 경로 추가함!”
  • Git: “10번 줄에 둘 다 다른 걸 썼네? 난 판단 못 하니까 너희가 직접 정해!” ➡️ 충돌 발생

② “파일 위치 정보의 불일치” 윈도우 탐색기에서 파일을 직접 옮기고 비주얼 스튜디오에서 ‘기존 항목 추가’를 하면, 설계도(.vcxproj) 파일 내부의 XML 코드가 대폭 수정됩니다. 이때 팀원이 다른 설정을 건드렸다면 설계도 자체가 심하게 꼬이게 됩니다.

③ “비주얼 스튜디오의 자동 정렬” 비주얼 스튜디오는 자기 마음대로 장부의 순서를 섞어버릴 때가 있습니다. 나는 A-B-C 순서로 적었는데, 팀원 컴퓨터에서는 B-C-A 순서로 적히면, Git은 내용은 같아도 충돌이라고 판단합니다.


해결 방법

이 파일들은 XML 형식이라 일반 C++ 코드처럼 직접 눈으로 보면서 한 줄 한 줄 고치기가 힘듭니다.

.vcxproj 충돌 해결 3단계

  1. 팀원의 것을 먼저 수락 (Accept Theirs): 충돌이 났을 때 일단 팀원이 올린 최신 프로젝트 파일을 그대로 받아들입니다.
  2. 내 파일 다시 추가: 비주얼 스튜디오를 열고, 윈도우 탐색기에 남아있는 내 파일들을 다시 드래그 앤 드롭으로 프로젝트에 포함시킵니다.
  3. 다시 커밋 (Commit): 이렇게 하면 비주얼 스튜디오가 팀원의 장부를 베이스로 내 파일을 합친 새로운 필터를 알아서 다시 만들어줍니다.
  4. 커밋하시면 끝입니다.
This post is licensed under CC BY 4.0 by the author.