본문 바로가기

WinAPI

(16)
[Winapi] 게임 프레임워크 - 1. Core https://youtu.be/lBawfsBIT7s 나는 지난 2주간 어소트락 winapi 강좌를 보면서 프레임워크 만드는 것을 진행했다. 강좌의 진도가 빠르고 코드의 양이 워낙 많은 탓에 프레임워크 만드는 것을 따라했다고 봐도 무방할 것 같다. 그래서 강좌를 모두 시청한 지금 시점에서 다시 코드를 복습하고 배운 것들을 정리하려고 한다. #include #include "Core.h" int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { if (!CCore::GetInst()->Init(hInstance)) { CCore::Destro..
[WinAPI] Pivot POSITION tPos = m_tPos - m_tSize * m_tPivot; BitBlt(hDC, m_tPos.x, m_tPos.y, m_tSize.x, m_tSize.y, m_pTexture->GetDC(), 0, 0, SRCCOPY); Pivot을 통해 이미지의 어떤 부분을 기준으로 출력할 지 정할 수 있다. 기본 위치 정보 m_tPos에서 m_tSize 와 m_tPivot을 곱한만큼 뺀다. Pivot의 x를 0.5f y를 1f로 설정했을 때 아래와 같이 그려진다. 파란색 점이 m_tPos이다. 그냥 m_tPos기준으로 이미지를 출력하면 이미지의 왼쪽 위 끝 부분을 기준으로 출력한다. 그런데 m_tSize * m_tPivot만큼 빼주면 중앙 아래 쪽이 m_tPos자리에 위치하게 된다. 그러면 이제..
[WinAPI] 더블 버퍼링 WinAPI 실습을 할 때 화면이 깜빡거리고 플레이어가 이동할 때마다 잔상이 남고 총알이 이동할 때 역시 잔상이 남았다. 이것을 해결하기 위해서는 더블 버퍼링을 사용해야 한다. 더블 버퍼링을 잘 표현한 그림이다. 사용자에게 보여주는 버퍼와 뒤에서 출력할 내용을 그리는 버퍼로 나누어진다. (출처 : http://cafe.naver.com/buildgame.cafe) void CCore::Render(float fDeltaTime) { //백버퍼 얻어오기 CTexture* pBackBuffer = GET_SINGLE(CResourcesManager)->GetBackBuffer(); //흰 사각형 그려 화면을 지움(초기화) Rectangle(pBackBuffer->GetDC(), 0, 0, 1280, 720)..
[WinAPI] 삼각함수 if (GetAsyncKeyState('W') & 0x8000) { g_tPlayer.x += fSpeed * cosf(g_fPlayerAngle); g_tPlayer.y += fSpeed * sinf(g_fPlayerAngle); } if (GetAsyncKeyState('S') & 0x8000) { g_tPlayer.x -= fSpeed * cosf(g_fPlayerAngle); g_tPlayer.y -= fSpeed * sinf(g_fPlayerAngle); } if (GetAsyncKeyState('A') & 0x8000) { g_fPlayerAngle -= PI * g_fDeltaTime * fTimeScale; } if (GetAsyncKeyState('D') & 0x8000) { g_fPla..
[WinAPI] 델타 타임 지난번에 PeekMessage함수를 이용할 때 else 블럭에 카운트를 만들어 일정 카운터가 달성될 때 마다 한번씩 Run함수가 실행되게 만들었다. 왜냐하면 실제로 메시지루프가 엄청 빠르게 반복하기 때문에 사각형이 보이지도 않을 정도로 빠르게 움직이기 때문이다. 그런데 그렇게 하지 않고 델타 타임을 이용해서 사각형의 속도를 조절할 수 있다. QueryPerformanceFrequency(&g_tSecond); QueryPerformanceCounter(&g_tTime); 메인 함수의 메시지 루프 전에 위 코드를 작성한다. Performance Counter은 현재 CPU의 클럭수를 반환하고 Frequency는 주파수(초당 진동수)를 나타낸다. 주파수는 전역으로 선언한 float형 변수 g_tSecond에..
[WinAPI] PeekMessage와 윈도우 창 크기 설정 // 기본 메시지 루프입니다: while (g_bLoop) { //PeekMessage는 메세지가 메세지 큐에 없어도 바로 빠져나온다. //메세지가 있을 경우 true 없을 경우 false가 된다. //메세지가 없는 시간이 윈도우의 데드 타임이다. if(PeekMessage(&msg, nullptr, 0, 0,PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } //윈도우 데드타임일 경우 else { static int iCount; ++iCount; if (iCount == 30000) { iCount = 0; Run(); } } } Pe..
[WinAPI] 도형 그리기, 마우스 좌표 case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); //출력하기 위한 도구 //텍스트 출력 (x좌표,y좌표,텍스트,크기) TextOut(hdc, 50, 50, TEXT("win32"), 5); //사각형 출력 (왼쪽위좌표,오른쪽아래좌표) Rectangle(hdc, 100, 100, 200, 200); //원 출력 (왼쪽위좌표,오른쪽아래좌표) Ellipse(hdc, 100, 100, 200, 200); //선 그리기 MoveToEx(hdc, 300, 100, NULL); //시작좌표 LineTo(hdc, 400, 150); //끝좌표 MoveToEx(hdc, 100, 400, NULL);//다른 선을 그릴 때마다 시작좌표 새로 설정해야 함 ..
[WinAPI] 기본 윈도우 창 HINSTANCE hInst; // 현재 인스턴스입니다. WCHAR szTitle[MAX_LOADSTRING]; // 제목 표시줄 텍스트입니다. WCHAR szWindowClass[MAX_LOADSTRING]; // 기본 창 클래스 이름입니다. hInst는 윈도우의 인스턴스 핸들을 나타내는데 이것은 운영체제가 프로그램을 식별하기 위한 번호이다. 만약 윈도우에 메모장 2개가 켜져있다면 두 메모장을 인스턴스 핸들로 구분할 수 있다. //main함수 역할 int APIENTRY wWinMain(_In_ HINSTANCE hInstance, //h가 붙으면 핸들, 운영체제가 프로그램을 구별하기 위한 식별번호 _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _..