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()
);
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: 플립북이 사용할 텍스처를 지정.
start와 end: 애니메이션의 시작 및 끝 프레임 번호.
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는 현재 재생 중인 프레임의 인덱스를 나타냄.
deltaTime와 delta를 비교해 프레임 변경 시점을 계산.
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 리스트에 추가.