hyrule 2022. 6. 7. 01:54

http://hyrule.tistory.com/111 

 

*** 공부 방법 ***

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<>() 메소드를 호출되게 만들어보자.

잘 작동된다면 이런 방식으로 동작되어야 한다.

 

GameFrameworkStepbyStep_58_ButtonClick.zip
3.39MB

 

직접 해보기) 이미지를 표시하는 단순한 기능을 가진 위젯을 만들어보자.

--> 개별 위젯 출력도 ZOrder순으로 출력해야 된다는 사실을 알면 금방 만들 수 있다.