WinAPI 28 UI (2)

CJB_ny·2022년 9월 26일
0

WinAPI

목록 보기
49/79
post-thumbnail

오늘 배운거 👍👍👍

  • 기본생성자 제거

    되게 간단한데 잠시 잊고있었다.
    인자를 받는 생성자만들어지면 기본생성자는 자동으로 안 만들어진다.

  • 마우스 클릭, TAP, AWAY를 통한 UI클릭 이벤트 설계 ❗❗❗

UI는 마우스 인식도 해야하고 클릭도 인식을 해야한다.

이런거 그때마다 조건을 채크를 할게 아니라

UI 오브젝트들만의 Event를 다 설정을 해주면 된다.

어떤 UI든지간에 이벤트들을 다 설정을 해놓고 거기에 맞게 함수를 구현을 해놓자라는 것이다.

이벤트는 다 구현하니까 시점만 잡아주면된다.

이런 이벤트들이 있을 것인데 각 이벤트들의 조건을 생각해야한다.

그러면 이제 이런 UI들의 이벤트 처리를 해줄 담당자가 있어야한다.

UIM

이렇게 부모 UI다 얻어와서 체크를 할 것이다.

그런데 UI마다 마우스가 올라가 있는지 뭔지 체크하는 방식이 다 다르다.

어떤 UI는 카메라 영향을 받기도하고 안 받는 UI도 있다.

실제 UI 좌표

화면상이 이렇게 보여지고있어도 실제 UI좌표는 보여지는 곳이 아니다.

실제좌표는 이상한데 있는데, 카메라에 잡혀서 화면에 보여지고있는 것이다.

그래서 마우스 좌표도, 카메라 기준의 좌표니까 '실제 좌표'로 바꾼다음에

테스트를 해주어야한다.

(타일이랑 똑같다)

UI에서 bool값에 따라 render할 때도 달라지게 구현을 해주도록 하자.

UI 기본 생성자 ❌

인자를 받는 생성자를 만들어주었기 때문에

UI를 상속받는 애들은 '명시적'으로 구현해 주어야한다.

이런식으로다가..

mouse 체크

조건식 보면은 x 좌표일 때 마우스 체크하는 부분 이해가나? => OK.

이럴때 true이다.

현재 finalUpdate에서 다 호출하기 때문에 모든 UI가 마우스 체크를 한다.

finalUpdate_child를 호출하면서 finalUpdate가 호출되니까(자식들의)

그리고 UIManager에서

이렇게 dynamic_cast로 다운 캐스팅 후 마우스가 올라가있는지 아닌지를 확인해준다.

그리고 클릭이랑 Lbtn체크의 경우에는 keyManager에서 미리 결과 값들을 받아오도록 하겠다.

KEY_TAP의 반환값이 bool값이다.

마우스 왼쪽을 딱 땐 순간도 있고 tap을 한 순간도 있는데 이거 두개 동시에 false일수는 있지만

둘다 true일 수는 없다.

같은 프레임에서 tap을했는데 away는 말이 안됨.

이렇게 될 것이다.

클릭은 언제인가?? Lbtn이 down된 적이 있는지를 봐야한다.

=> ui에 기능 추가 해주도록 하자.

ui에서 친구 선언해주고 tap일경우 true설정해주자.

=> 언제 false설정하나?


UI버튼 위에서 TAP했다 => true됬다. => 언제 다시 false체크?

UI범위 밖에있든 안에 있든 lbtnUp일 경우 다시 false로 되돌려야한다.

42번째 줄 처럼 awayLbtn이 발생을 했다면 무조건 들어와서 false로 변경을 할 것인데

지금 MouseOn일 경우만 체크를 하기 때문에 문제가 된다.

MouseOn이 아닐 경우도 AWAY인지 봐야하는데 말이다.

void UIManager::update()
{
	CScene* curScene = CSceneManager::GetInstance()->GetCurScene();
	// 여기에는 모든 부모 UI가 들어있다.
	const vector<CObject*> vecUI = curScene->GetGroupObjects(GROUP_TYPE::UI);

	bool tapLbtn = KEY_TAP(KEY::LBTN);
	bool awayLbtn = KEY_AWAY(KEY::LBTN);

	for (size_t i = 0; i < vecUI.size(); ++i)
	{
		UI* ui = dynamic_cast<UI*>(vecUI[i]);
		
		// 마우스 UI에 있는지 체크
		if (ui->IsMouseOn())
		{
			// UI위에있다고 얼려준다.
			ui->MouseOn();

			// 경우는 두가지로 나뉨.
			if (tapLbtn)
			{
				ui->MouseLbtnDown();
				ui->_lbtnDown = true;
			}
			else if (awayLbtn)
			{
				ui->MouseLbtnUp();

				// 클릭할 경우
				if (ui->_lbtnDown)
				{
					ui->MouseLbtnClick();
				}

				ui->_lbtnDown = false;
			}
		}
		else
		{
			// 마우스 위에 있지 않을 경우
			// 왼쪽버튼 때면, 눌렸던 체크를 다시 해제한다.
			if (awayLbtn)
			{
				ui->_lbtnDown = false;
			}
		}
	}
}

이정도로 구현을 해두도록 하자...

이정도의 설계는 할 줄 알야아한다...

그런데 문제는 이 UI는 부모의 UI라는 것이다.

=> 자식 UI들에 대해서는 이벤트 호출이 불가능하다.

지금 적용받은 구조를 자식 UI들도 이벤트들을 받을 수 있게 구조를 설계해야한다.

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

0개의 댓글