220 likes | 776 Views
DirectX 게임 프로그래밍. LPA campus. 진 행 순 서. DirectX 와 GDI 구조. I. DirectX 게임 루프. DirectX 개요. DirectX 기본 코드. DirectX 순서. Ⅲ. Ⅳ. Ⅴ. II. DirectX & GDI. DirectX 와 GDI 구조. DirectX 게임 루프. 게임 루프. DirectX 개요. DirectX 개요. DirectX 개요. IDirectDraw7. IDirectDrawSurface7. IUnKnown.
E N D
DirectX 게임 프로그래밍 LPA campus
진 행 순 서 DirectX와 GDI 구조 I DirectX 게임 루프 DirectX 개요 DirectX 기본 코드 DirectX 순서 Ⅲ Ⅳ Ⅴ II
DirectX & GDI DirectX 와 GDI 구조
DirectX 게임 루프 게임 루프
DirectX 개요 DirectX 개요
DirectX 개요 IDirectDraw7 IDirectDrawSurface7 IUnKnown IDirectDrawPalette IDirectDrawClipper DirectX 개요
DirectX 개요 내부데이터 애플리케이션 인터페이스 멤버 함수1 멤버 함수2 멤버 함수3 멤버 함수4 COM 객체 DirectX 개요 • - COM(컴포넌트 객체 모델) : 컴포넌트 소프트웨어를 위한 바이너리 표준, 다양한 하드웨어에서 동작되도록 호환성을 만들어낸다. • COM 객체 내부의 함수를 사용하는 유일한 방법은 인터페이스 객체를 통하는 것이다. • 인터페이스는 객체내의함수를 가리키는 포인터의 집합. ret = lpDD->CreateSurface(&ddsd, &lpDDS,NULL)
DirectX 기본 코드 int Game_Init(void *parms) { if( DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL) != DD_OK ) { return 0; } // set cooperation level to windowed mode normal if( ( lpdd->SetCooperativeLevel( main_window_handle, DDSCL_ALLOWMODEX | DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT ) ) != DD_OK ) { return 0; } // set the display mode if( ( lpdd->SetDisplayMode( 640, 480, 8, 0, 0) ) != DD_OK ) { return 0; } return 1; } DirectX 기본 코드 설명
DirectX 순서 DirectX 순서 • DirectDraw 객체 생성 • 윈도우 협력 수준 설정 • 디스플레이 모드 선택 • Primary Surface 만들기( 주 표면 ) • 5. Secondary Surface 만들기( 보조 표면 ) • 6. 주표면과 보조표면 플립(Flip)하기 • 7. 256 컬러를 표현하기 위해 팔레트 사용 • 8. Blt(), BltFast() 블리터를 이용하여 그림 그리기 • 9. 컬러키(ColorKey)와 투명도 설정 • 10. 윈도우 창모드 사용시 클리퍼(Clipping) 사용하기
DirectX 순서 1. DirectDraw 객체 생성 • DirectDraw 객체 생성 • DirectDraw (화면에 관계된 모든 기능을 지닌 라이브러리) 객체 생성 • LPDIRECTDRAW lpdd; • DirectDrawCreateEx( 사용하고자 하는 비디오 드라이버, • COM 인터페이스 주소 리턴, • 요청하는 인터페이스의 ID, • 심화기능 : 항상 NULL); • if( DirectDrawCreateEx( NULL, • (void **)&lpdd, • IID_IDirectDraw7, • NULL) != DD_OK ) • { • return 0; • }
DirectX 순서 2. 윈도우 협력 수준 설정 2. 윈도우 협력 수준 설정 1) 윈도우 모드 lpdd->SetCooperativeLevel( MainHwnd, DDSCL_NORMAL); 2) 풀 스크린 모드 lpdd->SetCooperativeLevel( MainHwnd, DDSCL_EXCLUSIVE || DDSCL_FULLSCREEN);
DirectX 순서 3. 디스플레이 모드 선택 lpdd->SetDisplayMode( 가로픽셀, 세로픽셀, 색상 비트수, 화면갱신 속도, 저해상도 모드 설정); 가 로 픽 셀 : 수평 해상도( 640, 800, 1024…) 세 로 픽 셀 : 수직 해상도( 480, 600, 768…) 색상 비트수 : 픽셀당 비트수( 8, 16, 24, 32BPP ) 화면 갱신 속도 : 기본값 0 저해상도 모드 설정 : 기본값 0 화면 갱신 속도와 저해상도 모드는 0으로 설정하거나 그대로 둔다. 3. 디스플레이 모드 선택
DirectX 순서 4. Primary Surface 만들기 4. Primary Surface 만들기 1) 서페이스란? 이미지 정보를 읽고 쓰는 일종의 저장 공간, API함수를 사용하지 않고도 DirectX를 통해 화면으로 직접적인 접근이 가능 - 화면에 보이는 서페이스 (Surface) : Primary(주표면) - Primary에 연결되어 있으면서 화면에 보이지 않는 서페이스 (Surface) : Back(보조표면) - Primary에 연결되어 있지 않으면서 화면에 보이지 않는 서페이스 (Surface) : OffScreen(오프 스크린) DDSURFACEDESC2 ddsd; LPDIRECTDRAWSURFACE7 lpddsprimary; ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; If( lpdd->CreateSurface( &ddsd, &lpddsprimary, NULL ) != DD_OK ) { /*Error*/ }
DirectX 순서 5. Secondary Surface 만들기 5. Secondary Surface 만들기 CreateSurface( 만들어질 서페이스의 정보를 담고 있는 구조체, LPDDSURFACEDESC2의 포인터, 서페이스 객체의 포인터, 다음 버전과의 호환); DDSURFACEDESC2 ddsd; LPDIRECTDRAWSURFACE7 lpddsprimary,lpddssecondary; ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAP_FLIP | DDSCAPS_COMPLEX; If( lpdd->CreateSurface( &ddsd, &lpddsprimary, NULL ) != DD_OK ) { /*Error*/ } lpdd->CreateSurface( &ddsd, &lpddssecondary, NULL ); ddscaps.dwCaps = DDSCAPS_BACKBUFFER; lpddsprimary->GetAttachedSurface(&ddscaps, &lpddssecondary);
DirectX 순서 6. 주표면과 보조표면 플립하기 6. 주표면과 보조표면 플리핑하기 lpddsprimary->Flip(NULL, DDFLIP_WAIT);
DirectX 순서 7. 256 컬러를 위한 팔레트 사용 • 7. 팔레트 사용 • 사용자의 시스템의 그래픽 카드의 낮은 성능을 이유로 팔레트로 프로그래밍될 것 같으면 팔레트 객체를 사용해야 한다. • -해당 픽셀을 디스플레이 할 때에 사용하기 위한 컬러가 무엇인지를 알리기 위해 컬러 테이블에 있는 인덱스. • - 16비트나 또는 그보다 더 큰 픽셀 포맷을 사용하는 표면은 팔레트를 사용하지 못한다.
DirectX 순서 8. Blt().. 블리터 이용하여 그림 그리기 8. DirectDraw에 내장된 이미지 출력 함수 - Blt( 이미지가 그려질 영역의 구조체, 이미지가 그려질 서페이스 변수명, 이미지를 복사할 영역의 구조체, 복사하는 방법, 여러 가지 효과를 주기 위한 구조체 ); - BltFast( 이미지를 출력할 가로 좌표, 이미지를 출력할 세로 좌표, 복사할 이미지를 읽어낼 서페이스 객체, 복사할 영역을 나타내는 구조체, 복사할 방법을 나타내는 플래그 ); - Blt()는 크기를 늘리거나 줄일 수 있으며, z-버퍼와 투명(컬러키 적용)하게 복사 하는 것이 가능하다. - BltFast()는 원본과 대상의 1:1 복사 이외의 옵션이 없다.
DirectX 순서 9. 컬러키(Colorkey)와 투명도 설정 9. 컬러키(ColorKey) 설정 - 컬러키를 설정하면 설정된 색상은 투명하게 복사된다. DDCOLORKEY key; // 색상키 // 투명색 범위를 0~10으로 설정 Key.dwColorSpaceLowValue = 0; Key.dwColorSpaceHighValue = 10; // 후면 버퍼에 있는 Surface에 컬러키를 설정한다. lpddback->SetColorKey( DDCKEY_SRCBLT, &key ); // 후면 버퍼를 주표면 혹은 다른 Surface에 블리트(복사)한다. lpddsprimary->Blt(…);
DirectX 순서 Destination Surface Visible Portion Clipped Portion 자동적으로 이루어지는 클리핑 영역 10. 창모드에서 클리퍼 사용하기 • 10. 클리퍼(Clipper) • 클리퍼(DirectDrawClipper 객체)는 표면에서 선택된 부분만이 블릿 되도록 허용한다. • 스크린이나 윈도우의 경계를 정의하여 사용 • 클리퍼를 사용하는 가장 중요한 이유는 창 모드에서 Window영역 • 만큼만 DirectDraw로 그려주면 되는데 아래 그림과 같이 그리고자 하는 Object가 창 밖에 걸쳐 있을 경우 밖으로 나간 부분을 그리지 않게 함으로써 깔끔한 출력과 그리는 속도 향상에 이익이 있기 때문이다.