Pixel Dungeon UML 다이어그램

C++ WinAPI 기반 Pixel Dungeon 모작 게임 개발을 위한 구조 분석

1. 소개

Pixel Dungeon은 전통적인 로그라이크 던전 크롤러 게임으로, 랜덤 생성된 레벨과 적, 다양한 아이템을 특징으로 합니다. 이 문서는 Pixel Dungeon의 핵심 게임 시스템 구조를 UML 다이어그램으로 표현하여 모작 게임 개발에 도움을 제공합니다.

아래 다이어그램은 주요 클래스와 그들의 관계, 핵심 기능 동작 방식을 보여줍니다. 실제 구현에서는 프로젝트 요구사항에 맞게 조정이 필요합니다.

2. 클래스 다이어그램

2.1 핵심 구조 개요

classDiagram
    class Game {
        +scene: Scene
        +create()
        +resume()
        +pause()
        +finish()
    }
    class PixelDungeon {
        +instance: PixelDungeon
        +scene(): Scene
    }
    class Dungeon {
        +level: Level
        +hero: Hero
        +init()
        +newLevel()
        +saveGame()
        +loadGame()
    }
    class GameScene {
        +create()
        +update()
        +add(Gizmo)
        +updateMap(int)
    }
    Game <|-- PixelDungeon
    PixelDungeon *-- Dungeon
    Game *-- GameScene
                

2.2 레벨 및 던전 생성 시스템

classDiagram
    class Level {
        +map: int[]
        +passable: boolean[]
        +visited: boolean[]
        +mobs: HashSet~Mob~
        +heaps: HashMap~Int, Heap~
        +create()
        +drop(Item, int)
        +press(int, Char)
    }
    class RegularLevel {
        +rooms: ArrayList~Room~
        +roomEntrance: Room
        +roomExit: Room
        +createItems()
        +createMobs()
        +initRooms()
        +joinRooms()
        +placeDoors()
    }
    class SewerLevel {
        +decorate()
        +randomRespawnCell()
    }
    class Room {
        +left, top, right, bottom: int
        +neighbors: ArrayList~Room~
        +connected: HashMap~Room, Door~
        +type: Type
        +paint()
        +random()
    }
    class Painter {
        +paint(Level, Room)
    }
    
    Level <|-- RegularLevel
    RegularLevel <|-- SewerLevel
    RegularLevel <|-- PrisonLevel
    RegularLevel <|-- CavesLevel
    RegularLevel <|-- CityLevel
    RegularLevel <|-- HallsLevel
    RegularLevel *-- Room
    Painter --> Room
    Painter --> Level
                

2.3 캐릭터 및 몬스터 시스템

classDiagram
    class Actor {
        +id: int
        +act(): boolean
        +spend(float)
        +getTime(): float
    }
    class Char {
        +pos: int
        +HP: int
        +sprite: CharSprite
        +buffs: HashSet~Buff~
        +move(int): boolean
        +attack(Char): boolean
        +damage(int, Object): void
        +die(Object): void
        +defenseSkill(Char): int
        +attackSkill(Char): int
    }
    class Mob {
        +enemy: Char
        +state: AiState
        +intelligentAlly: boolean
        +doAttack(Char): void
        +getCloser(int): boolean
        +getFurther(int): boolean
        +canAttack(Char): boolean
        +notice(): void
        +beckon(int): void
    }
    class Hero {
        +heroClass: HeroClass
        +STR: int
        +exp: int
        +belongings: Belongings
        +handle(): void
        +move(int): boolean
        +actAttack(HeroAction.Attack): void
        +actMove(HeroAction.Move): void
        +rest(boolean): void
        +search(boolean): void
    }
    
    Actor <|-- Char
    Char <|-- Mob
    Char <|-- Hero
    Mob <|-- Rat
    Mob <|-- Gnoll
    Mob <|-- Crab
    Mob <|-- DM300
    Mob <|-- King
    Mob <|-- Yog
                

2.4 아이템 시스템

