[ 다이얼로그 창 ]
- 프레임 편집, 이동 가능 여부를 설정할 수 있는 기능을 구현한다.
- 다이얼로그에서 값을 지정하고 클라이언트 영역에서 드래그하면 일괄적으로 값이 설정되도록 하는것이다.
- 콤보박스(드롭다운 메뉴)를 두개 만들어준다.
-- ID를 IDC_COMBO_BRUSH_TYPE, IDC_COMBO_OPTION으로 설정하고, 정렬은 false로 해준다.
--- 왼쪽의 드롭다운 메뉴에서는 타일을 칠할 것인지/이동 가능 여부를 바꿀것인지 브러쉬를 설정하고,
오른쪽의 드롭다운 메뉴에서는 왼쪽에서 지정한 브러쉬에서 어떤 옵션으로 칠할 것인지를 설정한다.
ex) 타일 색칠 -> 스프라이트의 2번째 이미지를 드래그해서 칠하거나
이동 가능 여부 -> 드래그하는 지점의 타일을 이동 불가 타일로 지정하는 등의 작업이 가능.
class CSceneEditDlg
< Init() >
{ HWND m_hBrushTypeCombo; }
{ HWND m_hOptionCombo; }
- 이 두 콤보박스에 대한 주소를 변수로 선언하고 얻어놓는다.
SendMessage(m_hBrushTypeCombo, CB_ADDSTRING, 0, (LPARAM)TEXT("Frame"));
SendMessage(m_hBrushTypeCombo, CB_ADDSTRING, 0, (LPARAM)TEXT("Option"));
SendMessage(m_hOptionCombo, CB_ADDSTRING, 0, (LPARAM)TEXT("Normal"));
SendMessage(m_hOptionCombo, CB_ADDSTRING, 0, (LPARAM)TEXT("ImpossibleToMove"));
- SendMessage를 통해 드롭다운 메뉴를 추가한다.
--cf) 리스트 박스는 LB_ADDSTRING이고 콤보박스는 CB_ADDSTRING이다.
SendMessage(m_hBrushTypeCombo, CB_SETCURSEL, 0, 0);
SendMessage(m_hOptionCombo, CB_SETCURSEL, 0, 0);
- SendMessage로 각 드롭다운 메뉴의 기본 선택값을 빈 칸으로 설정한다.
< SelectBrushType() >
< SelectOption() >
- 콤보박스에서 선택 항목이 달라졌을 때 호출할 함수를 선언한다.
< WndProc() >
- 콤보박스의 메시지를 받는 것도 대략적으로는 비슷하다.
case IDC_LIST_TEXTURE:
switch (HIWORD(wParam))
{
case LBN_SELCHANGE:
g_Dlg->SelectTexture();
break;
}
다만, 위에서처럼 LBN_SELCHANGE가 아니라, CBN_SELCHANGE이다.
{ enum class ETileBrush }: Frame과 Option으로 구분되어 있는 열거체
{ ETileBrush m_BrushType }: 생성자에서 기본 Frame으로 초기화
{ ETileOption m_SelectOption }: GameInfo에서 만들었던 열거체인 ETileOption 타입 변수 (이동 가능여부). 생성자에서 기본 Normal로 초기화
< SelectBrushType() > 이 호출되면, m_BrushType을 바꿔 준다.
SendMessage를 이용해서 현재 콤보박스에 선택되어있는 인덱스 번호를 가져와서 형변환해서 들고있게 한다.
< SelectOption() > 이 호출되면, 위와 마찬가지 방법으로 m_SelectOption을 바꿔 준다.
- 위 두 메소드의 Get함수를 만들어서 밖에서도 정보를 받아갈 수 있도록 해준다.
< const AnimationFrameData* GetTileFrameData() const >
- 다이얼로그에서 선택한 텍스처의 n번째 프레임에 대한 좌표 정보를 반환해 주는 메소드.
- 일단, 둘다 선택된 상태여야 하므로, 리스트 인덱스 저장 변수가 -1이면 안된다.
- 둘다 -1이 아니면, m_vecTextureFrame에서 값의 '주소'를 찾아서 반환해준다.
class CEditScene
- 이제 위의 콤보박스 메뉴를 선택해 드래그를 통해 타일맵을 수정하는 시스템을 만들어야 한다.
- 가장 먼저 마우스 좌클릭 Push 상태 입력 바인딩을 추가해준다.
< void MouseLButtonDrag() >
- 우선 타일맵이 있는지 없는지부터 확인한다(예외 처리)
- 마우스가 클라이언트 영역 안에 있는지 확인한다.
- CTileMapDlg로부터 GetBrushType() 메소드를 통해 현재 브러쉬 타입을 받아오고,
- switch문으로 브러쉬 타입에 따른 아래의 두 메소드 중 하나를 호출한다.
< void ChangeFrame() >
- CInput으로부터 마우스의 월드 좌표를 받아온다.
- 그리고 다이얼로그에서 입력한 값을 방금 만든 GetTileFrameData() 메소드를 통해 받아온다.
-- 프레임 좌표가 제대로 들어왔는지 확인한다(잘못 들어왔다면 nullptr로 들어왔을 것임)
- CTileMap 클래스를 만들 때, 들어온 좌표에 있는 타일의 프레임 정보를 설정해주는 메소드를 만들었었다.
-- SetTileFrame() 메소드를 사용하면 된다.
< void ChangeOption() >
- CInput으로부터 마우스의 월드 좌표를 받아온다.
- 그리고 다이얼로그에서 선택한 이동 가능 여부 옵션을 GetSelectOption() 메소드를 통해 받아온다.
- 이것도 역시 지난번 CTileMap을 구현할 때 기능을 만들었었다.
-- ChangeTileOption() 메소드를 사용한다.
- 코드가 다 완성되었으면 타일맵을 마우스를 통해 수정 가능해진다.
'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글
75. 타일맵 에디터 6: 빈 타일, 배경화면 설정 (0) | 2022.06.14 |
---|---|
74. 타일맵 에디터 5: Save & Load (0) | 2022.06.14 |
72. 타일맵 에디터 3: 스프라이트 텍스처의 프레임 좌표 지정 (0) | 2022.06.14 |
71. 타일맵 에디터2: 타일에 텍스처 지정 (0) | 2022.06.13 |
70. Font 관련 수정 (0) | 2022.06.13 |