본문 바로가기

개발 프로젝트/Win32 - VampireSurvivor 모작

로그라이크 게임 구현(4) - 비쥬얼 업데이트, TransparentBlt 함수

기존의 맵

 

변경된 맵

기존의 무미건조한 맵을 수정했다.

기존의 맵을 자세히 보면 파란색 사각형이 눈에 보일 것이다.

이는 플레이어가 이동할 수 있는 맵의 한계를 표시한 것이다.

포토샵을 사용해 새롭게 만든 맵에서 이 테두리를 따라 나무를 배치하여 이동의 한계선을 표현하였다.

 

 

왠지 섬뜩하게 생긴 기존 몬스터

 

귀엽게? 변경된 신규 몬스터

 숲을 연상시키는 필드에 어울리게 몬스터 비트맵도 변경했다.

기존 몬스터 비트맵과 달리 새로운 몬스터 비트맵의 배경색은 초록색이다.

배경색을 초록색으로 설정한 이유는, 비트맵의 배경을 생략시키고, 몬스터만 나오게 하기 위해서이다.

window.h 헤더 파일에는 비트맵을 표현하는 함수가 있는데, 그 중에서 특정 색상을 생략시키는 함수가 있다.

비트맵의 배경색을 자주 쓰이지 않는 색으로 설정하고 그 색을 생략시키면, 몬스터만 그리게 할 수 있다.

해당 함수의 이름은 TransparentBlt() 이다. 

 

 TransparentBlt()함수의 작동 방식은 기존의 비트맵을 그리게 하는 함수였던 BitBlt() 함수와 비슷하다.

그러나 TransparentBlt()함수는 BitBlt함수보다 더 많은 기능을 가지고 있다.

해당 함수의 원형은 아래와 같다.

 

BOOL TransparentBlt(

    HDC hdcDest,

    int xoriginDest,

    int yoriginDest,

    int wDest,

    int hDest,

    HDC hdcSrc,

    int xoriginSrc,

    int yoriginSrc,

    int wSrc,

    int hSrc,

    UINT crTransparent);

hdcDest

이미지를 출력할 위치의 핸들.

 

xoriginDest, yoriginDest

이미지를 출력할 위치인 x, y 좌표.

 

wDest, hDest

출력할 이미지의 너비, 높이.

이 크기만큼 hdcSrc로부터 받은 이미지를 이 너비와 높이에 맞게 이미지 크기를 변경.

 

hdcSrc

이미지의 핸들. 즉 갱신(추가)할 비트맵을 말한다.

 

xoriginSrc, yoriginSrc

가져올 이미지의 시작지점인 x, y좌표

지정한 위치부터 wSrc, hSrc만큼 이미지를 자른다.

 

wSrchSrc

원본 이미지로부터 해당 크기만큼 잘라낼 이미지의 너비, 높이.

이 크기만큼 원본 이미지에서 잘라내어 wDest, hDest의 크기에 맞게 이미지 크기를 변경.

 

crTransparent

투명하게 할 RGB 색상.

RGB 자료형으로 색상을 정한다.

 

 

먼저 알아볼 TransparentBlt 함수의 기능은 원본 이미지에서 내가 원하는 구역만큼 비트맵을 가져오는 기능이다.

이 기능을 왜 사용하는지 의문을 가지는 사람도 있을것이다.

큰 비트맵을 잘라서 작은 비트맵을 추출하기 보다는

처음부터 작은 비트맵을 사용하는게, 용량면에서 효율적이기 떄문이다. 

그러나 비트맵을 자르는 기능을 사용하여, gif를 효율적으로 구현할 수 있다. 

 

캐릭터 스프라이트 예시

캐릭터가 움직이는 모습을 구현하기 위해 16장의 작은 비트맵을 16개의 비트맵 변수로 선언하는것 보다,

처음부터 큰 비트맵을 하나의 비트맵으로 선언하는 편이 효율적이다.

TransparentBlt함수를 사용하여, 지금 표현하고 싶은 캐릭터의 모습을 x,y좌표를 사용하여 선택한 후

프레임마다 x , y 좌표를 변경시켜, 다른 캐릭터의 모습을 보여준다.

이러한 움직임 구현은 Window API에서 게임을 만들 때 중요한 요소이다.

아래 동영상은 TransparentBlt 함수를 이용하여 움직임을 구현한 모습이다.

 

gif 움직임 예시

움직임 구현 코드

또한 앞서 언급했던 특정 색상의 RGB값을 생략할수도 있다.

아래 영상은 캐릭터 비트맵 , 몬스터 비트맵의 배경색을 초록색으로 설정하여, 배경을 생략한 영상이다.

이상으로 TransparentBlt 함수를 활용한 비쥬얼 업데이트 글을 마무리 하겠다.