우리는 최종적으로 배경을 출력하고
플레이어 캐릭터를 출력하고
에너미 하나를 출력할 것이다.
이것에 대한 소스들이 모두 한 곳에 있다면
매우 관리하기가 힘들것이다.
그렇기 때문에 배경은 배경대로,
플레이어는 플레이어대로
에너미는 에너미대로 나누어서 관리할 것이다.
첫 번째 할 일은 전처리의 #include를 헤더 파일 하나를 만들어서 모조리 집어넣어주는 일이다.
이렇게 해 주었으면
메인에는 헤더파일 하나만 포함시켜주면 전처리쪽 코드는 깔끔하게 정리 할 수 있다.
그리고 두 번째 할 일은
클래스를 하나 만들것인데,
이 클래스에서는 배경이나 캐릭터의 데이터를 넘겨받아 그려주는 역할을 메인에서가 아닌 다른 cpp파일에서
대신 하게 할 것이다.
헤더파일을 하나 만들어준다.
헤더명은 Object로 클래스명과 동일하게 작성해 주었다.
멤버 변수로는 3가지를 뒀는데,
앞서 메인cpp에서 선언했던 변수와 크게 다를것이 없다.
그 이유는 메인에서 해줄 일을 다른 cpp파일에서 할 것이기 때문에
지금 만들 클래스에 멤버 변수로 선언한 것이다.
protected로 선언한 이유는 뒤에 만들
- 배경
- 플레이어
- 에너미
클래스를 각각 만들어야 하는데,
그 클래스에 Object를 상속받아 사용하기 위함이다.
public:에 선언된 멤버함수를 살펴보도록 하자.
virtual void Init( HDC _m_hBackBuffer, HDC _m_hMemDC, HBITMAP _m_hResource );
는 선언한 멤버변수의 초기화를 위해 만든 것이다.
virtual void Render() =0;는 비트맵을 그려줄 함수인데 Object에서는 사용하지 않고
다른 클래스에서 상속받아 사용할 것이기 때문에 =0을 붙여 순수가상함수로 만들어 주었다.
virtual void Updeate( double dt )=0;
업데이트 함수도 마찬가지다.
이 함수는 플레이어, 에너미에서 사용할 것으로 지금은 사용하지 않는다.
업데이트 함수의 매개변수로 (double dt) 라 되어있는데 지금은 사용하지 않으므로 비워두기로 한다.
이렇게 Object헤더를 만들었으면, cpp파일도 만들어 작성해 주도록하자.
이 클래스에서 구현할 함수는 Init밖에 없으므로 cpp파일에 Init에 대한 함수를 구현 하도록 한다.
매개변수로 3가지를 넘겨 줄 것이기 때문에 클래스 안에 있는 멤버 변수들을
매개변수로 받아올 것들로 초기화 시켜준다.
이렇게 기본 준비는 완료 되었다.
다음 API에서는 배경 클래스를 하나 만들고 매개변수로 받아와
배경을 출력해 보도록 하겠다.
'API > 이론' 카테고리의 다른 글
캐릭터 출력하기. (0) | 2016.04.28 |
---|---|
배경을 클래스화 해서 출력하기. (0) | 2016.04.27 |
배경화면 출력하기. (0) | 2016.04.26 |
더블 버퍼링 (0) | 2016.04.25 |
wParam, lParam (0) | 2016.04.15 |
더블 버퍼링의 처리가 끝났으면
배경 이미지를 불러와 윈도우에 그려보도록 하겠다.
이미지는 상대경로로 지정하기 위해 프로젝트 폴더 안에 소스파일을 넣도록 하겠다.
이렇게 준비가 끝났으면 시작하도록 하겠다.
우선 첫 번째 할일로는 리소스를 불러오도록 하겠다.
여기까지 준비가 되었으면
코드로 작성으로 넘어가겠다.
※주의사항
프로젝트 폴더명이 바뀌거나 프로젝트 폴더의 경로가 바뀌면
리소스를 불러온 상대경로가 바뀌므로 오류가 일어나게된다.
1
2
3
4
5
6
7
8 |
#include <windows.h>
#include <tchar.h>
HDC g_hBackBuffer;
HDC g_hMemDC;
HBITMAP g_hBackBitmap;
HBITMAP g_hBGA; |
cs |
배경을 불러오기 위한 비트맵DC를 전역변수로 하나 선언해 주겠다.
변수명은 g_hBGA다.
WM_CREATE가 호출됬을 때 비트맵을 불러오기로 하자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
case WM_CREATE:
{
HDC hDC = GetDC(hWnd);
g_hBackBuffer = CreateCompatibleDC( hDC );
g_hBackBitmap = CreateCompatibleBitmap( hDC, 1440,600 );
SelectObject( g_hBackBuffer, g_hBackBitmap );
g_hMemDC = CreateCompatibleDC( hDC );
ReleaseDC(hWnd, hDC);
HINSTANCE ins = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
g_hBGA = LoadBitmap(ins, MAKEINTRESOURCE(IDB_BITMAP1));
SelectObject( g_hMemDC, g_hBGA );
BitBlt(g_hBackBuffer,0,0,1440,600,g_hMemDC,0,0,SRCCOPY);
break;
} |
cs |
코드를 하나씩 분석 하도록 하자.
HINSTANCE ins = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
부모 윈도우의 인스턴스핸들을 가져오는 함수다.
인스턴스핸들을 가져오는 이유는 부모의 윈도우의 비트맵을 그려줘야 하기 때문에
부모 윈도우에 대한 프로그램 번호를 가져오는 것이다.
g_hBGA = LoadBitmap(ins, MAKEINTRESOURCE(IDB_BITMAP1));
배경을 불러오기 위해서 전역변수로 선언해뒀던 비트맵 변수에 LoadBitmap함수를 사용하여
비트맵을 불러왔다.
첫 번째 인자는 불러올 윈도우를 넣어주고, 두 번째 인자는 비트맵의 이름을 넣어준다.
비트맵의 이름은 파일의 이름이 아니라 불러온 이미지의 순서대로 IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3...
식으로 이름이 자동으로 붙는다.
SelectObject( g_hMemDC, g_hBGA );
담겨진 비트맵을 g_hMemDC에 받아서
BitBlt(g_hBackBuffer,0,0,1440,600,g_hMemDC,0,0,SRCCOPY);
를 사용해 g_hMemDC에 담긴 그림을 g_hBackBuffer버퍼에 복사시켜준다.
그리고 실행시켜주면
에러가 나게 된다.
왜냐하면 비트맵 IDB_BITMAP1을 찾을수가 없기 때문인데.
이는 리소스 헤더 파일을 포함시켜주지 않았기 때문인데.
1
2
3 |
#include <windows.h>
#include <tchar.h>
#include "resource.h" |
cs |
이렇게 입력하여 리소스 파일을 포함시켜주면 된다.
그냥 이렇게 지나가면 한 가지 의문을 느낄 것이다.
우리는 리소스 헤더파일을 만든적이 없는데
프로젝트에 보면
이렇게 추가된 것이 보일 것이다.
이것은 이미지 파일을 불러오면 헤더 파일이 자동으로 만들어지는데,
이 헤더 파일은 사용자가 수정할 필요가 없기 때문에 손대지 않는 것이 좋다.
그리고 진짜 실행시켜보면.
결과
정상적으로 출력되는 것을 볼 수 있을 것이다.
'API > 이론' 카테고리의 다른 글
배경을 클래스화 해서 출력하기. (0) | 2016.04.27 |
---|---|
여러 이미지 출력을 위한 소스정리 및 파일 나누기 (0) | 2016.04.26 |
더블 버퍼링 (0) | 2016.04.25 |
wParam, lParam (0) | 2016.04.15 |
리스트 박스 스타일 (0) | 2016.04.15 |
쉽게 말해서 더블 버퍼링이란
화면에 먼저 그려지기 전에 메모리에 먼저 그림을 그린 후
그림이 다 그려지면 메모리에 그려진 그림들을 화면에 한꺼번에 복사해 주는 것이다.
더블 버퍼링을 직접 해 보도록 하자.
우선 2개의 DC와
하나의 BitDC를 만들것이다.
첫 번째 DC의 역할은 메모리를 만들어 그려질 장소를 마련하는 것이고,
두 번째 DC의 역할은 마련된 장소에 그림을 그려주는 역할을 한다.
그리고 BitDC는 비트맵이 하나 담기는데, 1픽셀짜리 흑백 비트맵이 담긴다.
우선 전역변수로서 선언해 주기로 하자.
1 2 3 4 5 6 7 | #include <windows.h> #include <tchar.h> HDC g_hBackBuffer; HDC g_hMemDC; HBITMAP g_hBackBitmap; | cs |
첫 번째 DC의 변수명은 g_hBackBuffer
두 번째 DC의 변수명은 g_hMemDC
BitDC의 변수명은 g_hBackBitmap 이다.
이제 WM_CREATE가 호출됬을 때의 처리를 해보도록 하자.
1 2 3 4 5 6 7 8 9 10 11 | case WM_CREATE: { HDC hDC = GetDC(hWnd); g_hBackBuffer = CreateCompatibleDC( hDC ); g_hBackBitmap = CreateCompatibleBitmap( hDC, 1440,600 ); SelectObject( g_hBackBuffer, g_hBackBitmap ); g_hMemDC = CreateCompatibleDC( hDC ); ReleaseDC(hWnd, hDC); break; } | cs |
설명은 그림으로 하자면,
이러하다.
WM_PAINT는
1 2 3 4 5 6 7 8 | case WM_PAINT: { PAINTSTRUCT ps; HDC hDC = BeginPaint(hWnd, &ps); BitBlt(hDC, 0,0,1440,600,g_hBackBuffer,0,0,SRCCOPY); EndPaint(hWnd, &ps); break; } | cs |
이렇게 하고 실행하면,
1픽셀 짜리 흑백 비트맵이 1440,600크기로 출력 되면서,
실행시 밑의 화면처럼 되는것을 볼 수 있을 것이다.
결과
이렇게 검정색 화면이 나오면 더블 버퍼링의 기본은 마련했다고 볼 수 있을것이다.
'API > 이론' 카테고리의 다른 글
여러 이미지 출력을 위한 소스정리 및 파일 나누기 (0) | 2016.04.26 |
---|---|
배경화면 출력하기. (0) | 2016.04.26 |
wParam, lParam (0) | 2016.04.15 |
리스트 박스 스타일 (0) | 2016.04.15 |
메시지 루프 (0) | 2016.04.13 |