class CSceneEdit
- 지난번 코드에 메모리 누수가 발생하는 문제가 있어 수정하였다.
- _CrtSetBreakAlloc() 함수를 통해 확인해 보니, 다이얼로그 클래스를 생성할 때 문제가 발생하는 것을 확인.
-- 원인은 다이얼로그 창을 여러번 닫았다 열었다 할 때, 기존 다이얼로그 창 클래스가 제거되지 않아 발생했다.
-- 다이얼로그를 관리하는 클래스인 CSceneEdit에서 창이 종료될 때 제거해주어야 한다.
< void DeleteDlg() >
- 다이얼로그 클래스에서 접근할 수 있도록 DeleteDlg 메소드를 만들어 준다.
- 다이얼로그 클래스의 주소를 들고 있는 m_TileMapDlg를 제거하고, nullptr로 만들어준다.
class CSceneEditDlg
< ChangeVisibleStatus() >, { bool m_Hide }
- 다이얼로그 창이 닫히면 여태까지 로딩되어있던 모든 정보가 날아가서 꼬일 우려가 있다.
- 창의 X버튼을 누르던(WM_CLOSE), 직접 만든 창의 Quit 버튼을 누르던 뭘 하던 간에 윈도우를 Destroy하지 않고, 단순히 창을 숨기기만 한다.
-> 다시 Ctrl + T 버튼을 누르면 다이얼로그 클래스가 생성되어있는지 확인하고, 생성되어있다면 이 메소드를 호출해 숨겨져있던 다이얼로그를 다시 표시해주어 로드된 내용을 계속 유지해준다.
< WinProc() >
- 창을 닫을 때 (WM_DESTROY) 자신의 관리자 클래스에 접근하여 자신을 제거한다.(DeleteDlg())
- 코드를 수정하고 나서, 더이상 메모리 누수가 발생하지 않았다. (71번 글의 파일도 교체하였음)
class CTile
- 이동 가능 타일과 이동 불가능 타일을 추가한다.
- 일단 에디트 모드일 경우에 시각적으로 이동 가능 / 불가능 여부를 알 수 있도록 하기 위해서,
< Render() > 메소드에서 FrameRect를 통해 사각형을 그려 준다.
현재 타일에 지정된 ETileOption에 따라서 색을 바꿔 준다.
-- 지나갈수 있는 타일 = 초록, 지나갈 수 없는 타일 = 빨강
[ 다이얼로그 창 ]
- 다이얼로그 창에서 프레임 정보를 설정할 수 있도록 몇 가지 오브젝트를 추가한다.
- IDC_LIST_TEXTURE_FRAME, IDC_BUTTON_ADD_FRAME
- IDC_EDIT_FRAME_STARTFRAME_X, DC_EDIT_FRAME_STARTFRAME_Y
- IDC_EDIT_FRAME_ENDFRAME_X, DC_EDIT_FRAME_ENDFRAME_Y
class CSceneEditDlg
< WinProc() >
- 위의 버튼이 눌리면, < AddFrame() > 메소드를 호출한다.
- 리스트의 선택이 변경되면 < SelectFrame() > 메소드를 호출한다.
{ std::vector<std::vector<AnimationFrameData>> m_vecTextureFrame }
- 한 텍스처 이미지에 대한 프레임 데이터를 저장한다.
- 텍스처 이미지도 여러장을 로드할 수 있고, 한 텍스처 이미지에 여러 장의 타일 이미지들이 들어 있을수도 있으므로(sprite) 이중 배열 형태로 선언한다.
< LoadTexture() >
- 텍스처를 로드했을 떄, 이 텍스처에 대한 프레임 정보가 들어있는 배열을 하나 만들어서
m_vecTextureFrame에 추가해 준다.
- 리스트에도 추가된 순서대로 나열되고, 리스트의 인덱스 번호도 위부터 순서대로 나오기 때문에 리스트 인덱스 번호를 배열의 인덱스 번호에 그대로 가져다 쓸 수 있다.
* 마지막 부분에 m_SelectTextureIndex를 -1로 바꿔주는 처리를 m_SelectTextureFrameIndex를 -1바꿔주도록 변경한다.
< AddFrame() >
- 가장 먼저, 텍스처가 있는지 없는지 확인하고, 없으면 바로 return한다(예외 처리)
- 현재 다이얼로그에 입력된 프레임 값을 GetDlgItemInt를 이용해 얻어온다.
- { AnimationFrameData Data } 구조체 지역 변수를 선언한다.
- TCHAR ListData 문자 배열을 선언하고, 여기에 sprintf를 이용하여 현재 선택된 텍스처 인덱스의 프레임데이터 배열의 사이즈를 저장해놓는다.(저장된 인덱스 번호를 리스트에 띄워주기 위함)
- 받아놓은 ListData를
< SendMessage(m_hTextureFrameListbox, LB_ADDSTRING, 0, (LPARAM)ListData) >함수로 전달한다.
- 리스트에 추가되었으면, 받아온 데이터 구조체를 m_SelectTextureIndex의 맨 뒤에 삽입한다.
< SelectFrame() >
- 텍스처 추가 리스트와 동일하게, 리스트에서 선택 변경이 감지되면 리스트의 인덱스를 받아온다.
{ int m_SelectTextureFrameIndex } 변수를 추가해주고, 생성자에서 -1로 초기화한다.
- 만약 인덱스를 받아와서 -1이 아니라면,
-- m_vecTextureFrame[로드된 텍스처 리스트 인덱스 번호][해당 텍스처의 프레임 인덱스] 값에 저장되어 있는 값을
SetDlgItemInt() 함수를 통해 얻어와서 다이얼로그의 입력 란에 표시해 준다.
- 여기까지 코드 작성 후 문제없이 잘 작동하는지 확인
'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글
74. 타일맵 에디터 5: Save & Load (0) | 2022.06.14 |
---|---|
73. 타일맵 에디터 4: 기타 기능 추가. (0) | 2022.06.14 |
71. 타일맵 에디터2: 타일에 텍스처 지정 (0) | 2022.06.13 |
70. Font 관련 수정 (0) | 2022.06.13 |
69. 타일맵 에디터1: 제작 및 타일맵 불러오기 (0) | 2022.06.12 |