E D R , A S I H C RSS

Direct Draw


1. κ°œκ΄€

DirectX 8.1을 μ΄μš©ν•œ DirectDraw둜 무언가λ₯Ό λ§Œλ“€μ–΄ 보자.

11κΈ° μ΄μ„ ν˜Έ μž…λ‹ˆλ‹€.

극히 개인적인 λ¬Έμ„œκ°€ 될것 κ°™λ„€μš”.

DeleteMe λ‚˜λ„ 껴쀘~~~ - 인수

2. DirectX 8.1 SDK

κΉŒλŠ”λ° 어렀움이 쑰금 μžˆμ—ˆλ‹€. μ„€μ •ν•  뢀뢄이 있기 λ•Œλ¬Έμ—.

Visual C++ -> Tools -> Options -> Directoriesμ—μ„œ

Include Files μ—λŠ” C:\DXSDK\INCLUDEλ₯Ό

Library Files μ—λŠ” C:\DXSDK\LIBλ₯Ό μΆ”κ°€ν•΄μ•Όν•œλ‹€.

그리고 Project Setting -> Link -> Object/Library modulesμ—λŠ”
ddraw.lib와 dxguid.libλ₯Ό μΆ”κ°€ν•΄μ•Όν•œλ‹€.

그리고 μ†ŒμŠ€νŒŒμΌμ˜ μ•žλΆ€λΆ„μ—
#include <ddraw.h>
λ₯Ό μΆ”κ°€ν•΄μ•Όν•œλ‹€.

3. DirectDraw의 κ³Όμ •(?)

μ†ŒμŠ€λ₯Ό μ³λ³΄λ©΄μ„œ λŠλ‚€ 점이닀

DirectDraw객체의 생성 -> ν‘œλ©΄μ˜ 생성(Front, Back, OffScreen) -> 그리고.. ν‘œλ©΄ λ’€μ§‘κΈ°..

쀑간쀑간 더 μ€‘μš”ν•œ λ‚΄μš©μ΄ μžˆμ„ 것이닀.

4. Source

4.1. μ΄ˆκΈ°ν™”

4.1.1. DirectDraw객체의 생성

~cpp 
HRESULT hr
LPDIRECTDRAW7 lpDD;
hr = DirectDrawCreateEx(NULL, (void **)&lpDD, IID_IDirectDraw7, NULL); // DirectDraw객체λ₯Ό 생성
if(hr != DD_OK) return 0;
hr = lpDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN); // ν™”λ©΄μ˜ λ ˆλ²¨μ„ μ„€μ •
if(hr != DD_OK) return 0;
hr = lpDD->SetDisplayMode(640, 480, 8, 0, 0);
if(hr != DD_OK) return 0;
  1. SetCooperativeLevel의 인자.
    • DDSCL_ALLOWMODEX : ModeXλ₯Ό μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ ν•΄μ€λ‹€λŠ”λ°. μ•Œμˆ˜ μ—†λ‹€.(μ˜ˆμ „μ— μ“°λ˜ ν™”λ©΄ λͺ¨λ“œλΌκ³  ν•œλ‹€.)
    • DDSCL_ALLOWREBOOT : Ctrl+Alt+Del을 μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ
    • DDSCL_EXCLUSIVE : 독점 λͺ¨λ“œλ₯Ό μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ, DDSCL_FULLSCREEN κ³Ό ν•¨κ»˜ 쓰인닀.
    • DDSCL_FULLSCREEN : ν’€μŠ€ν¬λ¦° λͺ¨λ“œ
    • DDSCL_NORMAL : λ³΄ν†΅μ˜ μœˆλ„μš° μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜
    • DDSCL_NOWINDOWCHANGES : μ΅œμ†Œν™”/μ΅œλŒ€ν™”λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
  2. SetDisplayMode의 인자.
    • 640 : κ°€λ‘œν•΄μƒλ„
    • 480 : μ„Έλ‘œν•΄μƒλ„
    • 8 : 색생 (bit수, 8은 256컬러, 16은 High컬러)
    • 0 : Refresh Rate, 0은 λ””λ°”μ΄μŠ€ κΈ°λ³Έκ°’ (λŒ€κ°œ 0으둜 λ†“λŠ”λ‹€.)
    • 0 : μ•ˆμ¨μš”

4.1.2. DirectDraw Front ν‘œλ©΄μ˜ 생성

