*** 공부 방법 ***
1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처
hyrule.tistory.com
* WIN32API로 고전 도트 게임을 만들어볼 사람들에게만 해당되는 글임
- 요즘 나오는 도트 게임들은 일반적으로 아예 도트 하나가 여러 픽셀로 확대된 이미지를 사용하지만,
- 고전 도트게임은 아래처럼 아예 한 도트가 한 픽셀인 작은 이미지를 확대하여 쓰는 경우가 많았다.
- 그렇기에 고전 도트게임을 WIN32API에서 출력하려면 애로사항이 있다.
-- 아예 Scale 개념을 도입해서 TransparentBlt 또는 StretctBlt를 사용해 배율 단위로 확대시켜 그리던가,
이미지 파일을 아예 배율만큼 확대해서 쓰던가 해야 하는데
이렇게 될 경우 좌표 개념이 애매해진다.
-- 특히 메탈슬러그의 경우
스프라이트에 상체와 하체가 이렇게 분리되어 출력되는데, 마찬가지로 이런 좌표 계산이 애매해지기에 더욱 그러하다.
- 그래서 아예 원래 픽셀 도트 단위의 이미지를 사용하면서, 화면을 확대시켜서 보는 것이 여러 모로 편리하다고 생각된다.
- 필요한 함수는 다음과 같다.
SetMapMode(m_hDC, MM_ANISOTROPIC);
- 좌표 매핑 모드를 변경한다.
- 기존의 좌표계는 한 픽셀 당 좌표값 1인 '물리적인' 시스템을 가지고 있었다.
- 이를 논리적인 좌표 시스템을 사용하겠다고 선언한다.
SetWindowExtEx(m_hDC,
100, 100, NULL);
- 현재 윈도우 좌표를, 픽셀이 어떻게 되던간에 100분할해서 보겠다는 의미이다.
- 윈도우의 좌상단 좌표를 0, 0이라고 본다면, 윈도우의 우하단 좌표는 100, 100이 된다.
SetViewportExtEx(m_hDC, 200, 200, NULL);
- 뷰포트, 그러니까 보여질 영역의 좌표값을 설정한다. 보여질 곳을 창의 200 * 200 픽셀 영역으로 하겠다는 의미이다.
- SetWindowExtEx와, SetViewPortExtEx 함수가 함쳐지면,
보여질 부분인 200 * 200 픽셀 영역을 100 * 100으로 보겠다는 뜻이 된다.
좌표값 1당 2픽셀이 되는 것이다. 1 * 1 도트를 찍으면, 2 * 2 영역에 그려지게 된다.
- 메탈슬러그의 픽셀 수는 304 * 224이다.
- 메탈슬러그의 리소스를 그대로 사용하고, 해상도를 그대로 사용하면서 확대만 해보자.
- FHD가 1920 * 1080이므로 가로세로 각각 4배인 1216 * 896 정도가 적합할 것 같다.
GameInfo.h
- 이 기본 해상도는 여러 곳에서 고정적으로 사용될 것이므로
#define을 통해 값을 지정해 놓는다.
class CGameManager
- 인게임 좌표는 모두 304 * 224 영역 안에서 처리될 예정이다. 다만, 실제 출력되는 창의 사이즈만 4배 사이즈로 해주면 된다.
m_Resolution.Width = ORIGINAL_GAME_RES_WIDTH * 4;
m_Resolution.Height = ORIGINAL_GAME_RES_HEIGHT * 4;
- 주버퍼(m_hDC)에 대해 위의 확대 함수를 하여 영역을 확대한다.
//주버퍼 배율 확대
//배율 자율 조정 모드로 변경
SetMapMode(m_hDC, MM_ANISOTROPIC);
//원래 해상도를
SetWindowExtEx(m_hDC,
ORIGINAL_GAME_RES_WIDTH, ORIGINAL_GAME_RES_HEIGHT, NULL);
//확대된 해상도로 적용
SetViewportExtEx(m_hDC, m_Resolution.Width, m_Resolution.Height, NULL);
- 출력영역을 제외한 모든 사이즈는 기본 사이즈(304 * 224)로 설정하여 만든다.
백버퍼도 마찬가지이다.
//백버퍼 초기화 - 원래 해상도 사이즈로 초기화해준다.
m_BackhDC = CreateCompatibleDC(m_hDC);
m_BackhBmp = CreateCompatibleBitmap(m_hDC, ORIGINAL_GAME_RES_WIDTH, ORIGINAL_GAME_RES_HEIGHT);
m_BackhBmpPrev = (HBITMAP)SelectObject(m_BackhDC, m_BackhBmp);
class CInput
- 인풋영역에서 고쳐야 할 것은 마우스이다.
- 기존 좌표를 그대로 받아오면, 마우스가 실제 한 픽셀 움직일 때 게임에서는 4픽셀이 움직이게 되기 때문이다.
//마우스 위치 업데이트
POINT PTMouse;
GetCursorPos(&PTMouse);
ScreenToClient(m_hWnd, &PTMouse);
//화면을 4배 확대했으므로
//좌표값을 4배 줄여줘야 실제 마우스 위치와 일치하게 움직임.
PTMouse.x /= 4;
PTMouse.y /= 4;
class CCamera
- 메탈슬러그의 경우 카메라의 해상도가 변할 일은 없으므로 생성자에서 아예 고정시켜 준다.
CCamera::CCamera():
m_Target(nullptr)
{
Resolution Res = CGameManager::GetInst()->GetResolution();
m_Resolution.x = (float)ORIGINAL_GAME_RES_WIDTH;
m_Resolution.y = (float)ORIGINAL_GAME_RES_HEIGHT;
m_WorldResolution = m_Resolution;
}
- 이외에도 기존에 사용하던 1280 * 720 해상도에서 거의 1/4 수준으로 줄어들었기 떄문에 캐릭터의 좌표나 사이즈들을 어느정도 수정해 주어야 한다.
실제 메탈슬러그와 어느정도 비슷한 느낌으로 확대되었다.
'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글
69. 타일맵 에디터1: 제작 및 타일맵 불러오기 (0) | 2022.06.12 |
---|---|
68. 타일 맵 (0) | 2022.06.10 |
66. 오브젝트 컬링 (0) | 2022.06.09 |
65. 간단한 점프 물리 법칙 (0) | 2022.06.09 |
64. 텍스트 출력 (0) | 2022.06.09 |