WinAPI 26 Collider (2)

CJB_ny·2022년 9월 8일
0

WinAPI

목록 보기
25/79
post-thumbnail

오늘 배운거 👍👍👍

  • assert

    안의 조건이 거짓일 경우 에러 뱉는다.

  • 충돌체 그리는 방법

  • SelectGDI 임시객체를 통한 펜 연결과 원래 펜으로 되돌려받기


Collider클래스도 자체적인 위치가 필요하다.

그러면 p_owner위치를 collider위치라고 하면 안되나?

그럼 따라갈 필요도 없는데 말이다...

=> 문제가 있다.

충돌체를 유연하게 사용못 할 수도있다.

만약에, 나중에

충돌체를 이렇게 설정하는게 아니라

충돌체를 대가리에다가 씌우고 싶다면은?


부위별로 충돌체를 넣고 싶을 경우?

offsetPos를 넣을 것인데

offset ❓❓

기준 위치에서부터의 상대적인 '차이값'을 말한다.

그래서 offset은 p_owner의 위치가 될 것이고

finalObjectPos는 offset만큼 더한 위치가 되는 것이다.

ㅇㅋ.

Vector2 연산자

이렇게 정의 ㄱㄱ.

assert ❗❗

assert는 조건 식(condition)을 인자로 받아 해당 조건식이 거짓(false, 0, '\0', NULL, nullptr)이면 프로그램을 중단시킨다. 그리고 assert에 사용된 조건식과 몇 라인에서 발생하였는지 출력한다. 따라서 개발자는 오류가 어디서 발생했는지 정확한 위치와 이유를 알 수 있다.

따라서

Vector2 나누기 연산 정의할 경우

_x, _y둘중 하나가 0이라면은

(0.f == other._x || 0.f == other._y) 이값은 true가 되고 true인 값을 반전시키니 false가 되어서 assert가 중단 할 것이다.

Collider 구현

일단 이따위로 구현을 해주도록 하고

초록색 선처럼 충돌하는 곳 보이게 하기 위해서 render구현해주도록 하자.

다른 컴포넌트 추가될 수 있으니 컴포넌트 render함수 따로 만들어서 관리 하도록 하자.

왜 빼주었나 ❓❓

지금 render 함수가 가상함수인데 예로 Player가 이 render함수를 상속받아서 자신의 입맛에 맞게 구현을 해놓았다.

그런데 Player의 경우 현재 p_collider가 nullptr이 아니기 때문에

충돌체크를 하기위해서는 Player자신의 render함수 내에서

이런식으로 부모의 render함수를 다시 호출하게되면

현재 부모의 render함수가 사각형을 그리고 있기 때문에 사각형이 그려질 것이다.

그래서 따로 빼줌.

충돌체 그리기

  1. 반복문 4번 돌기

좌상단 알고 선 그려버리기 ~ 4번

  1. 그냥 사각형 그리기 Rectangle 그리기.

대신에 Brush를 hollow브러쉬로 공백으로 채우는 방법.

비효율적

그런데 렌더링 할 때마다 green pen생성시켜서 dc에 연결해서 dc가 그것으로 그림 그리고

다시 되돌려주고 green pen지우고 => ㅈㄴ 비효울적.

그래서 자주 사용하는 커널오브젝트 미리 만들었다가 나중에 종료할 때 한번만 지우도록 하자.

그래서 자주 사용할 커널 오브젝트들을 CCore에서 관리를 하도록 하자.

enum class END사용해서 이따구로 멤버 변수랑 멤버 함수 구현하고

이따위로 만들어준다.

윈도우도 우리랑 생각이 같아서 자주 사용하는 애들 미리 생성해서 ID를 준다.
(GetStockObject로 가져올 수 있음 ID를)

이거를 내가 직접 Delete할 필요는 없다.(이녀석만)

펜 생성 ❗❗❗

펜의 경우 red, blue이런거 기본적으로 안줌. 우리가 만들어야함.

이녀석들은 직접 지워 주어야한다.

이렇게 ㄱㄱ.

펜 연결 ❗❗❗

이렇게 사각형 그리는데 그전에 펜 가지고와서

dc에 연결해주는데 이때 사용하는게 SelecObject함수이다.

이렇게 펜을 준다음에 원래 펜을 되돌려 받아야한다.

이따위로 받아주도록 하자.

이렇게 브러쉬도 연결해주고 사각형 그린다음에

원래것으로 되돌려 주어야한다.

그런데 이 전체과정이 길고 복잡하다. 귀찮기도 하고... 방법 없나?

클래스를 만들어서 관리를 하도록 하자.

임시객체 생성 ❗❗❗

여기서 SelectGDI라는 객체를 만든다. 이렇게 덩그러니 객체만 만들게 되면은

'임시 객체'가 생성되는데 (스택에) 해당 함수 종료하면 같이 없어질(날아갈, 메모리해제)가 될 것이다.

아까 render에서 복잡하게 했던 부분을 클래스 생성후 임시 객체로 이렇게 해결이 가능하다.

render한번 하고 어차피 사용안 할 객체니까 임시객체로 만들어 준 것이다.

근데 이거 지금 '임시객체'를 만들더라도 이름을 붙여주지 않으면 임시객체 생성하자마자 바로 소먈자 호출한다.

참고 ❗

CCore 생성자 부분에서 CreateHBRUHS, HPEN 해주어야한다.

내가 애초에 함수만 구현을 하고 만들어 주지를 않아서 default값으로 Collier그리고있었다..

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

0개의 댓글