~cpp 
LPDIRECTDRAWSURFACE7 lpDDSFront;
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd); // 크기λ₯Ό μ €μž₯
ddsd.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT; // ꡬ쑰체와 backbuffercountλ₯Ό μ‚¬μš©κ°€λŠ₯
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX; // 1μ°¨ν‘œλ©΄, ν”Œλ¦½κ°€λŠ₯
ddsd.dwBackBufferCount = 1; // 2μ°¨ν‘œλ©΄μ˜ 개수
hr = lpDD ->CreateSurface(&ddsd, &lpDDSFront, NULL); // 생성!
if(hr != DD_OK) return 0;
  • ddsd의 λ³€μˆ˜λ“€
    • dwSize : ddsd의 크기가 λ“€μ–΄κ°‘λ‹ˆλ‹€.
    • dwFlags : ddsd의 성격에 λŒ€ν•΄ λ“€μ–΄κ°€λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€.
    • ddsCaps.dwCaps : 더 μžμ„Έν•œ.. 성격..
    • 그리고 기타 λ³€μˆ˜λ“€. : dwFlagμ—μ„œ κ²°μ •ν•΄μ€ μ„±κ²©λ“€μ˜ λ³€μˆ˜λ₯Ό μ •ν•΄μ€λ‹ˆλ‹€.

4.1.3. DirectDraw Back ν‘œλ©΄μ˜ 생성

~cpp 
LPDIRECTDRAWSURFACE7 lpDDSBack;
DDSCAPS2 ddscaps;
ZeroMemory(&ddscaps, sizeof(ddscaps)); // λ©”λͺ¨λ¦¬ μ΄ˆκ°€ν™”
ddscaps.dwCaps = DDSCAPS_BACKBUFFER; // 2μ°¨ν‘œλ©΄
hr = lpDDSFront->GetAttachedSurface(&ddscaps, &lpDDSBack); // 1μ°¨ν‘œλ©΄κ³Ό μ ‘ν•©(같은 μ†μ„±μ˜ ν‘œλ©΄μ„ 생성)
if(hr != DD_OK) return 0;
lpDDSBack->AddRef();

4.1.4. DirectDraw OffScreen의 생성

~cpp 
LPDIRECTDRAWSURFACE7 lpDDSOff;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH; // 높이와 넓이λ₯Ό μ§€μ •ν•  수 있음
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; // μ˜€ν”„μŠ€ν¬λ¦°μž„μ„ ν‘œμ‹œ
ddsd.dwHeight = 16; // 높이
ddsd.dwWidth = 16; // 넓이
hr = lpDD->CreateSurface(&ddsd, &lpDDSOff, NULL); // ν‘œλ©΄ 생성!
if(hr != DD_OK) return 0;

4.2. BMP Resourceλ₯Ό 화면에 뿌렀보자!

일단 HBITMAPν˜•μ˜ λΉ„νŠΈλ§΅μ„ μ–»μ–΄μ™€μ•Όν•œλ‹€.
~cpp 
HBITMAP hb;
hb = (HBITMAP) LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP), IMAGE_BITMAP, cxDesire, cyDesire, LR_CREATEDIBSECTION);
  1. 핸듀을 μ–»μ–΄μ˜¨λ‹€.
  2. λ¦¬μ†ŒμŠ€μ˜ IDλ₯Ό ν˜•μ— 맞게 고쳐μ€λ‹€.
  3. BITMAP은 IMAGE_BITMAP을.
  4. κ°€λ‘œμ˜ 넓이
  5. μ„Έλ‘œμ˜ 넓이
  6. γ…‘.γ…‘?
이걸둜 BITMAPν˜•μ„ μ–»λŠ”λ‹€.
~cpp 
BITMAP bmp;
GetObject(hb, sizeof(bmp), &bmp);
bmp.bmWidth 와 bmp.bmHeight둜 λΉ„νŠΈλ§΅μ˜ 크기λ₯Ό μ–»μ–΄λ‚Ό 수 μžˆλ‹€.
~cpp 
LPDIRECTDRAWSURFACE7 lpDDS = NULL;
DDSURFACEDESC2 ddsd;
ddsd.dwSize = sizeof(ddsd);
lpDDS->GetSurfaceDesc(&ddsd);
HDC hDC;
HDC hImageDC;
lpDDS->GetDC(&hDC);
hDCImage = CreateCompatibleDC(NULL);
SelectObject(hImageDC, hBMP);
StreachBlt(~~);
lpDDS->ReleaseDC(hDC);
DeleteDC(hImageDC);
이런 ꡬ쑰이닀. imagedc에 λ¨Όμ € 그림을 뿌리고 그것을 hdc에 κ·Έλ¦°λ‹€.

