Win32 API의 GDI만으로 구현한 2인용 오델로(리버시) 게임입니다. 게임 엔진 없이 로우레벨 그래픽 API 위에 GameObject-Component 구조의 미니 게임 엔진을 직접 설계·구현하고, 그 위에 오델로 규칙과 연출을 얹었습니다.
게임인재원 C++ / Win32 API 학습 프로젝트
- 타이틀 화면 → 게임 진행 → 리셋 / 타이틀 복귀까지 흐르는 완성된 게임 루프
- 8x8 보드에서 진행되는 표준 오델로 규칙(착수 가능 판정, 뒤집기, 패스, 승패 판정)
- '도로롱' 캐릭터 스프라이트를 이용한 돌 뒤집기 애니메이션 및 연출
| 분류 | 내용 |
|---|---|
| 언어 | C++17 |
| 플랫폼 | Windows (Win32 API) |
| 그래픽스 | GDI (GDI+ 미사용, 순수 HDC 기반) |
| 빌드 | Visual Studio 2022 (Platform Toolset v143) |
| 리소스 | 자체 제작 스프라이트/폰트 (aseprite로 제작한 프레임 애니메이션 시트) |
외부 게임 엔진이나 그래픽 라이브러리 없이 Win32 + GDI만으로 렌더링, 입력, 씬 전환, 컴포넌트 시스템을 모두 직접 구현했습니다.
Win32 API 위에 GameObject-Component 구조의 미니 게임 엔진을 쌓고, 그 위에 오델로 시스템과 게임 오브젝트를 올린 5개 레이어 구조입니다.
Unity와 유사한 구조로 GameObject, Component, Scene, SceneManager를 직접 설계했습니다.
GameObject는Transform을 기본으로 갖고,AddComponent<T>()/GetComponent<T>()형태의 템플릿 기반 컴포넌트 관리를 지원Component는Awake → Start → Update/FixedUpdate/LateUpdate → Render생명주기를 가짐Scene은 렌더링 대상(GDISpriteRenderer), 텍스트(GDITextRenderer), 클릭 대상(Button)을 각각의 풀로 등록/해제하며 관리SceneManager가 씬 전환 요청을 큐에 모았다가 프레임 경계에서 안전하게 교체 (TitleScene↔MainScene)
Engine::Run()에서 Win32 메시지 펌프와 게임 루프를 함께 처리합니다.
- 메시지가 없을 때만
Update를 수행하는 유휴 루프(idle loop) 방식 - 델타타임을 누적해
FixedUpdate(16.6ms)를 일정 간격으로 실행하고,Update→LateUpdate→Render순서로 프레임을 구성
GDI로 직접 그리면 화면이 매 프레임 깜빡이는 문제가 있어, 메모리 DC(CreateCompatibleDC)에 먼저 씬을 그린 뒤 BitBlt로 한 번에 화면에 복사하는 더블 버퍼링을 적용했습니다. (GDIRenderer)
Animator 컴포넌트가 스프라이트시트를 프레임 단위로 분할해 재생합니다.
- 프레임 폭/높이/행렬 수/FPS를 지정해 프레임 목록을 생성
- 정방향/역방향 재생을 지원해 하나의 시트로 "뒤집는 연출"과 "되돌리는 연출"을 모두 처리
- 종료 콜백(
OnFinished)을 지원해 애니메이션이 끝난 시점에 다음 로직을 이어서 실행
BoardManager가 8x8 보드와 턴, 상태(PlaceAwait / PlayAnim / END)를 관리합니다.
- 8방향 탐색으로 특정 위치에 착수했을 때 뒤집히는 돌을 모두 찾는 알고리즘
- 착수 가능한 자리가 없으면 자동으로 패스, 양쪽 모두 둘 곳이 없으면 돌 개수를 비교해 승패 판정
- 한 번의 착수로 여러 방향에서 각기 다른 개수의 돌이 뒤집혀야 하므로, 방향별 뒤집을 돌을 연결 리스트(
FlipList)에 단계(level) 로 저장 → 같은 단계는 동시에, 다음 단계는 이전 단계의 애니메이션 콜백이 모두 끝난 뒤 순차적으로 재생되도록 구현
Button컴포넌트가 마우스 호버 시 밝기 조절, 클릭 판정, 렌더링 순서(OrderInLayer) 기반의 클릭 우선순위를 처리- 팝업(게임 방법 안내) 등 자식 GameObject를 갖는 계층 구조 지원
OthelloClient/OthelloClient/_sources
├─ core
│ ├─ Engine # Engine, GameObject, Component, Scene, SceneManager, InputSystem, Sprite ...
│ ├─ Renderer # GDIRenderer (더블 버퍼링)
│ └─ Window # Win32 윈도우 생성/메시지 처리
├─ components # Transform, Animator, Button, GDITextRenderer
├─ systems # BoardManager(게임 로직), StoneComponent, HowToPlay
├─ game # 타이틀/보드 UI, 버튼, 팝업 등 게임 오브젝트
├─ scenes # TitleScene, MainScene
└─ utils # FlipList, Vector2f, GameTimer, DebugConsole
- Visual Studio 2022에서
OthelloClient/OthelloClient.sln열기 x64 / Release(또는Debug) 구성으로 빌드_resources폴더가 실행 파일과 같은 경로에 있는지 확인 후OthelloClient.exe실행
- 화면 깜빡임: GDI로 즉시 그리면 화면이 깜빡여서, 메모리 DC에 먼저 그린 뒤 한 번에 복사하는 더블 버퍼링으로 해결
- 다방향 동시 뒤집기 연출: 한 번의 착수로 여러 방향·서로 다른 개수의 돌이 뒤집혀야 해서, 뒤집을 돌을 단계(level)로 나눠 저장하고 콜백 카운팅으로 단계별 순차 재생되도록 구현
- 애니메이션 재생 중 입력 꼬임: 뒤집기 애니메이션이 재생되는 동안 입력이 들어오면 상태가 꼬일 수 있어,
PlaceAwait / PlayAnim / END상태 머신으로 애니메이션 중 입력을 차단
윈도우 생성 → 렌더러 → GameObject/Component 구조 → 입력 처리 → 버튼/애니메이터 컴포넌트 → 씬 전환 → 돌 오브젝트 → 보드 매니저(턴/게임 로직) 순서로 엔진 하부 구조부터 게임 로직까지 단계적으로 구현했습니다.
