*** 공부 방법 ***
1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처
hyrule.tistory.com
[ 사전 지식 ]
DestroyWindow(HWND)
- WM_DESTROY 메시지를 발생시킨다 -> WIN32API 창을 종료시킨다.
class CInput
{ bool MouseLDown, MouseLPush, MouseLUp }
< 세 함수 모두에 대한 Get 메소드 >
- 이제 버튼에 대한 마우스 클릭을 처리해주어야 하므로 해당 변수들을 추가한다. 생성자에서 false로 초기화한다.
< void UpdateMouse >
- GetAsyncKeyState(VK_LBUTTON & 0x8000) 함수를 통해서 Down, Push, Up상태를 구별해준다.
-- 키 입력 구현과 똑같음.
class CButton
< 마우스 충돌 시작/종료 콜백함수 >
- ButtonState를 여기서 바꿔주던 것은 제거한다. Update() 메소드에서 처리해줄 것이다.
- 소리만 여기서 재생한다.
충돌이 시작됐을 때 / 충돌이 종료됐을 때 재생되는 사운드가 등록됐다면, 해당 사운드를 재생하는 코드를 추가해준다.
마찬가지로 충돌 시작/종료 시 호출할 콜백이 등록되었다면 해당 함수도 호출해준다.
< Update() >
- m_ButtonState가 Disabled가 아닐 경우에만 처리한다.
- 마우스가 버튼 위에 있을 때, 위에서 만든 마우스 상태를 받아와서, 좌클릭을 했다면 m_ButtonState를 Click으로 변경해준다.
CF) 대부분 버튼은 마우스를 클릭한 이후 뗐을 때 동작한다.
- 클릭 상태였는데 마우스 버튼이 다시 올라갔으면, 그 때 콜백함수를 동작시킨다.
-- 클릭 콜백함수가 등록되어 있을 경우에만 동작시킨다.
-- 콜백함수를 실행시키고 나면, 버튼을 도로 Hovered상태로 돌려놓는다.
- 계속 Push 상태가 유지되고 있으면, ButtonState를 계속 Click 상태로 유지시킨다.
class CGameManager
< void Exit() >
- DestroyWindow() 함수를 호출해서 창을 종료한다.
class CStartWindow
- 이제 만든 버튼을 통해 게임 종료 버튼을 만들어보자.
< ExitButtonCallback() >
- 위의 Exit() 메소드를 호출한다.
< Init() >
- 위 콜백함수를 CButton::SetCallback() 메소드로 등록한다.
- 정상 작동 된다면 이제 버튼을 눌렀을때 게임이 종료될 것이다.
< StartButtonCallback() >
- 버튼을 하나 더 만들고, 콜백함수를 지정하여 씬을 전환하는 기능도 만들어보자.
class CInput
< ClearCallback() >
- 키조합에 등록된 콜백 함수를 모조리 제거하는 메소드.
-- m_mapBindKey 배열에 등록된 BindKey 구조체를 모조리 순회하면서 vecFunction에 nullptr을 대입.
- 사실 지난번에 비슷한 기능을 하는 메소드를 만들긴 했었는데, 추가로 씬이 전환될 때 콜백 함수 포인터를 싹 밀어버리는 기능도 만들어 놓자.
https://hyrule.tistory.com/140
26. Input 기능 개선 - 입력 바인딩 제거하기
http://hyrule.tistory.com/111 *** 공부 방법 *** 1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선..
hyrule.tistory.com
class CSceneManager
{ class CScene* m_NextScene }
- 씬의 로딩 과정은, 새 씬 로드 -> 기존 씬 제거 순서로 진행되어야 한다.
-- 이렇게 돼야 기존 씬과 새 씬에서 공통적으로 사용되는 게임오브젝트들은 그대로 가져다 쓰고, 쓰지 않는 게임오브젝트만 일괄적으로 제거할 수 있게 되기 때문이다. (참조 카운트 덕분에 해당 과정은 자동으로 진행된다)
- 그러므로 로딩 과정 중에는 두 개의 씬을 들고 있다가, 다음 씬이 로딩 되면 기존 씬을 삭제하고 새 씬 포인터를 여기에 등록하는 과정으로 해야 한다.
- 생성자에서 nullptr로 초기화해준다.
< CreateScene() >
- 기존 생성 코드에서, 만약 m_Scene에 씬이 등록되어 있다면, m_NextScene에 생성해서 등록하는 과정을 추가한다.
< bool ChangeScene() >
- m_NextSene이 있으면, m_Scene에서 기존 씬을 제거한 후, 새 씬을 등록하고 true를 반환한다.
-- 당연히 m_NextScene은 다시 nullptr로 바꿔 주어야 한다.
< bool Update() >
- return ChangeScene()으로 바꿔주어 매 Update 과정마다 씬을 변경하려고 하는지 체크할 수 있게 바꿔준다.
< bool PostUpdate() >
- 이것도 bool 타입을 반환하도록 바꿔주고, ChangeScene()을 호출하면서 return한다.
class CGameManager
< bool Update(), PostUpdate() >
- 둘다 bool 타입으로 바꿔주고, CSceneManager의 Update()/PostUpdate() 메소드를 호출하며 return한다.
< void Logic() >
- 여기서 만약 Update()나 PostUpdate() 메소드를 true로 리턴받으면, 이후 과정은 생략한다.(return)
- 코드 작성을 완료했으면 CStartWindow에서 콜백 함수를 만들어서
버튼을 클릭 시 CreateScene<>() 메소드를 호출되게 만들어보자.
직접 해보기) 이미지를 표시하는 단순한 기능을 가진 위젯을 만들어보자.
--> 개별 위젯 출력도 ZOrder순으로 출력해야 된다는 사실을 알면 금방 만들 수 있다.
'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글
60. 프로그레스 바 (0) | 2022.06.07 |
---|---|
59. 마우스에 애니메이션 띄우기 (0) | 2022.06.07 |
57. 위젯의 마우스 충돌 (0) | 2022.06.07 |
56. 위젯 (0) | 2022.06.06 |
55. 사운드 (0) | 2022.06.03 |