classDiagram
    class Item {
        +image: int
        +name: String
        +quantity: int
        +unique: boolean
        +cursed: boolean
        +identify(): Item
        +collect(): boolean
        +execute(Hero): void
        +actions(Hero): ArrayList~String~
        +doPickUp(Hero): boolean
    }
    class Weapon {
        +tier: int
        +ACU: float
        +MIN: int
        +MAX: int
        +STR: int
        +enchantment: Enchantment
        +proc(Char, Char): void
        +typicalSTR(): int
        +damageRoll(): int
    }
    class Armor {
        +tier: int
        +DR: int
        +STR: int
        +glyph: Glyph
        +proc(Char, Char): void
        +typicalSTR(): int
        +defenseProc(Char, Char): int
    }
    class Potion {
        +isKnown(): boolean
        +drink(Hero): void
    }
    class Scroll {
        +isKnown(): boolean
        +read(Hero): void
    }
    
    Item <|-- EquippableItem
    EquippableItem <|-- Weapon
    EquippableItem <|-- Armor
    Item <|-- Potion
    Item <|-- Scroll
    Item <|-- Ring
    Item <|-- Wand
    Item <|-- Bag
    Weapon <|-- MeleeWeapon
    Weapon <|-- Projectile
                

2.5 게임 메커니즘 및 유틸리티

classDiagram
    class Buff {
        +target: Char
        +type: BuffType
        +act(): boolean
        +attachTo(Char): boolean
        +detach(): void
    }
    class Hunger {
        +hunger: float
        +satisfy(float): void
        +isStarving(): boolean
    }
    class Bestiary {
        +mob(int): Mob
        +mobClass(int): Class~? extends Mob~
    }
    class Generator {
        +generate(Category): Item
        +random(Category): Item
    }
    class Heap {
        +type: Type
        +items: LinkedList~Item~
        +sprite: ItemSprite
        +drop(Item): void
        +pickUp(): Item
    }
    
    Buff <|-- FlavourBuff
    Buff <|-- Hunger
    Buff <|-- Burning
    Buff <|-- Paralysis
    Buff <|-- Poison
    Buff <|-- Invisibility
    Buff <|-- Levitation
    Actor <|-- Buff
                

2.6 시각화 및 인터페이스

classDiagram
    class Gizmo {
        +parent: Gizmo
        +remove(): void
        +update(): void
        +destroy(): void
    }
    class Visual {
        +x: float
        +y: float
        +width: float
        +height: float
        +draw(): void
    }
    class Group {
        +members: ArrayList~Gizmo~
        +add(Gizmo): void
        +remove(Gizmo): void
    }
    class Scene {
        +update(): void
        +create(): void
        +destroy(): void
    }
    class CharSprite {
        +idle(): void
        +move(int, int): void
        +attack(int): void
        +die(): void
    }
    class DungeonTilemap {
        +SIZE: int
        +screenToTile(int, int): int
        +tileToScreen(int): PointF
        +drawVisuals(): void
    }
    
    Gizmo <|-- Visual
    Gizmo <|-- Group
    Group <|-- Scene
    Scene <|-- GameScene
    Visual <|-- CharSprite
    Visual <|-- DungeonTilemap
                

3. 유스케이스 다이어그램

3.1 플레이어 기본 상호작용

                    sequenceDiagram
                        actor 플레이어
                        participant 게임시스템
                        participant 던전
                        participant 캐릭터
                        participant UI

                        플레이어->>게임시스템: 게임 시작
                        게임시스템->>던전: 새 던전 생성
                        던전->>던전: 레벨 생성
                        던전->>캐릭터: 영웅 초기화
                        게임시스템->>UI: 게임 화면 표시

                        rect rgb(240, 240, 250)
                            note right of 플레이어: 기본 게임플레이 루프
                            플레이어->>캐릭터: 이동 명령
                            캐릭터->>던전: 위치 갱신
                            던전->>UI: 시야 및 맵 업데이트
                        end

                        플레이어->>캐릭터: 적과 전투
                        캐릭터->>캐릭터: 공격 계산
                        캐릭터->>UI: 전투 결과 표시

                        플레이어->>캐릭터: 아이템 사용
                        캐릭터->>캐릭터: 아이템 효과 적용
                        캐릭터->>UI: 상태 업데이트
                

