Skip to content

Latest commit

 

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

타이틀 화면

▶ 플레이 영상 보기

GDI Othello — 도로롱 오델로

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개 레이어 구조입니다.

아키텍처 개요

핵심 구현 내용

1. GameObject-Component 기반 미니 게임 엔진

Unity와 유사한 구조로 GameObject, Component, Scene, SceneManager를 직접 설계했습니다.

  • GameObjectTransform을 기본으로 갖고, AddComponent<T>() / GetComponent<T>() 형태의 템플릿 기반 컴포넌트 관리를 지원
  • ComponentAwake → Start → Update/FixedUpdate/LateUpdate → Render 생명주기를 가짐
  • Scene은 렌더링 대상(GDISpriteRenderer), 텍스트(GDITextRenderer), 클릭 대상(Button)을 각각의 풀로 등록/해제하며 관리
  • SceneManager가 씬 전환 요청을 큐에 모았다가 프레임 경계에서 안전하게 교체 (TitleSceneMainScene)

2. 고정 타임스텝 게임 루프

Engine::Run()에서 Win32 메시지 펌프와 게임 루프를 함께 처리합니다.

  • 메시지가 없을 때만 Update를 수행하는 유휴 루프(idle loop) 방식
  • 델타타임을 누적해 FixedUpdate(16.6ms)를 일정 간격으로 실행하고, UpdateLateUpdateRender 순서로 프레임을 구성

게임 루프

3. 더블 버퍼링 렌더러

GDI로 직접 그리면 화면이 매 프레임 깜빡이는 문제가 있어, 메모리 DC(CreateCompatibleDC)에 먼저 씬을 그린 뒤 BitBlt로 한 번에 화면에 복사하는 더블 버퍼링을 적용했습니다. (GDIRenderer)

4. 스프라이트시트 프레임 애니메이터

Animator 컴포넌트가 스프라이트시트를 프레임 단위로 분할해 재생합니다.

  • 프레임 폭/높이/행렬 수/FPS를 지정해 프레임 목록을 생성
  • 정방향/역방향 재생을 지원해 하나의 시트로 "뒤집는 연출"과 "되돌리는 연출"을 모두 처리
  • 종료 콜백(OnFinished)을 지원해 애니메이션이 끝난 시점에 다음 로직을 이어서 실행

5. 오델로 게임 로직

BoardManager가 8x8 보드와 턴, 상태(PlaceAwait / PlayAnim / END)를 관리합니다.

  • 8방향 탐색으로 특정 위치에 착수했을 때 뒤집히는 돌을 모두 찾는 알고리즘
  • 착수 가능한 자리가 없으면 자동으로 패스, 양쪽 모두 둘 곳이 없으면 돌 개수를 비교해 승패 판정
  • 한 번의 착수로 여러 방향에서 각기 다른 개수의 돌이 뒤집혀야 하므로, 방향별 뒤집을 돌을 연결 리스트(FlipList)에 단계(level) 로 저장 → 같은 단계는 동시에, 다음 단계는 이전 단계의 애니메이션 콜백이 모두 끝난 뒤 순차적으로 재생되도록 구현

6. UI / 버튼 시스템

  • 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

실행 방법

  1. Visual Studio 2022에서 OthelloClient/OthelloClient.sln 열기
  2. x64 / Release (또는 Debug) 구성으로 빌드
  3. _resources 폴더가 실행 파일과 같은 경로에 있는지 확인 후 OthelloClient.exe 실행

트러블슈팅

  • 화면 깜빡임: GDI로 즉시 그리면 화면이 깜빡여서, 메모리 DC에 먼저 그린 뒤 한 번에 복사하는 더블 버퍼링으로 해결
  • 다방향 동시 뒤집기 연출: 한 번의 착수로 여러 방향·서로 다른 개수의 돌이 뒤집혀야 해서, 뒤집을 돌을 단계(level)로 나눠 저장하고 콜백 카운팅으로 단계별 순차 재생되도록 구현
  • 애니메이션 재생 중 입력 꼬임: 뒤집기 애니메이션이 재생되는 동안 입력이 들어오면 상태가 꼬일 수 있어, PlaceAwait / PlayAnim / END 상태 머신으로 애니메이션 중 입력을 차단

개발 과정

윈도우 생성 → 렌더러 → GameObject/Component 구조 → 입력 처리 → 버튼/애니메이터 컴포넌트 → 씬 전환 → 돌 오브젝트 → 보드 매니저(턴/게임 로직) 순서로 엔진 하부 구조부터 게임 로직까지 단계적으로 구현했습니다.

About

게임인재원 8기 프로그래밍 C++ Win32 API GDI 미니게임 프로젝트

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages