WinAPI 23 Resource (2)

CJB_ny·2022년 9월 6일
0

WinAPI

목록 보기
22/79
post-thumbnail

우리가 Blink 현상 제거를 할려고

Bitblt함수를 사용하여

다른 비트맵에 먼저 싹다 그린다음에

BitBlt함수를 사용하여 메인 윈도우에 그리는 식으로 진행을 했다.

이렇게 전체 복사를 했다.

근데 우리가 비트맵에 그릴려는 것은 작은 픽셀 덩어리 이다.

이 픽셀 데이터를 싹다 복사를 해서 플레이어가 있는 자리에 옮겨야 한다.

DC와 DC연결 ❗❗❗

이렇게 그릴려면 이미지의 가로, 세로 길이 알아야한다.

이런식으로 알아야한다.

BitBlt으로 비트맵과 비트맵과의 이동을 할 때 DC라는 인터페이스가 반드시 필요하다.

DC와 DC끼리 옮겨 찍는 것이기 때문에

각 DC가 목적지로하는 비트맵간에 복사가 일어나고

그래서 비트맵만

이렇게 로딩하고 끝내면 안된다.

DC와 DC 사이의 연결이 필요하다. 우리가 로딩시킨 비트맵의 가로세로 알아야하고,
로딩한 비트맵과 연결 시켜줄 DC도 필요하다.

그래서 이제 DC 생성 ㄱㄱ

그래서 CreateCompatibleDC에 들어갈 값은 Core의 MainDC이다.

이후 Texture의 _dc에다가 dc만들어주고나서 prevBit는 한픽셀짜리로 임시로 만들어지니까

바로 DeleteObject 한다.

GetObject

GetObject라는 윈도우 함수 사용하자.

BITMAP이라는 녀석은 가로 세로 등등 정보를 가지고 있는 구조체이다.

이녀석을 주소로 넣어서 정보를 받아온다.

이렇게 얻어 올 수 있다.

Player에서 값 받기

GetWidht의 반환값은 UINT == int64__인데

현재 이런식으로 밖으로 삐져나가서 안보일 수도 있다.

그래서 값을 받아 줄 때는 그냥 int로 받는다.

만약 width, height를 unsigned int로 받았다가 자칫 잘못해서 음수로 넘어갈 경우에

음수부호 부분이 없기 때문에 40억대의 커다란 숫자가 될 수도 있다.

그리고 Vector2의 멤버 변수 타입은 float 이기 때문에 계산만 float하고 BitBlt에 줄때는 다시 정수로 캐스팅 해서 주도록 하자.

현재 이부분이 좌상단 좌표이다.

이렇게 수정함.

결과

지금 잘 나오는데 이게 맞음. 이미지 자체가 저렇게 나오는게

그런데 지금 원하는 것은 달고나 뽑기처럼 나오기를 원한다.

그래서 우리가 원하는 모양에 해당하는 픽셀만 옮기면 된다.

원본 이미지 자체는 사각형으로 존재할 수 밖에 없기 때문에.

마젠타 색상 ❗

달고나 찍을라면 if로 조건 체크 해야할 때

R G B 값이 255, 0, 255 핫핑크 인데 => '마젠타 색상'이라고한다.

이거 공간에 채워 넣는 이유가 현실에서 거의 안쓰는 색상이기 때문에 이값으로 채워 넣는다.

255, 0, 255을 무시하겠다 라는 것이다.

그래서 BitBlt말고 내가 원치 않는 색상을 걷어내고 사용할 수 있는 함수가 있다.

조건을 걸어주면 해당 조건을 무시하고 BitBlt한다는 말이다.

이까지 다 똑같음.

85 : 목적지

86, 87 : 좌상단

88, 89 : 가로, 세로 길이

90 : 원본 DC

이까지 똑같고 그 다음 조금 다르다.

이렇게하고 그다음 SRCCOPY인데 복사하는 작업은 당연한데

RGB로 무시할 생상 넣어준다.

근데 이거 실행하면 에러나는데

이렇게 선언만 하고 구현부에 해당하는 라이브러리를 참조하지 않았기 때문이다.

요구사항이 헤더가 헤더를 참조하고있는 상황이다.

이까지는 아는 상황인데 구현부분이 없다는 것이다.

그래서 링크 단계에서 문제가 발생한다.

있다라고만 선언해주고 실제 구현부분이 없어서 동작을 못함.

Msimg32.lib이라는 라이브러리 안에 들어있다. 실제 구현부가...

라이브러리 참조 방법

pch.h로 가서

#pragma comment(lib, "Msimg32.lib")

이렇게 알려주면 된다.

이런 lib 들은 vs설치하면서 개발도구에 다 들어가 있다.

알아서 경로를 다 찾기 때문에 상관없다.

잘된다.

문제점 ❗❗❗

지금 Texture를 player가 생성될 때 생성자에서 로딩을 하고있다.

플레이어 객체는 하나 이겠지만,

몬스터의 경우 지금 10마리인데

생성자에서 만드는 식이라면은 몬스터가 멤버로 Texture* 를 각기 다 들고있다면은

10번만들때 마다 똑같은 이미지가 힙에 로딩이 될 것이다.

(new 로 하니까)

이것은 'Resource'의 개념이 아니다.

모든 몬스터가 하나의 텍스쳐를 참조를 하게 해야한다.

메모리 측면에서 리소스의 개념에 부합하지 않는다.

이런 resource들은 ResourceManager를 통해서 이제부터는 로딩을 해야한다.

이제부터는 Resource를 관리하는 ResourceManager를 통해서만 resource를 로딩해야한다.

있으면 그냥주고 없으면 로딩하고...

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글