3.2 던전 탐험 및 레벨 진행

                    sequenceDiagram
                        actor 플레이어
                        participant 영웅
                        participant 던전
                        participant 몬스터
                        participant 아이템
                        
                        플레이어->>영웅: 던전 레벨 탐험
                        영웅->>던전: 안개 제거 및 시야 업데이트
                        던전->>영웅: 발견된 요소 정보 제공
                        
                        영웅->>아이템: 바닥의 아이템 발견
                        플레이어->>영웅: 아이템 획득 명령
                        영웅->>아이템: 아이템 획득
                        아이템->>영웅: 인벤토리에 추가

                        영웅->>몬스터: 몬스터 발견
                        몬스터->>몬스터: AI 상태 갱신 (수면->사냥)
                        플레이어->>영웅: 전투 또는 회피 결정
                        
                        영웅->>던전: 계단 발견
                        플레이어->>영웅: 다음 층으로 이동 명령
                        영웅->>던전: 다음 레벨로 이동 요청
                        던전->>던전: 새 레벨 생성
                        던전->>영웅: 새 레벨에 영웅 배치
                

3.3 전투 시스템 상세 흐름

                    sequenceDiagram
                        actor 플레이어
                        participant 영웅
                        participant 몬스터
                        participant 무기
                        participant 버프
                        
                        플레이어->>영웅: 공격 명령
                        영웅->>영웅: 공격 정확도 계산 (attackSkill)
                        영웅->>몬스터: 회피 확인 (defenseSkill)
                        
                        alt 명중
                            영웅->>무기: 데미지 계산 (damageRoll)
                            무기->>영웅: 무기 데미지 반환
                            영웅->>무기: 특수 효과 처리 (proc)
                            무기->>버프: 효과에 따른 버프 적용
                            영웅->>몬스터: 최종 데미지 적용
                            
                            alt 몬스터 사망
                                몬스터->>몬스터: die() 메서드 실행
                                몬스터->>아이템: 보상 드롭
                                몬스터->>영웅: 경험치 제공
                            else 몬스터 생존
                                몬스터->>영웅: 다음 턴에 반격
                            end
                        else 회피
                            영웅->>영웅: 공격 실패
                            몬스터->>영웅: 다음 턴에 반격
                        end
                

3.4 아이템 및 인벤토리 관리

                    sequenceDiagram
                        actor 플레이어
                        participant 영웅
                        participant 인벤토리
                        participant 아이템
                        participant 장비
                        
                        플레이어->>인벤토리: 인벤토리 열기
                        인벤토리->>플레이어: 소지 아이템 표시
                        
                        플레이어->>아이템: 아이템 사용 선택
                        아이템->>아이템: 사용 가능 액션 반환 (actions)
                        아이템->>플레이어: 가능한 액션 표시
                        
                        alt 장비 착용
                            플레이어->>장비: 착용 명령
                            장비->>인벤토리: 기존 장비 해제
                            장비->>영웅: 새 장비 착용
                            장비->>영웅: 능력치 수정 (STR, DEF 등)
                        else 소비 아이템 사용
                            플레이어->>아이템: 포션/스크롤 사용
                            아이템->>영웅: 효과 적용
                            아이템->>인벤토리: 아이템 소모
                        else 아이템 버리기
                            플레이어->>아이템: 버리기 명령
                            아이템->>인벤토리: 인벤토리에서 제거
                            아이템->>던전: 현재 위치에 배치
                        end
                

4. 핵심 게임 시스템 설명

4.1 턴 기반 시스템

