WinAPI 52 UI(6)

CJB_ny·2022년 9월 30일
0

WinAPI

목록 보기
54/79
post-thumbnail

오늘 배운거 👍👍👍

  • 벡터의 뒤로 UI를 보내 렌더링시 우선순위를 높이는 방법

  • 포커싱된 UI들에 한해서 이벤트를 호출 하도록 구현

    이전에는 모든 UI들을 for문을 돌면서 이벤트를 누구한테 보낼지 정하던 부분에서 개선함.


이때까지 씬의 모든 UI들에 대해서 벡터를 싹다 순회를 하면서 이벤트를 보내 주었었는데

이제는 UIManager 에소 현재 포커싱된 애를 관리를 한 다음에 그녀석에 대해서만 이벤트 처리를 해주면된다.

이런식으로 찾아주도록 하자.

그러면 이제 update 함수의 구조를 좀 바꾸어 보도록 하자.

그래서

이런 부분은 이제 없어져도 되고

이런식으로 로직이 흘러가야한다. GetFocusUI가 이제 구현되어 있으면 된다.

여기서 부터는 부모 UI들 끼리의 경쟁이다.

렌더링 순서

현재 Scene에서 렌더링 순서가 _objects라는 벡터에 쌓여 있는 순서대로 렌더링이 진행이 된다.

벡터의 뒤쪽에 있을 수록 앞에 와 있는 것처럼 보인다. => '렌더링 우선 순위가 높다"

가장 최근에 포커싱 받았던 순서대로 정렬되어 있다.

렌더링 순서는 가장 뒤에 있는 계산기 UI가 가장 먼저이다.

이 말은 =>

2번 UI를 포커싱 잡았다고 치면은 그 녀석이 벡터의 가장 뒤로 가면 된다.

그러면 렌더링이 가장 마지막에 되어서 제일 앞에 나와 보이게 된다.

=> 그냥 언제나 포커싱 된 녀석을 가장 뒤로 보내면 된다.

그래서

이 현재 원본 벡터를 수정해야한다.

벡터 수정 방법

그냥 const 참조 형태로 주지말고 일반 참조 형태로 바꾸든지

아니면 포커싱된 UI를 제일 뒤로 보내는 함수를 만들어 놓던지

우리는 UI 그룹만 일반 참조로 반환하는 함수를 만들어주고 구현을 해주도록 하자.

현재 vecUI의 순서는 중요하다 (이 부분에서 클릭여부를 따져서 => 포커싱 UI를 반환할 것이기 때문에)

그런데 문제가 벡터의 제일 마지막에 들어가 잇는 녀석이 제일 앞에 그려지는데

사진처럼 문제 상황이 딱 곂치는 부분 클릭했을 경우이다.

현재 곂치는 부분을 클릭 했을 때 빨강이 녀석이 "나를 클릭했네?" 라고 생각해서

벡터의 가장 뒤로 보낸다고 치자.

그러면 그 다음 순서인 마지막 벡터

노랑이 검사할 차례가 와서 "어? 나를 클릭했네?" 라고 인식이 되니까 이녀석이 다시 벡터의 제일 뒤로 가게 될 것이다.

그래서 결과적으로 순차적으로 검사를 하는게 맞다.

앞전에 있던 녀석들이 먼저 눌렷다고 해서 바꿔주지는 않을 것이다.

왼족 버튼이 눌렸다고 하는 녀석들에 대해서만 체크를 해서 포커싱 UI를 교체를 해줄 것이다.

GetFocusUI 로직

현재씬 -> UIObjects 가져온다 -> tapLbtn 확인한다. if 로 통과했다면은 Lbtn누른 상황이다.

왼쪽클릭 한상태에서 IsMouseOn체크를 통해서 모든 부모 UI들에 대해서 마우스도 올라가있고 클릭한 상태를 확인을 해서 포커싱 UI를 계속해서 변경한다.

여기서 이제 추가적으로 벡터의 순서를 바꾸는 작업이 필요하다.

주의 사항

허공을 클릭할경우

특정 키 입력 => 포커싱 변경

캐릭터 정보창을 보고 싶다거나 할 경우

특수한 키 입력 => 특정 UI 포커싱 하게 하려면은 특정키 입력시 포커싱 UI 변경해주는 함수가 필요하다.

이녀석으로 바로 포커싱 UI변경해 버리면 된다.

그리고 벡터 순서 변경을 해야한다. (render함수는 계속 호출이 되는 상황이니까)

이렇게 구현을 해주도록 하자.

그러면 ToolScene의 update에서 특정 키 입력을 기다리고 특정키 입력이 발생하면은 SetFocus 함수에 해당 UI를 넘겨주면은 될 것이다.

72번 째 줄 수정만하고 실행하면 잘 된다.

현재 포커싱 된 UI를 push_back으로 뒤로 돌려보냈으니까

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

0개의 댓글