게임 개발/프로젝트

C++ 팀프로젝트 - 텍스트 RPG 게임 만들기(5)

이개 2026. 4. 1. 21:02

Unique pointer와 Shared Pointer 사용처 차이

  • 소유자가 1명으로 명확하다 → unique_ptr (인벤토리 슬롯, 플레이어 장비 등)
  • 여러 곳에서 참조해야 한다 → shared_ptr (퀵슬롯 + 인벤토리 동시 참조, 파티원 공유 버프 등)

 

캐릭터 장비

캐릭터 장비같은 경우는 보통 인벤토리와 equipped를 나눠서 캐릭터에 작성한다.

 

 

윈도우 콘솔에 사운드 넣기

 

#pragma once
#include <windows.h>
#pragma comment(lib, "winmm.lib")

class SoundManager {
public:
    static SoundManager& getInstance()
    {
        static SoundManager instance; // 최초 1회만 생성
        return instance;
    }

    // BGM 재생 (루프)
    static void PlayBGM(const wchar_t* filePath);

    // 효과음 재생
    static void PlaySFX(const wchar_t* filePath);

    // 사운드 정지
    static void Stop();

private:
    // 생성자를 private으로 막음
    SoundManager() {};

    // 복사/대입도 막음
    SoundManager(const SoundManager&) = delete;
    SoundManager& operator=(const SoundManager&) = delete;
};

 

 

PlaySound 각 매개변수

1. pszSound - 재생할 대상

PlaySound(L"effect.wav", ...)   // 파일 경로
PlaySound(NULL, ...)             // 재생 중지

2. hmod - 모듈 핸들

// 파일 재생할 때는 그냥 NULL 쓰면 됨
PlaySound(L"effect.wav", NULL, ...)

3. fdwSound - 재생 방식 플래그

SND_FILENAME  // 파일 경로로 재생 (거의 필수)
SND_ASYNC     // 비동기 (소리 나오면서 코드 계속 진행)
SND_SYNC      // 동기 (소리 끝날 때까지 대기)
SND_LOOP      // 반복 재생
SND_NODEFAULT // 파일 없어도 기본 비프음 안 냄

 

 

Enum Class에 사운드 지정해두고 호출할 때 쓰기

enum class BGM {
    Scenario,
    Battle
};

 

void SoundManager::PlayBGM(BGM Bgm) {
    switch (Bgm)
    {
        case(BGM::Scenario) :PlaySound(L"Sound/Medieval Tavern 05.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);

    }
}

플래그 종류

SND_FILENAME  // 파일 경로로 재생
SND_ASYNC     // 비동기 (소리 나오면서 게임 진행)
SND_SYNC      // 동기 (소리 끝날 때까지 멈춤)
SND_LOOP      // 반복 재생 (BGM에 사용)
SND_NODEFAULT // 파일 없어도 에러음 안 냄
  • SND_LOOP랑 SND_ASYNC 같이 써야 BGM이 반복되면서 게임이 멈추지 않는다!
  • WAV 파일만 가능

 

PlaySound는 첫번째 매개변수가 wchar_t*라서 문자열 앞에 L 붙여서 변환해줘야함

효과음 동시재생 불가능

중간에 멈추고 다시 재생 불가능

 

동시재생하려면 mciSendString 사용해야함!

 

더 발전된 방식 (맵/테이블)

std::unordered_map<SFX, std::wstring> soundTable;


soundTable[SFX::Jump] = L"jump.wav";
👉 유지보수 최고
 

🎵 BGM (배경음)

  • 보통 한 번에 하나
  • 길게 재생
  • 상태 관리 필요 (loop, stop 등)

💥 SFX (효과음)

 
  • 동시에 여러 개 재생됨
  • 짧음
  • 많이 호출됨

 

git 저장소 캐시 정리

git fetch # 원격 저장소 최신 정보 가져오기

--prune # 원격에 없어진 브랜치를 로컬 캐시에서 정리

브랜치 삭제하고 나서 기존 내역을 정리하고 싶을 때 사용한다.

'게임 개발 > 프로젝트' 카테고리의 다른 글

배경 에셋 관리 일지  (0) 2026.03.15
게임 맵 만들어보기  (0) 2026.02.19
LMS 개발 일지 - 블챌을 시작하며  (2) 2024.11.03