WinAPI 25 Collider

CJB_ny·2022년 9월 8일
0

WinAPI

목록 보기
24/79
post-thumbnail

Scene에 있는 물체들 끼리의 충돌검사를 할 것인데

이게 쉽지만은 않다.

충돌했을 때 데미지 준다고 가정을 하면은

좋은 컴퓨터는 데미지를 엄청 나게 줄 수 있고

느린 컴퓨터는 데미지를 적게 주고 나올 것이다.

이런식으로

프레임 잘나온다면 개 긁듯이 긁으면서 데미지 주고 나옴.

충돌에 필요한 조건

(C# 예로들자면은 OnCollisionEnter, OnCollisionStay, OnCollisionExit 정도 되겠다)

1) 충돌한 그 순간

2) 충돌에서 계속 유지되는 순간

3) 충돌에서 벗어난 순간

충돌이 필요한 오브젝트 아닌 오브젝트 구별 필요함

오브젝트를 충돌, 충돌 안 필요한 애들로 상속으로 나눈다.

상속의 문제?

이렇게 상속으로 다 구현을 하면은

이제 '구조의 확장성'이 많이 떨어진다.

왜?? 모든게 처음에 내 생각대로 되지 않는다.

자유롭게 확장될 수 있는 구조적 설계 도 중요하다.

모든 오브젝트를 싹다 상속으로 하면 문제가 생길 수 있다.

그래서 '상속'은 최소화 하고, 확장성있는 구조를 선택할 때 사용하는 것이 '컴포넌트'기반 구조이다.

컴포넌트 기반

부품을 추가하듯이, 필요없으면 빼고 이런식.

필요하면 nullptr이 아니고 안 필요하면 nullptr이다.

Collider 클래스는 바운딩 박스를 만들어서 충돌 체크를 할 것이다.

오브젝트 따라가야한다.

update 관리

이렇게 멤버 포린터 변수를 가지고 있고 CreateCollider함수 호출시

필요한 애들은 생성자에서 CreateCollider를 호출한다.

progress 매 프레임 호출 -> 씬 update호출 -> 현재 씬 update 호출 -> 현재 씬의 모든 오브젝트의 update 호출 이런 순인데

collider는 내가 신경 쓰지 않아도 알아서 계속 update 되어야 한다.

엔진 구조상 매프레임마다 필수적으로 해야하는 update들이 존재한다.

이것들을 따로 모아서 관리를 하도록 하겠다(update들을)

그래서 SceneManager에서

'최종 update'하나 더 추가를 해주도록 하겠다.

작업을 마무리 해주는 update이다.

finalUpdate에서는 뭔가를 움직인다거나 그런 작업 할 수 없다.

그래서 모든 오브젝트들을 따라 다니기 위해서 finalUpdate를 호출 할 것이다.

virtual + final ❗❗❗

final이 뭐였나? => OOP 의 다형성이라는 특성을 사용해서 함수의 재사용성을 효율적으로 관리하는 거임 상속이라는 개념을 통해서

근데 '오버라이딩' 할 경우 내쪽에서 마지막으로 상속받았다! 라는것을 명시하기 위해서는 final키워드를 붙일 수 있었다.

finalUpdate는 자식쪽에서 상속을 막기 위해서 구현을 해놓고,

다른사람이 봤을때 뭐하는건가 싶어서 상속을 받을려고 해도 못하게 막기 위해서

virtual void finalUpdate() final; 이렇게 가능하다.

그러면 자식들은 finalUpdate를 자기 입맛에 맞게 구현할 수 있지만? => final키워드로 인해 CObject까지만 구현이 가능해서 상속하여 구현하는 것은 불가능하다.

흐름 파악 ❗

CCore 메인 코드인데

모든 매니저 update다 끝내고 render를 호출한다.

1) 모든 물체 다 움직임이 끝나고 나서야

2) finalUpdate호출 되고 나서 render 호출한다.

그래서 사용자 눈으로는 항상 같이 움직이는 것으로 보인다.

분리된 느낌을 받을 수 없다.

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

0개의 댓글