Pixel Dungeon은 전통적인 로그라이크 방식의 턴 기반 시스템을 사용합니다. 모든 행동(이동, 공격, 아이템 사용 등)은 턴을 소모하며, 플레이어의 턴이 끝난 후 모든 NPC와 몬스터가 자신의 턴을 실행합니다.

  • 각 Actor는 고유한 행동 속도를 가짐
  • 행동 속도는 spend() 메서드로 조절됨
  • Hero 클래스의 handle() 메서드는 플레이어 입력을 처리
  • Mob 클래스의 act() 메서드는 AI 행동을 결정

4.2 몬스터 AI

몬스터의 AI는 상태 기계(State Machine) 패턴으로 구현되어 있으며, 다양한 상태에 따라 행동 패턴이 결정됩니다.

  • Sleeping: 플레이어가 시야에 들어오기 전까지 대기
  • Wandering: 랜덤하게 주변을 이동
  • Hunting: 플레이어를 추적하고 공격
  • Fleeing: 체력이 낮을 때 플레이어로부터 도망
  • 특수 몬스터는 원거리 공격, 버프/디버프 부여 등 고유 능력 보유

4.3 던전 생성 시스템

던전 생성은 절차적 생성(Procedural Generation) 방식으로 매번 다른 맵을 생성합니다.

  • Level 크기의 직사각형에서 시작하여 재귀적으로 분할
  • 분할된 영역은 Room 객체로 변환
  • Room 타입에 따라 내부를 채우는 방식이 다름 (Painter 클래스)
  • 인접한 Room들을 연결하여 경로 생성
  • 특수 Room (상점, 함정방, 보물방 등) 배치
  • 아이템과 몬스터는 확률에 따라 배치

4.4 전투 및 데미지 시스템

전투 시스템은 공격/방어 스킬과 무기/방어구의 속성을 고려하여 계산됩니다.

  • 공격 정확도(attackSkill)와 회피(defenseSkill) 비교로 명중 여부 결정
  • 무기의 damageRoll()로 기본 데미지 계산
  • 방어구의 DR(Defense Rating)로 데미지 감소
  • 강화(Upgrade)와 인챈트(Enchantment)로 무기/방어구 능력 향상
  • 버프와 디버프가 공격과 방어에 추가 효과 부여

4.5 아이템 및 인벤토리 시스템

다양한 아이템은 식별, 사용, 강화, 저주 등의 복잡한 메커니즘을 가집니다.

  • 미확인 아이템(포션, 스크롤 등)은 사용 전까지 효과 알 수 없음
  • 강화는 스크롤을 통해 무기/방어구 성능 향상
  • 저주된 아이템은 장착 후 제거하기 전까지 해제 불가
  • 인벤토리 공간 제한으로 전략적 아이템 관리 필요
  • 아티팩트, 특수 아이템은 충전 또는 사용 횟수 제한 존재

4.6 자원 관리 시스템

생존을 위한 다양한 자원을 관리해야 합니다.

  • 허기(Hunger): 시간 경과에 따라 증가, 영향을 주는 버프
  • 체력(HP): 회복 아이템 한정, 충분한 회복 없이 전투 위험
  • 경험치(Experience): 레벨업을 통한 능력치 향상 필요
  • 골드(Gold): 상점에서 아이템 구매에 필요
  • 무기/방어구 강화(Upgrade): 제한된 강화 스크롤로 전략적 선택 필요

5. 마일스톤 기준 작업 권장사항

마일스톤 주요 구현사항 구현 권장 클래스
마일스톤 1:
기본 프레임워크
  • 타일맵 구현
  • 턴 기반 시스템
  • 카메라 시스템
  • 마우스 입력 시스템
  • 플레이어 기본 이동
  • Game 클래스 (메인 루프)
  • Dungeon 클래스 (게임 상태)
  • Level 기본 클래스
  • DungeonTilemap 클래스
  • Hero 기본 클래스
  • Camera 관련 기능
마일스톤 2:
전투 시스템
  • 절차적 맵 생성 (단일층)
  • 시야 및 탐색 시스템
  • 전투 시스템 구현 (HP, 데미지)
  • 적 AI 기본 구현
  • 사망 처리
  • Char 클래스 확장
  • Mob 클래스 및 기본 몬스터
  • AiState 인터페이스
  • RegularLevel 클래스
  • Room 클래스
  • FOV 관련 클래스
