ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1 강. Direct3D 기본 환경 만들기
    프로그래밍 2013. 11. 14. 00:19
    반응형

    1 강. Direct3D 기본 환경 만들기

     

    1.1 Win32 API 기본 코드 생성

     

    (1) 엑셀레이더 코드 제거


    Win32 API를 자동생성 코드로 생성하면 엑셀레이터 코드가 자동으로 붙게 된다.

    이 코드를 제거하는 간단한 방법은 엑셀레이터 변수인 HACCEHACCEL hAccelTable;

    를 제거하고 난 후에 Ctrl+F5f를 눌러 컴파일을 하면 에러나는 부분을 모두 삭제하면 간단히 해결된다.


    (2) 메시지 루프


    Win32 API 메시지 루프는 메시지가 있을 때 GetMessage()가 실행된다.

    즉 GetMessage()는 응용프로그램에 해당되는 메시지를 조사하다가 메시지 발생하면 리턴하므로 GetMessage()는 대기상태를

    만들게 된다.


    게임은 계속적으로 업데이트와 렌더링을 반복주는 구조이므로 이 구조를 수정해야 한다.

    PeekMesssage()는 대기상태 없이 메시지만을 체크해주거나 제거가 가능한 함수이므로 이 함수를 이용하여

    아래와 같이 구조를 만든다.

     
    // CreateDevice1.cpp : 응용 프로그램에 대한 진입점을 정의합니다.
    //
    #include "stdafx.h"
    #include "CreateDevice1.h"
    #include 
    #define MAX_LOADSTRING 100
    
    // 전역 변수:
    HINSTANCE hInst;								// 현재 인스턴스입니다.
    TCHAR szTitle[MAX_LOADSTRING];					// 제목 표시줄 텍스트입니다.
    TCHAR szWindowClass[MAX_LOADSTRING];			// 기본 창 클래스 이름입니다.
    HWND g_hWnd;
    
    
    LPDIRECT3D9         g_pD3D = NULL; // Used to create the D3DDevice
    LPDIRECT3DDEVICE9   g_pd3dDevice = NULL; // Our rendering device
    
    // 이 코드 모듈에 들어 있는 함수의 정방향 선언입니다.
    ATOM				MyRegisterClass(HINSTANCE hInstance);
    BOOL				InitInstance(HINSTANCE, int);
    LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
    
    
    HRESULT InitD3D( HWND hWnd )
    {    
        if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
            return E_FAIL;
        
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory( &d3dpp, sizeof( d3dpp ) );
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
      
        if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                          &d3dpp, &g_pd3dDevice ) ) )
        {
            return E_FAIL;
        }   
    
        return S_OK;
    }
    
    VOID Cleanup()
    {
        if( g_pd3dDevice != NULL )
            g_pd3dDevice->Release();
    
        if( g_pD3D != NULL )
            g_pD3D->Release();
    }
    
    VOID Render()
    {
        if( NULL == g_pd3dDevice )
            return;
    
        // Clear the backbuffer to a blue color
        g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );
    
        // Begin the scene
        if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
        {
            // Rendering of scene objects can happen here
    
            // End the scene
            g_pd3dDevice->EndScene();
        }
    
        // Present the backbuffer contents to the display
        g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
    }
    
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    	UNREFERENCED_PARAMETER(hPrevInstance);
    	UNREFERENCED_PARAMETER(lpCmdLine);
    
     	// TODO: 여기에 코드를 입력합니다.
    	MSG msg;
    	HACCEL hAccelTable;
    
    	// 전역 문자열을 초기화합니다.
    	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    	LoadString(hInstance, IDC_CREATEDEVICE1, szWindowClass, MAX_LOADSTRING);
    	MyRegisterClass(hInstance);
    
    	// 응용 프로그램 초기화를 수행합니다.
    	if (!InitInstance (hInstance, nCmdShow))
    	{
    		return FALSE;
    	}
    
    	// 기본 메시지 루프입니다.	
        InitD3D( g_hWnd );    
    
    	while ( true)
    	{
    		if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE) )
    		{
    			if( msg.message == WM_QUIT )
    				break;
    
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}else{
    			// 업데이트와 렌더링
    			Render();
    		}		
    	}
    
    	return (int) msg.wParam;
    }
    
    
    
    //
    //  함수: MyRegisterClass()
    //
    //  목적: 창 클래스를 등록합니다.
    //
    //  설명:
    //
    //    Windows 95에서 추가된 'RegisterClassEx' 함수보다 먼저
    //    해당 코드가 Win32 시스템과 호환되도록
    //    하려는 경우에만 이 함수를 사용합니다. 이 함수를 호출해야
    //    해당 응용 프로그램에 연결된
    //    '올바른 형식의' 작은 아이콘을 가져올 수 있습니다.
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    	WNDCLASSEX wcex;
    
    	wcex.cbSize = sizeof(WNDCLASSEX);
    
    	wcex.style			= CS_HREDRAW | CS_VREDRAW;
    	wcex.lpfnWndProc	= WndProc;
    	wcex.cbClsExtra		= 0;
    	wcex.cbWndExtra		= 0;
    	wcex.hInstance		= hInstance;
    	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CREATEDEVICE1));
    	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
    	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
    	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_CREATEDEVICE1);
    	wcex.lpszClassName	= szWindowClass;
    	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
    	return RegisterClassEx(&wcex);
    }
    
    //
    //   함수: InitInstance(HINSTANCE, int)
    //
    //   목적: 인스턴스 핸들을 저장하고 주 창을 만듭니다.
    //
    //   설명:
    //
    //        이 함수를 통해 인스턴스 핸들을 전역 변수에 저장하고
    //        주 프로그램 창을 만든 다음 표시합니다.
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       HWND hWnd;
    
       hInst = hInstance; // 인스턴스 핸들을 전역 변수에 저장합니다.
    
      
        g_hWnd = hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
          100, 100, 300, 300, NULL, NULL, hInstance, NULL);
    
       if (!hWnd)
       {
          return FALSE;
       }
    
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);
    
       return TRUE;
    }
    
    //
    //  함수: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    //  목적: 주 창의 메시지를 처리합니다.
    //
    //  WM_COMMAND	- 응용 프로그램 메뉴를 처리합니다.
    //  WM_PAINT	- 주 창을 그립니다.
    //  WM_DESTROY	- 종료 메시지를 게시하고 반환합니다.
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	int wmId, wmEvent;
    	PAINTSTRUCT ps;
    	HDC hdc;
    
    	switch (message)
    	{
    	case WM_COMMAND:
    		wmId    = LOWORD(wParam);
    		wmEvent = HIWORD(wParam);
    		// 메뉴의 선택 영역을 구문 분석합니다.
    		switch (wmId)
    		{
    		case IDM_ABOUT:
    			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    			break;
    		case IDM_EXIT:
    			DestroyWindow(hWnd);
    			break;
    		default:
    			return DefWindowProc(hWnd, message, wParam, lParam);
    		}
    		break;
    	case WM_PAINT:
    		hdc = BeginPaint(hWnd, &ps);
    		// TODO: 여기에 그리기 코드를 추가합니다.
    		EndPaint(hWnd, &ps);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProc(hWnd, message, wParam, lParam);
    	}
    	return 0;
    }
    
    // 정보 대화 상자의 메시지 처리기입니다.
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	UNREFERENCED_PARAMETER(lParam);
    	switch (message)
    	{
    	case WM_INITDIALOG:
    		return (INT_PTR)TRUE;
    
    	case WM_COMMAND:
    		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    		{
    			EndDialog(hDlg, LOWORD(wParam));
    			return (INT_PTR)TRUE;
    		}
    		break;
    	}
    	return (INT_PTR)FALSE;
    }
    
    
    
    반응형

    '프로그래밍' 카테고리의 다른 글

    리액트 웹사이트 이더리움 전송  (0) 2022.11.23
    개인정보처리방침 구글 출시용  (0) 2021.06.10
    C 게임프로그래밍 8  (0) 2013.11.09
    C 게임프로그래밍 7  (0) 2013.11.09
    C 게임프로그래밍 6  (0) 2013.11.09
Designed by Tistory.