1. 투명화 처리

강의 내용

  • BitBlt는 단순히 비트맵 이미지를 복사하는 함수로, 투명 처리 기능이 없습니다.
  • TransparentBlt를 사용하여 투명화 처리가 가능하게 수정합니다.
  • TransparentBlt는 특정 RGB 값을 투명하게 처리합니다. 예를 들어 RGB(255,255,255)는 흰색을 투명하게 처리합니다.
  • msimg32.lib를 프로젝트에 링크해야 TransparentBlt 함수가 작동합니다.

관련 코드 분석

::TransparentBlt(
    hdc,
    (int32)_pos.x - size.x / 2,
    (int32)_pos.y - size.y / 2,
    size.x,
    size.y,
    _sprite->GetDC(),
    _sprite->GetPos().x,
    _sprite->GetPos().y,
    _sprite->GetSize().x,
    _sprite->GetSize().y,
    _sprite->GetTransparent() // RGB(255,255,255)로 설정해 흰색을 투명 처리
);
  • TransparentBlt는 대상 DC(hdc)에 비트맵 이미지를 복사하면서 특정 색상을 투명 처리합니다.
  • _sprite는 스프라이트 정보를 관리하며, 크기, 위치, DC, 투명 색상 정보를 제공합니다.
  • _pos는 화면에서 스프라이트가 그려질 위치입니다.

2. 플립북 생성

강의 내용

  • 플립북은 애니메이션의 기본 단위로, 여러 프레임을 관리하며 재생 속성(loop, duration)을 설정할 수 있습니다.
  • FlipbookInfo 구조체에 플립북의 정보를 저장하고, 이를 Flipbook 클래스에서 관리합니다.

관련 코드 분석

struct FlipbookInfo {
    Texture* texture = nullptr;  // 애니메이션 텍스처
    wstring name;               // 플립북 이름
    Vec2Int size = {};          // 각 프레임의 크기
    int32 start;                // 시작 프레임
    int32 end;                  // 종료 프레임
    int32 line;                 // 프레임이 위치한 줄
    float duration = 1.f;       // 애니메이션 지속 시간
    bool loop = true;           // 반복 재생 여부
};
  • texture: 플립북이 사용할 텍스처를 지정.
  • startend: 애니메이션의 시작 및 끝 프레임 번호.
  • duration: 전체 애니메이션이 몇 초 동안 재생되는지 설정.

3. 리소스 매니저에서 플립북 등록

강의 내용

  • ResourceManager에서 플립북을 관리하고 플립북을 키로 등록.
  • 이후 애니메이션 액터는 ResourceManager에서 플립북을 참조하여 사용할 수 있음.

관련 코드 분석

Flipbook* ResourceManager::CreateFlipbook(const wstring& key) {
    if (_flipbooks.find(key) != _flipbooks.end()) {
        return _flipbooks[key];
    }
    Flipbook* fb = new Flipbook();
    _flipbooks[key] = fb;
    return fb;
}
  • 플립북을 생성하거나 기존에 생성된 플립북을 반환.
  • unordered_map 컨테이너로 플립북을 키-값 형태로 관리.

4. 플립북을 사용하는 FlipbookActor

강의 내용

  • FlipbookActor는 플립북을 사용해 애니메이션을 처리.
  • 매 프레임마다 플립북 정보를 업데이트하여 애니메이션이 진행되도록 구현.

관련 코드 분석

void FlipbookActor::Tick() {
    if (_flipbook == nullptr) return;

    const FlipbookInfo& info = _flipbook->GetInfo();
    if (!info.loop && _idx == info.end) return;

    float deltaTime = GET_SINGLE(TimeManager)->GetDeltaTime();
    _sumTime += deltaTime;

    int32 frameCount = (info.end - info.start + 1);
    float delta = info.duration / frameCount;

    if (_sumTime >= delta) {
        _sumTime = 0.f;
        _idx = (_idx + 1) % frameCount;
    }
}
  • _sumTime는 프레임 간 경과 시간을 누적.
  • _idx는 현재 재생 중인 프레임의 인덱스를 나타냄.
  • deltaTimedelta를 비교해 프레임 변경 시점을 계산.

5. 플레이어에 애니메이션 적용

강의 내용

  • 플레이어의 이동 방향에 따라 다른 플립북을 설정.
  • 입력 처리를 통해 플레이어의 움직임과 애니메이션을 동기화.

관련 코드 분석

void Player::Tick() {
    float deltaTime = GET_SINGLE(TimeManager)->GetDeltaTime();

    if (GET_SINGLE(InputManager)->GetButton(KeyType::W)) {
        _pos.y -= 200 * deltaTime;
        SetFlipbook(_flipbookUp);
    } else if (GET_SINGLE(InputManager)->GetButton(KeyType::S)) {
        _pos.y += 200 * deltaTime;
        SetFlipbook(_flipbookDown);
    } else if (GET_SINGLE(InputManager)->GetButton(KeyType::A)) {
        _pos.x -= 200 * deltaTime;
        SetFlipbook(_flipbookLeft);
    } else if (GET_SINGLE(InputManager)->GetButton(KeyType::D)) {
        _pos.x += 200 * deltaTime;
        SetFlipbook(_flipbookRight);
    }
}
  • 키 입력에 따라 플레이어의 위치와 플립북이 변경됨.
  • SetFlipbook을 통해 적절한 플립북을 활성화.

6. DevScene에서 초기화

강의 내용

  • DevScene에서 리소스 로드, 스프라이트 및 플립북 생성, 액터 초기화.
  • BeginPlay를 호출하여 초기 설정 수행.

관련 코드 분석

void DevScene::Init() {
    GET_SINGLE(ResourceManager)->LoadTexture(L"PlayerUp", L"Sprite\\Player\\PlayerUp.bmp", RGB(128, 128, 128));
    Flipbook* fb = GET_SINGLE(ResourceManager)->CreateFlipbook(L"FB_MoveUp");
    fb->SetInfo({ texture, L"FB_MoveUp", {200,200}, 0, 9, 1, 0.5f });

    Player* player = new Player();
    _actors.push_back(player);

    for (Actor* actor : _actors) {
        actor->BeginPlay();
    }
}
  • 리소스 매니저를 통해 플립북을 생성하고 필요한 정보를 설정.
  • Player 객체를 생성하여 _actors 리스트에 추가.

profile
李家네_공부방

0개의 댓글