WinAPI 30 Collider (6)

CJB_ny·2022년 9월 10일
0

WinAPI

목록 보기
29/79
post-thumbnail

오늘 배운거 👍👍👍

  • 전역 변수의 초기화 및 #include 전역변수 할 때 문제점

    지금 a라는 헤더파일안에 Test라는 class가 존재할때 Test class안에 전역변수 정의만 해놓고 class밖에다가 초기화를 해놓을 경우 계속 '링킹 단계'에서 문제가 발생했었다.

    cpp파일 하나만 a라는 헤더파일은 include하면 상관은 없지만
    여러개의 cpp파일이 a를 include할 경우 데이터 영역에 같은 이름의 변수가 생겨벼러서 여러변 선언했다고 링킹 에라가 떴었던 것이다.


현 시점 기준으로 충돌을 검사를 할 것이다.

최종시점에 검사를 해야한다.

ColliderManager의 update는 finalPos가 이미 나와있는 시점이다.

그다음에 CollisionManager update가 돈다.

그래서 충돌체의 최종위치를 가지고 와야한다.

충돌 판정

중점으로부터의 x크기만큼의 차이값을 구해서 충돌인지 아닌지 보도록 한다.

y축의 경웅에도 똑같이 하도록 한다.

왜 ' < ' 로 구별하는지 알겠나?

ㅇㅇ. 왜 absolute씌우는지 생각해라 두 물체의 위치 뺏을 때 값이 음수가 나올 수도 있으니까...

오류 원인 ❗❗❗

https://velog.io/@starkshn/CPP%EC%96%B4%EC%86%8C24%EB%B6%84%ED%95%A0-%EA%B5%AC%ED%98%84-%EB%AC%B8%EC%A0%9C%EC%A0%90

지금 내가 링킹 단계에서 이슈가 계속 터졌는데

내가지금 Collider.h 에서 전역변수를 계속 초기화 하고있었다.

분할 구현을 할 경우 다른 파일들이 지금 Collider.h를 다 include 하고있는데

싹다 복사가 되는 과정이 발생을 한다.

이렇게 되면 include Collider.h를 한 녀석들 모두 정적 멤버 변수인 g_ID를 0으로 초기화 하는 부분이 들어가기 때문에 문제가 발생?

또한 정적 변수는 데이터 영역에 하나만 존재를 하게 하는게 목적인데

Collider.h르 include 를 한 모든 파일에서 같은 이름으로 g_ID로 데이터 영역에 변수를 올리기 때문에

같은 이름의 중복이 발생을 하여 계속 링킁 단계에서의 이슈가 발생한 것이다.

해결방안

그래서 g_ID를 초기화 하는 부분은 Collider.cpp에 밀어넣어버리면 해결이 된다.

문제발생

지금까지 아무런 문제없이 일단 잘 동작한다.

그런데 '구조적인 문제'가 발생을 한다.

충돌을 하고 있는 상황에서 제3자가 끼어들어서 충돌을 하면은

지금 충돌이 Exit한 상황이될 것이다.

그래서 이런식으로 증감, 시켜주도록 하자.

이값이 0보다는 작을 수 없기 때문에

finalUpdate부분에서

0보다는 크거나 같아야 하는 경우가 실패할 경우 assert를 해주도록 하자.

수정사항 ❗❗❗❗❗❗

현재 StartScene에서 먼저 충돌할 것들을 이렇게 등록을 해주는데

무조건 left로 들어가는 enum의 값이 작다고 가정하에 넣는데 만약의 경우를 대비해서

CheckGroup에 이런식으로 행이 더 클 경우 바꿔주는 작업을 했었는데

이게 지금 132번째줄에 temp 임시변수가 없다보니까

MONSTER는 2번이고 PROJ_PLAYER는 3번인데

2행 3열을 켜주는게 아니라 (temp없었을 때)

3행 3열을 켜주게 되어서 순서대로 넣지 않았을 경우 ColliderManager update에 걸리지 않았다...

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

0개의 댓글