여러 이미지 출력을 위한 소스정리 및 파일 나누기

|

우리는 최종적으로 배경을 출력하고

플레이어 캐릭터를 출력하고

에너미 하나를 출력할 것이다.


이것에 대한 소스들이 모두 한 곳에 있다면

매우 관리하기가 힘들것이다.

그렇기 때문에 배경은 배경대로,

플레이어는 플레이어대로

에너미는 에너미대로 나누어서 관리할 것이다.


첫 번째 할 일은 전처리의 #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
And

배경화면 출력하기.

|

더블 버퍼링의 처리가 끝났으면

배경 이미지를 불러와 윈도우에 그려보도록 하겠다.

더블 버퍼링 다시보기.

 

이미지는 상대경로로 지정하기 위해 프로젝트 폴더 안에 소스파일을 넣도록 하겠다.

이렇게 준비가 끝났으면 시작하도록 하겠다.

 

우선 첫 번째 할일로는 리소스를 불러오도록 하겠다.

 

 

 

 

 

여기까지 준비가 되었으면

코드로 작성으로 넘어가겠다.

※주의사항

프로젝트 폴더명이 바뀌거나 프로젝트 폴더의 경로가 바뀌면

리소스를 불러온 상대경로가 바뀌므로 오류가 일어나게된다.

 

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
And

더블 버퍼링

|

쉽게 말해서 더블 버퍼링이란

화면에 먼저 그려지기 전에 메모리에 먼저 그림을 그린 후

그림이 다 그려지면 메모리에 그려진 그림들을 화면에 한꺼번에 복사해 주는 것이다.


더블 버퍼링을 직접 해 보도록 하자.


우선 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
And
prev | 1 | ··· | 6 | 7 | 8 | 9 | 10 | 11 | 12 | ··· | 15 | next