마일스톤 3:
아이템 및 인벤토리
  • 함정 시스템
  • 아이템 시스템 (장비, 소모품)
  • 인벤토리 시스템
  • 아이템 장착/소모 시스템
  • Item 클래스 계층구조
  • Belongings 클래스
  • Heap 클래스
  • Bag 클래스
  • Trap 클래스
  • 인벤토리 관련 UI 클래스
마일스톤 4:
다층 던전 및 진행
  • 절차적 맵 생성 (다층 구조)
  • 층간 이동 시스템
  • 특수 룸 생성 규칙
  • 시체/사망 기록 시스템
  • 몬스터 스폰 로직
  • 캐릭터 성장 시스템
  • 보스 AI 및 패턴
  • 다양한 Level 서브클래스
  • 특수 Room 클래스
  • Painter 클래스 확장
  • Bestiary 클래스
  • 보스 Mob 클래스
  • Hero 클래스의 경험치/레벨업
마일스톤 5:
자원 및 상호작용
  • 자원 관리 시스템 (허기 등)
  • 아이템 식별 시스템
  • 상태이상 시스템
  • 상호작용 시스템
  • 상점 UI 및 시스템
  • 게임 튜토리얼
  • Buff 클래스 계층구조
  • Hunger 클래스
  • Shop 관련 클래스
  • Generator 클래스 확장
  • Window 클래스 (상점, 튜토리얼 UI)
  • NPC 클래스

6. 결론 및 개발 팁

6.1 모듈화 및 클래스 구조

Pixel Dungeon의 코드 구조는 모듈화가 잘 되어 있어 확장성이 좋습니다. 다음과 같은 구조적 특징을 모작 게임에도 반영하는 것이 좋습니다:

  • Actor → Char → Mob/Hero 계층 구조를 통한 캐릭터 추상화
  • Level과 Room 분리를 통한 던전 생성 모듈화
  • Item 계층 구조를 통한 다양한 아이템 타입 지원
  • Buff 시스템을 통한 상태 효과 구현
  • 시각 요소(CharSprite, ItemSprite 등)와 로직 분리

특히 턴 기반 시스템의 핵심인 Actor 클래스와 적 행동을 결정하는 AiState 시스템은 초기부터 올바르게 설계해야 합니다.

6.2 점진적 개발 접근 방식

Pixel Dungeon과 같은 복잡한 게임은 단계적으로 개발하는 것이 중요합니다:

  1. 먼저 기본 게임 루프와 렌더링 시스템 구축
  2. 타일맵과 기본 캐릭터 이동 구현
  3. 간단한 전투 시스템 추가
  4. 인벤토리와 아이템 시스템 구현
  5. 던전 생성 알고리즘 개선
  6. 고급 기능(버프, AI, 특수 효과) 추가

각 마일스톤마다 기능을 테스트하고 안정화한 후 다음 단계로 진행하세요.

6.3 C++ WinAPI 구현 시 고려사항

원본 Pixel Dungeon은 Java/LibGDX로 개발되었으므로, C++ WinAPI로 포팅 시 다음 사항을 고려해야 합니다:

  • Java의 객체지향 구조를 C++에 맞게 변환 (상속, 인터페이스 등)
  • LibGDX의 렌더링 시스템을 WinAPI GDI/Direct2D로 대체
  • 메모리 관리에 주의 (스마트 포인터 사용 권장)
  • 게임 루프와 타이머 관리 (WinAPI 타이머 또는 하이퍼포먼스 카운터 사용)
  • 입력 처리 시스템 (WinAPI 메시지 처리)
  • 리소스 로딩 및 관리 (이미지, 사운드 등)

또한 WinAPI 기반 게임에서는 더블 버퍼링을 사용하여 화면 깜빡임을 방지하고, 픽셀 아트를 위한 적절한 스케일링 방법을 구현해야 합니다.