일단 bmpνŒŒμΌμ„ 찍기 μœ„ν•΄μ„œλŠ”
  1. bmpνŒŒμΌμ„ surface에 μ°λŠ”λ‹€. (μœ„μ™€ 같은 λ°©λ²•μœΌλ‘œ)
  2. Bltλ‚˜ Blifastλ₯Ό ν†΅ν•΄μ„œ BackSurface에 μ°λŠ”λ‹€.
  3. 그것을 Flipν•œλ‹€.
  4. 그러면 그것이 FrontSurface에 μ°ν˜€μ„œ 화면에 보이게 λœλ‹€.
μ†ŒμŠ€λ₯Ό 보고 λ‚΄λ¦° κ²°λ‘ .

4.3. κ²°λ‘ 

이둠만 μ΅ν˜€λ†“κ³ .. sdk 에 ν¬ν•¨λ˜μ–΄ μžˆλŠ”..
ddutil.h ddutil.cpp dxutil.h dxutil.cpp 만 있으면.. λΉ„νŠΈλ§΅μ€ κ·Έλƒμ°μ„ 수 μžˆκ΅°μš”..

γ…‘.γ…‘ 뭐.. κ·Έ μ†ŒμŠ€λ₯Ό λœ―μ–΄ κ³ μΉ λ§Œν•œ 건덕지도 μ—†κ΅°μš”.. μ›Œλ‚™ μž˜λ˜μ–΄ μžˆμ–΄μ„œ.

κ±°κΈ°μ„œ ν•„μš”μ—†μ–΄λ³΄μ΄λŠ”κ²ƒ 쀄이고 μ“Έλ§Œν•œκ±°λ§Œ μΆ”λ €μ„œ.. μƒˆλ‘œ.. λ§Œλ“€μ–΄λ³΄λ˜μ§€λ§Œ. ν•΄μ•Όκ² λ„€μš”.

DirectDrawκ°€.. ν•„μš”μ—†λ‹€λŠ” μ†Œλ¦¬λ₯Ό 이제 .. μ•Œκ±°κ°™μ•„μš”

쿨럭. 그럼.. API에 λŒ€ν•΄μ„œ 곡뢀해 λ΄μ•Όκ² λ„€μš”

4.3.1. Thread

μ˜ν˜„ μœ μš©μ„±μ„ μœ„ν•΄.. 뒀에 λ‚˜μ˜€λŠ” 7μ΄λ‚˜ 2λŠ” 빼라.. γ…‘γ…‘; ν•˜ν•˜..

μ„ ν˜Έ κ·Έλž˜λ„.. 8.1 깔은 김에..γ…‘γ…‘;

ν•΄μ„± μ§€λ‚˜κ°€λ‹€κ°€ ν•œλ§ˆλ””.. ^^;; DX μ΄ˆκΈ°ν™” 과정은 이전버전과 ν‘μ‚¬ν•˜κ΅°μš”.. 음.. μ΄ˆκΈ°ν™” μΈν„°νŽ˜μ΄μŠ€λ₯Ό νŒŒμ•…ν–ˆλ‹€λ©΄.. λ‹€μ΄λ ‰νŠΈ μ—‘μŠ€κ°€ μ–΄λ–»κ²Œ λ‚΄λΆ€μ μœΌλ‘œ μž‘λ™ν•΄μ„œ 일반 μœˆλ„μš° ν”„λ‘œκ·Έλž˜λ° 보닀 λΉ λ₯Έ μ—‘μ„ΈμŠ€ λ©”μΉ΄λ‹ˆμ¦˜μ„ μ œκ³΅ν•˜λŠ”μ§€ νŒŒμ•…ν•˜μ‹œκ΅¬μš”.. μ™ λ§Œν•˜λ©΄ DX 쓰지말ꡬ.. 좔가적인 μ΄νŽ™νŠΈλ“±μ„ κ΅¬ν˜„ν•΄λ³΄λŠ”κ²Œ 쒋을것 κ°™λ„€μš”.. μ•ŒνŒŒλΈ”λ Œλ”©μ„ μ‘μš©ν•œ μ—¬λŸ¬κ°€μ§€ 기법(νŽ˜μ΄λ“œ μΈμ•„μ›ƒμ΄λ‚˜ μ „ν™˜.. λ­λΌκ·ΈλŸ¬λ“œλΌ).. ν•˜κ΅¬.. μ „ λͺ»ν•΄λ΄μ§€λ§Œ.. λΈ”λŸ¬λ§ ν•„ν„° 같은것두.. μ„œνŽ˜μ΄μŠ€μ— 직접 μ–΅μ„ΈμŠ€ ν•˜λŠ”κ±° κ³΅λΆ€ν•˜λ©΄.. ν•΄λ³Όλ§Œ 할것 κ°™κ΅°μš”.. 그리ꡬ.. 음.. 맀일 ν—ˆμ ‘ ν”Œλ°μ„ ν•˜κ΅¬ μžˆμ§€λ§Œ.. κ·Έλž˜λ‘ μ§€κ²¨μš΄ μ΄ˆκΈ°ν™” 과정을 λ‹¨μΆ•μ‹œν‚€κΈ° μœ„ν•΄ μ–΄λŠμ •λ„ λͺ¨λ“ˆν™”λ˜κ²Œ λΌμž…μ„ κ΅¬μΆ•ν•˜λ©΄ μ’‹κ² μ§€μš”.. μ „ μ ˆλŒ€ μ•ˆν•˜μ§€λ§Œ.. γ…‹γ…‹;; 그럼.. μž‘μ„€μ΄μ—ˆμŠ΅λ‹ˆλ‹Ή~ 수거~

