WinAPI 46 Tool (3)

CJB_ny·2022년 9월 23일
0

WinAPI

목록 보기
47/79
post-thumbnail

오늘 배운거 👍👍👍

  • 제발 니가 헤더에 정의해놓고 안된다 하지말자...

  • dynamic_cast

    다운캐스팅을 진행한ㄷ.

    실패하면 nullptr, 성공하면 그대로 값 반환.

  • tile을 index로 vector 내에서 바로 찾아내 버리는 방법에 대한 이론과 개념


TileCountProc함수 인자에

message를 스위치로 나누었는데 이때 메세지가 발생한거 잡고

if문으로 wParam값으로 IDOK인지 아닌지 구분이 가능한 것이다.

그럴 경우에서 ID값자체를 EndDialog의 결과값으로 셋팅해놓았다.

이 EndDialog반환값을 INT_PTR로 받을 수 있는데 이게 IDOK일 경우 if문으로 이렇게 확인이 가능하다.

여기서 분기처리를 할 수도 있지만 굳이 이것을 여기서 할 필요는 없다.

그냥 여기서 처리하는게 좋다.

시발 링킹 에러 ❗❗❗

지난시간에 여러번 정의되었다는 말 대문에 main..cpp에 프로시져함수 옮겼는데

시발 정의한 부분을 toolscene.h에다가 시발 정의를 하니까 toolscene참조하는 부분에서 함수 중복 정의가 되어서 그런거임...

ToolScene.cpp로 옮기니까 해결됨...


두번째 인자가 DialogBox인데 종료가 되었을 때 결과값을 무엇을 넣어줄지에 대한 것이다.

여기 숫자 False => True => 숫자 아니면 타이핑이 안된다.

윈도우에 값 입력 => 값을 가져올 수 있는 윈도우 함수 존재

HWND = 핸들 의미, 메세지발생할 때 자동으로 인자로 들어옴.

정수, 문자 ❗❗

이렇게 정수값을 읽어올 것이다.

그런데 윈도우 메세지 박스에 입력하는 것들은 '문자열'이다.

문자열로 수를 나열했는데 -> 이 문자열을 실제 int 정수 타입데이터로 바꿔 준 것이다.

GetDlgItemInt가 아니라 GetDlgItemText라했으면은 문자열 자체를 가져올 것이다.

"123"은 123이 아니다. 123은 비트열로 123이 나올 수 있는 것을 말하는 것이고

문자 "1", "2", "3"은 각자 아스키 코드에 대응하는 아스키 코드값말하는 것이다.

잘나온다.

Proc 쪽에서 해야할일

입력을 받고 타일을 만들어주면되는데 만들어주기 전에 뭐부터 해야하나?

이전에 있던 타일 없애야한다. (기존에있던 타일 삭제)

타일 그룹을 삭제를 하고 createTile만든거 호출해야한다.

그전에 뭐부터 해야하노?

지금 이 함수는 멤버 함수가 아니다!

DeleteObject바로호출 못한다.

SceneManager에서 현재 씬부터 가져와야한다❗❗❗

이렇게 include해서 접근 가능한데, 현재 이 기능은 ToolScene 에서만 동작해야한다.

StartScene에서도 창 켜서 실행할 수 있으니까 방법을 찾아야한다.

그래서 MENU바는 ToolScene에서만 활성화 시킬 것이다.
=> 그렇게하면 되겠네요? => ㄴㄴ 코드로는 안 막혀있다.

코드로 상황을 안잡아주고 '정황'상으로만 상황을 잡아주게되면은

항상 예외 상황이 발생을 한다.

dynamic_cast ❗

이따구로 수정을 해주도록 하자.
텍스트

잘된다.

마우스 좌표얻어 내기

현재 ToolScene에 클릭한 곳의 타일을 변경하는 기능을 추가해 볼 것이다.

그러려면 마우스 좌표의 렌더링 좌표가 아니라 실제 좌표가 필요하고,

이중반복문을 돌면서 어떤 타일을 찾을게 아니라 타일의 갯수를 먼저 들고있고,

이것을 계산 하는 방법으로 구현을 하자.

CreateTile할 때 AddObject하면서 GROUP_TYPE Tile의 벡터안에다가 다 넣었는데

개념상 그림은 오른쪽 처럼 몇행 몇열 이고 실제로는 벡터에 한줄로 다들어 가 있다.

그중에서도 '현재 마우스 위치'와 마우스 위치에 따른 '특정 타일의 인덱스' 위치를 알아낼 수 있으면

가장 빠른 방법이다. 가장 최고속도이다.

하나의 타일의 크기를 64로 해두어가지고 지금 하얀색점이 좌표인데 몇번째 행인지 몇번째 열인지 64로 나누어보면 알 수 있다.

ex) Mouse_pos ( 128 , 129 ) 을 64로 나누었을때 몫이 2, 2나오는데

x = 2, y = 2라는 것을 알 수 있다.

한줄에 10개라했을때 3행 7열은 30개를 건너뛰고 8번째를 말하는 것이다.

GetRenderPos의 이해 ❗❗❗

Vecotr2 mousePos를 처음에 MOUSE_POS로 받고 GetRealPos를 얻어 온다음에

다시 67번째 줄처럼 mousePos = 이작업 안해주었다.

만약 안해주게 되면은, 현재 실제 좌표를 못 얻어온다.

못 얻어오게 되었을 경우

CameraManager

현재 카메라 Manager의 GetRenderPos, GetRealPos 두 함수인데

objPos - _diff를 해주고있다. _diff는

해상도 중심과 LookAt좌표값의 차이이다.

이녀석은 지금 CalDiff에서 구해지고있는데

(선형보간?) -> 등가속 운동으로 카메라를 이동시키기 위해서 CalDiff함수를 구현했는데

_corLookPos를 accTime에 맞춰서 이전방향으로 1초동안 날아갈 수 있게 한 것이다.

한 프레임임 동안 그리고 이동했을 때의 resolution을 구하고 centerpos를 구한다음에

현재보고 있는 _corLookPos에서 center좌표를 뺀 값을 _diff넣고있다.

그러면 화면을 왼쪽 위로 (11시방향으로 향하는 대각선으로) 이동시키면 _diff값이 늘어나게 된다.

그래서 GetRenderPos는 오브젝트 위치에서 - diff(늘어난값)을 뺀것이 현재 화면에 보여지는 위치이고,

GetRealPos = 실제위치는 현재 오브젝트의 위치에서 빼준 값만큼을 더한게 실제위치가 되기때문에

tile을 클릭할때의 마우스 좌표가 renderPos인지 realPos인지 모르기때문에

현재 클릭했었을때의 실제 좌표를 구한다음에 그 실제 좌표값으로 행과 열을 구해야지

벡터에 정상적으로 접근이 가능한 것이다.

예외처리를 해야할 부분도 여기서 생기는게 벡터의 크기를 초과하는 빈 저기 어딘가를 클릭하게 되었을 때 벡터의 size를 초과를 해서 크래쉬가 나기 때문에

예외처리를 해주어야한다는 것이다.

일단 가라 식으로 구현함.

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

0개의 댓글