1002 μ΄ˆκΈ°ν™”κ³Όμ •μ΄ 이전버전과 같은 μ΄μœ λŠ” Surface 7 을 μ΄μš©ν•΄μ„œμΌκ²ƒ κ°™λ‹€λŠ”. DX8λ‘œλŠ” 아직 μ•ˆν•΄λ΄μ„œ..~

데기) 해성이가 λ§ν•œ 좔가적인 μ΄νŽ™ν„°λ“€μ˜ 기본적인 μ•„μ΄λ””μ–΄λŠ” 'μ˜μƒμ²˜λ¦¬' μ‹œκ°„μ— 배울 수 μžˆμŠ΅λ‹ˆλ‹€. (μ„ ν˜Έ 혼자 DX λ³΄λŠ”λ°λ„ μ˜μ™Έλ‘œ 진도가 잘 λ‚˜κ°€λŠ”λ“―...)

1002 Output 이 κΈ‰ν•˜λ‹€λ©΄ DirectX Media SDK λ₯Ό μ΄μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ•ŒνŒŒλΈ”λžœλ”© 기본적으둜 μ§€μ›ν•©λ‹ˆλ‹€. 그리고 Transform Libary λ₯Ό μ΄μš©ν•˜λ©΄ ν™”λ©΄ μ „ν™˜κ³Ό κ΄€λ ¨λœ νŠΉμˆ˜νš¨κ³Όλ“€μ„ μ΄μš©ν•  μˆ˜λ„ 있죠. ν•˜μ§€λ§Œ, κ³΅λΆ€ν•˜μ‹œλŠ” μž…μž₯μ—μ„œλŠ” 이둠을 νŒŒκ³ λ“€μ–΄μ„œ 직접 ν•΄λ³΄λŠ” 것이 μ’‹κ² μ£ .

ν•΄μ„± κ°€λ§Œλ³΄λ‹ˆ .. 99듀이 감놔라 배좔놔라 ν•˜κ΅¬ 있ꡰ.. -0-;;; γ…Žγ…Ž;;

DeleteMe) DX8 SDKλ¬Έμ„œλ₯Ό λ³΄λ‹ˆ Direct Draw의 μ „ κΈ°λŠ₯이 Direct3D둜 톡합 λλ‹€λŠ”κ΅°.... 고둜 DDrawλŠ” μ΄μ œλŠ” μ˜λ―Έκ°€ ν‡΄μƒ‰ν•œλ“―.. 쿨럭;; by λ΄‰ν™˜(λΉ„νšŒμ› 참견꾼)

μ„ ν˜Έ 뭐.. DirectGraphics둜 ν†΅ν•©λ˜μ—ˆλ‹€κ³  ν•˜μ§€λ§Œ 아직 μ˜ˆμ „μ˜ κΈ°λŠ₯듀은 μ „λΆ€ λ‚¨μ•„μžˆκ³  μ˜μ›νžˆ 2Dλ₯Ό μ•ˆν•˜λŠ” 것은 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—. 뭐 2Dλ₯Ό 3Dλ₯Ό 톡해 ν‘œν˜„ν•˜λŠ” κΈ°λ²•λ“€λ§Œ μš”μƒˆλŠ” μ†Œκ°œλ˜κ³  μžˆμ–΄μ„œ μ•ˆνƒ€κΉκΈ°λ„ ν•˜μ§€λ§Œ.^^



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:08
Processing time 0.0271 sec