์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ ์ ์์ต๋๋ค.
์ถ์ฒ : http://myhome.hanafos.com/~kukdas/
Direct X
Direct X
DirectX Programming (1)
----------------------------------------------------------------------
๋ณธ ๊ฐ์ข๋ ํ๋ก๊ทธ๋๋ฐ์ธ๊ณ 98๋
10์ํธ์ ์ค๋ฆฐ ๋ด์ฉ์ ๋ฐ์ทํ ๊ฒ์
๋๋ค.
DirectX๋ฅผ ์ฒ์์์ํ์๋ ๋ถ์๊ฒ ๋ง์ ๋์์ด ๋๊ธธ ๋ฐ๋๋๋ค.
----------------------------------------------------------------------
์์ฆ ๊ตญ๋ด์์๋ ์ํํธ์จ์ด ์์ถ์ ๋ฐ๋์ด ์ผ๊ณ ์๋ค. ์ํํธ์จ์ด ์ค์
์ ๊ฒ์ ์ํํธ์จ์ด๋งํผ ์์ถ์ด ์ฉ์ดํ ๋ถ์ผ๋ ์์ ๊ฒ์ด๋ค.
ํนํ ๋คํธ์ํฌ๋ฅผ ํตํ ์จ๋ผ์ธ ๊ฒ์์ด ๊ฐ๊ด๋ฐ๊ณ ์๋๋ฐ ์ด ํน์ง์ด ๊ทธ๋ฐ ๋ถ
์ผ์ ๊ด์ฌ์๋ ๋ ์๋ค์๊ฒ ์์ํ ์ ์๋ ํ ๋๊ฐ ๋์์ผ๋ฉด ํ๋ ๋ฐ๋จ์ด๋ค.
์ฌ๊ธฐ์์๋ ์์ ํ๋ก๊ทธ๋จ ์ ์์ ๋น์ฃผ์ผ C++ 5.0์ ์ฌ์ฉํ ๊ฒ์ด๋ค. MFC
๋ฅผ ์ฌ์ฉํด ํ๋ก๊ทธ๋๋ฐํ์ง๋ ์์ ๊ฒ์ด๊ณ SDK๋ฅผ ์ฌ์ฉํด API๋ก ํ๋ก๊ทธ๋๋ฐ
์ ํ ๊ฒ์ด๋ค. MFC๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ์๋ ๋ค์ด๋ ํธX ์์ฒด๋ณด๋ค๋ MFC์ ๋ํ
์ง์์ด ํ์ํด ์ค๋ช ํ๊ณ ์ ํ๋ ์ด์ ์ด ํ๋ ค์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ค์ด๋ ํธX์ ์๊ฐ
๋ค์ด๋ ํธX๋ ?
์ผ๋ง ์ ๋ค์ด๋ ํธX 6.0์ด ๋ฐํ๋์๋ค. ํ์๋ ๋ค์ด๋ ํธX 5.0์ ๊ธฐ๋ฐํ์ฌ
์๊ณ ๋ฅผ ์์ฑํ์๋๋ฐ ์ฌ์ค ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ ๋ค์ด๋ ํธ ์ฌ์ด๋ ๋ ๋ฒจ์ ํ
๋ก๊ทธ๋๋ฐ์์ 5.0๊ณผ 6.0์ ๊ธฐ๋ฅ ์์ ์์ด ํฐ ์ฐจ์ด๊ฐ ์๋ค. ๋จผ์ ๋ค์ด๋ ํธX
๊ฐ ๋ฌด์์ธ์ง๋ถํฐ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค. ํ๋ง๋๋ก ๋ค์ด๋ ํธX๋ฅผ ์๊ฐํ๋ฉด โ๋ค
์ด๋ ํธX๋ ๋ง์ดํฌ๋ก์ํํธ๊ฐ ๋ฐํํ ๋ฉํฐ๋ฏธ๋์ด์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌโ๋ผ๊ณ ํ๋ฉด
๋ ๊ฒ์ด๋ค. ๋ค์ด๋ ํธX์ ์๋ ๋ฑ์ฅ ๋ชฉ์ ์ MS ๋์ค ๊ธฐ๋ฐ์ผ๋ก ํ์ฑ๋์ด์๋
๊ฒ์์์ฅ์ ์๋ ๊ธฐ๋ฐ์ผ๋ก ๋๋ฆด ์ ์๋ ๋ฐํ์ ๋ง๋ จํด์ฃผ์๋ ๊ฒ์ด์๋ค. ๋ชจ
๋ ํ๋ก๊ทธ๋จ์ด MS ๋์ค์์ ์๋๋ก ๋์ด๊ฐ ์์ ์์๋ ๊ฒ์๋ง์ MS ๋์ค
๊ธฐ๋ฐ์ผ๋ก ์ ์๋ ์๋ฐ์ ์๋ ์ ์ด ์์๋ค. ์ด๋ ์๋์์๋ ๋น ๋ฅธ ๊ทธ๋ํฝ
์ถ๋ ฅ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด์๋ค. ๋ฌผ๋ก MS ๋์ค์์ ๊ฒ์ ์ ์์๋ ์ปค๋ค๋
๋์ ์ ์์๋ค. ๊ฒ์ ์ ์์ ์ฌ์ฉํ ์ ์๋ ํ์ค ์ธํฐํ์ด์ค๊ฐ ์์๊ธฐ ๋
๋ฌธ์ ๊ทธ๋ํฝ ๋ณด๋๋ ์ฌ์ด๋ ์นด๋, ์ ๋ ฅ ์ฅ์น๋ง๋ค ๋ณ๋์ ๋๋ผ์ด๋ฒ๋ฅผ ์ง์
๋ง๋ค์ด์ผ ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ํ๋์จ์ด๊ฐ ๋ฐํ๋๋ฉด ํด์ผํ ์ผ์ด
๋ง์๋ค.
๋ฐ๋ฉด์ ์๋๋ GDI(Graphic Device Interface)์ MCI(Mul timedia
Control Interface)๋ผ๋ ํ์ค ์ธํฐํ์ด์ค๋ฅผ ํตํด ํ๋ฉด๊ณผ ์ฌ์ด๋ ๋ฑ์ ์ ์ด
ํ ์ ์๋๋ก ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ค์ ์ฌ์ฉ๋๋ ํ๋์จ์ด๊ฐ ๋ฌด์์ธ์ง ๊ฐ๋ฐ์๊ฐ
์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋๋ก ํด์ฃผ์์ง๋ง ๊ฒ์์ ์์ฑ์ ๊ฐ์ฅ ์ค์ํ ์๋๊ฐ ๋
๋ ค์ง๋ ๋จ์ ์ด ์กด์ฌํ์๋ค. ํ ๋ฒ ์์ํด๋ณด๊ธฐ ๋ฐ๋๋ค. ์๋ฌด๋ฆฌ ํ๋ คํ ์ฌ์ด
๋์ ๋คํธ์ํฌ ๊ธฐ๋ฅ๊น์ง ์ง์๋๋คํ๋ค ํ๋ฉด ์๋๊ฐ ๊ตผ๋ฒต์ด ๊ธฐ์ด๊ฐ๋ฏ ํ๋ค
๋ฉด ๋๊ตฌ๋ ์ ๋ป ์ฌ์ฉํ๋ ค ํ์ง ์์ ๊ฒ์ด๋ค.
์๋ ํ๊ฒฝ์ ์ด๋ฐ ๋จ์ ์ ๊ทน๋ณตํ ์ ์๋ API๋ฅผ ๊ฒ์ ๊ฐ๋ฐ์๋ค์๊ฒ ์ ๊ณตํ
์๋ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์ด์ง ๊ฒ์ด ๋ฐ๋ก ๋ค์ด๋ ํธX์ด๋ค. ๋ค์ด๋ ํธX๋ ์๋ ํฅ์
๊ณผ ๊ธฐ๋ฐ ํ๋์จ์ด์ ์๊ด์๋ ๋จ์ผ ์ธํฐํ์ด์ค๋ฅผ ํตํ ํ๋ก๊ทธ๋๋ฐ์ ์ ๊ณตํด
์ฃผ๋, ๋ ๋ง๋ฆฌ์ ํ ๋ผ๋ฅผ ์ก์๋ ๋ชฉ์ ์ ๊ฐ๊ณ ์๋ค.
์ฌ์ค ๋ค์ด๋ ํธX ์ด์ ์๋ WinG๋ผ ํ์ฌ ๋น์ทํ ๋ชฉ์ ์ API๊ฐ ๋ฐํ๋ ์ ์ด ์
์์ผ๋ ํฌ๊ฒ ์ฑ๊ณต์ ๊ฑฐ๋์ง๋ ๋ชปํ์๊ณ ๊ทธ ๋ค์ ๊ฒ์ SDK๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ค
์ด๋ ํธX๊ฐ ๋ฐํ๋์๋ค๊ฐ ์ต์ข ์ ์ผ๋ก ๋ค์ด๋ ํธX๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝ๋์๋ค.
๋ค์ด๋ ํธ๋ผ๋ ๋ง์ด ์๋ฏธํ๋ ๊ฒ์ ํ๋์จ์ด๋ฅผ ์ฐํํ์ฌ ์ ๊ทผํ๋ ๊ฒ์ด ์
๋๋ผ ์ง์ ์ ๊ทผํ ์ ์๋๋ก ํด์ค์ผ๋ก์จ ๋น ๋ฅธ ์๋๋ฅผ ์ ๊ณตํด์ค๋ค๋ ๊ฒ์ด
๋ค. ์ฒ์์ ๋ค์ด๋ ํธX๋ ๊ฒ์ ๊ฐ๋ฐ๋ง์ ์ํ API๋ก ๊ฐ๋ฐ๋์์ง๋ง ์ง๊ธ์ ๋ฉ
ํฐ๋ฏธ๋์ด ๊ด๋ จ ๋ชจ๋ ์์ฉ์ ์ฌ์ฉํ ์ ์๋ ํ์ค API๋ก ๋ฐ์ ํ ์ํ์ด๋ค.
๋ ์ ์ฌ๋ฌ๋ถ๋ ๋ค์ด๋ ํธX๋ฅผ ๊ฒ์ ๊ฐ๋ฐ๋ง์ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ์ ์ง์ง ๋ง
๊ธฐ ๋ฐ๋๋ค. ๋ค์ด๋ ํธX๊ฐ ์งํฅํ๋ ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ค๋ฝ, ๋ฉํฐ๋ฏธ๋์ด, ์ธํฐ๋ท์ ํ๋๋ก
๋ค์ด๋ ํธX๋ฅผ ํตํด ๊ฒ์๊ณผ ๋ฉํฐ๋ฏธ๋์ด ์๋น์ค ๊ฐ๋ฐ์๋ ์๋์์ ์ฅ์ ์ ์
์งํ๋ฉด์ ๋๋ฐ์ด์ค ๋ ๋ฆฝ์ฑ์ด๋ผ๋ ์ฅ์ ์ ์ ์งํ๊ฒ ๋์๋ค. ๋ค์ด๋ ํธX๊ฐ ์ฃผ
๋ ๋ฉํฐ๋ฏธ๋์ด ๊ธฐ๋ฅ์ ์น ์์๋ ์ ์ฉ ๊ฐ๋ฅํ ๋ถ๋ถ์ด ๋ฌด๊ถ๋ฌด์งํ๊ธฐ ๋๋ฌธ
์ ์ ์ด์ ๊ฒ์ ์ ์์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ ์ด๋ฏธ์ง์์ ๋ฒ์ฉ ๋ฉํฐ๋ฏธ๋์ด ์๋น
์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ ๋ณด๋ค ๊ด๋ฒ์ํ ๋ฒ์ฃผ์์ ์ฌ์ฉ๋ ๊ฒ์ด๋ค.
ํ๋์จ์ด ๋ฐ์ ์ ๊ฐ์ํ
๋ค์ด๋ ํธX๋ ๋ณด๋์ ์ด์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ด ์์ ๊ฒฝ์ฐ ์ด๋ฅผ ์ํํธ์จ์ด์ ์ผ๋ก
์ฒ๋ฆฌํ๊ธฐ ๋ณด๋ค๋ ํ๋์จ์ด์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค. ๋ํ ๊ทธ๋ํฝ/์ฌ์ด๋ ๋ณด๋๋
๊ทธ๋ํฝ ๊ฐ์๊ธฐ๋ฅผ ๋ง๋๋ ํ๋์จ์ด ์ ์ฒด(IHV : Independent Hardware
Vendors)์ ์๊ฒฌ์ ์ ๊ทน ์๋ ดํ์ฌ ๋ค์ด๋ ํธX ํ๋์จ์ด ๊ฐ๋ฐ ๊ฐ์ด๋๋ผ์ธ์
๋ง๋ค๊ธฐ ๋๋ฌธ์ ํ๋์จ์ด ๊ธฐ์ ๊ณผ ๋๋ฐ ๋ฐ์ ํ๋ ์์น ํจ๊ณผ๋ฅผ ๋ณ๊ณ ์๋ค. ๋ค
์ด๋ ํธX๋ ํ๋์จ์ด ๊ธฐ๋ฅ์ด ์์ ๊ฒฝ์ฐ ์ด๋ฅผ ์ด์ฉํ๊ณ ์์ ๊ฒฝ์ฐ์๋ง ์ํ
ํธ์จ์ด์ ์ผ๋ก ์ ๋ฎฌ๋ ์ด์ ํ๋ค.
๊ฐ๋ฐ์, ํ๋์จ์ด ์ ์ฒด, ์ฌ์ฉ์ ๋ชจ๋์ ๊ธฐ๋ ์ถฉ์กฑ
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ค์ด๋ ํธX๋ ์ด์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฐ๋ฐ์๋ค์๊ฒ๋ ๊ฐ๋ฐ์ ์ฉ์ดํจ
์ ์ ๊ณตํด์ฃผ๊ณ ํ๋์จ์ด ์ ์ฒด์๊ฒ๋ ๊ธฐ์ ๋ฐ์ ๊ณผ ๋๋ถ์ด ๋ ๋ง์ ๋งค์ถ์
๊ฐ๋ฅ์ผ ํด์ฃผ์์ผ๋ฉฐ ์ฌ์ฉ์๋ค์ ๋ง์กฑํ ๋งํ ์์ค์ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ ์
์๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋์๋ค.
๋ค์ด๋ ํธX์ ๊ตฌ์ฑ
ํ์ฌ ๋ค์ด๋ ํธX๋ ์ฒ์ ๋ฐํํ ๋์ ๋นํด ๊ต์ฅํ ๊ทธ ๊ตฌ์ฑ์ด ๋น๋ํด์ก๋ค.
ํฌ๊ฒ ์์ ๋ ๋ฒจ์ ์๋น์ค๋ฅผ ์ ๊ณตํด์ฃผ๋ ๋ค์ด๋ ํธX ๋ฏธ๋์ด(DirectX Media)
์ ํ์ ๋ ๋ฒจ์ ๊ธฐ๋ฐ์ ์ ๊ณตํด์ฃผ๋ ๋ค์ด๋ ํธX ํ์ด๋ฐ์ด์ (DirectX
Foundation)์ผ๋ก ๊ตฌ์ฑ๋๋ค.
๋จผ์ ๊ธฐ๋ฐ์ด ๋๋ ๋ค์ด๋ ํธX ํ์ด๋ฐ์ด์ ์ ์ดํด๋ณด์. ์ด๋ฅผ ๊ตฌ์ฑํ๋ ์์
๋ค๋ก๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ, ๋ค์ด๋ ํธ ์ธํ, ๋ค์ด๋ ํธ ์ฌ์ด๋, ๋ค์ด๋ ํธ 3D
(Immediate mode), ๋ค์ด๋ ํธ ์ ์ ๋ฑ์ ๋ค ์ ์๋ค. ํ์๊ฐ ์ด๋ฒ ํน์ง์
์ ๋ค๋ฃจ๊ณ ์ ํ๋ ๋ถ๋ถ์ ๋ฐ๋ก ๋ค์ด๋ ํธX ํ์ด๋ฐ์ด์ ์ ๊ทนํ ์ผ๋ถ์ ํด๋นํ
๋ค. ๊ทธ๋งํผ ๋ค์ด๋ ํธX๋ ๋ฐฉ๋ํด์ก๋ค. ๋ค์ด๋ ํธX ํ์ด๋ฐ์ด์ ์ ๊ตฌ์ฑํ๋ ์
์๋ค์ ์ญํ ์ ๋ํด ๊ฐ๋จํ ์์ฝํ๋ฉด ํ 1๊ณผ ๊ฐ๋ค.
๋ค์ด๋ ํธX ํ์ด๋ฐ์ด์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ค์ด๋ ํธX ๋ฏธ๋์ด์๋ ๋ค์ด๋ ํธ ์ผ
์ฐ, ๋ค์ด๋ ํธ ์ ๋๋ฉ์ด์ , ๋ค์ด๋ ํธ 3D(Retained Mode), ๋ค์ด๋ ํธ ํ๋ ์ด
๋ฑ์ด ํฌํจ๋๋ค. VRML์ ๋ํ ์ง์ ์ญ์ ๋ค์ด๋ ํธX ๋ฏธ๋์ด์ ํฌํจ๋๋ค. ๋ค
์ด๋ ํธX ๋ฏธ๋์ด๋ฅผ ๊ตฌ์ฑํ๋ ์์๋ค์ ์ญํ ์ ๋ํด ๊ฐ๋จํ ์์ฝํ๋ฉด ํ 2์
๊ฐ๋ค.
๊ทธ๋ฆผ 1 : ๋ค์ด๋ ํธX์ ๊ตฌ์ฑ
===============================================================
๋ค์ด๋ ํธ ๋๋ก์ฐ(DirectDraw) ๋น ๋ฅธ ์๋์ ๊ทธ๋ํฝ ์ถ๋ ฅ์ ๋ด๋นํ๋ ๊ฐ์ฒด
--------------------------------------------------------------
๋ค์ด๋ ํธ ์ฌ์ด๋(DirectSound) 3D๊น์ง์ ์ฌ์ด๋ ์ถ๋ ฅ๊ณผ ์ฌ์ด๋ ๋ น์์
๋ด๋นํ๋ ๊ฐ์ฒด
---------------------------------------------------------------
๋ค์ด๋ ํธ ์ธํ(Direct Input) ๋ง์ฐ์ค, ํค๋ณด๋, ์กฐ์ด์คํฑ๋ฑ์
์ฅ์น๋ก๋ถํฐ์ ์ ๋ ฅ์ ๋ด๋นํ๋ ๊ฐ์ฒด
---------------------------------------------------------------
๋ค์ด๋ ํธ 3D(Immediate Mode) ์ต์ ํ๋ 3์ฐจ์ ๊ทธ๋ํฝ ์ถ๋ ฅ ์์ง
---------------------------------------------------------------
๋ค์ด๋ ํธ ์ ์ (Direct Setup) ๋ค์ด๋ ํธX ๊ด๋ จ ํ๋ก๊ทธ๋จ์ ์ค์น
ํ๋ก๊ทธ๋จ์ ์์ฑ์ ๋ด๋นํ๋ ๊ฐ์ฒด
===============================================================
ํ 1 : ๋ค์ด๋ ํธX ํ์ด๋ฐ์ด์ ์ ๊ตฌ์ฑํ๋ ์์๋ค์ ์ญํ
๊ทธ๋ฆผ 2 : ๋ค์ด๋ ํธX ํ์ด๋ฐ์ด์ ์ ๊ตฌ์กฐ
๋ค์ด๋ ํธX๋ ์๋ 98์ด๋ ์๋ NT 5.0์์๋ ์ด์์ฒด๊ณ์ ์ผ๋ถ๋ก ์ค์น๋๋ค.
ํ์ง๋ง ์๋ 95์ NT 4.0์์๋ ๋ณ๋๋ก ์ค์นํด์ฃผ์ด์ผ ํ๋ค. ๋ง์ผ ๋ ์ ์ฌ๋ฌ
๋ถ์ PC์ ์๋์ฉ ๊ฒ์์ ์ค์นํ ์ ์ด ์๋ค๋ฉด ๋ค์ด๋ ํธX๊ฐ ์ค์น๋์ด ์์
๊ฒ์ด๋ค(๊ฒ์์ ์ค์นํ ๋ ๊ฐ์ด ์ค์น๋์์ ๊ฒ์ด๋ค). ๋ค์ด๋ ํธX๊ฐ ์ค์น๋
์ง ์์๊ฑฐ๋ ์ด์ ๋ฒ์ ์ ๋ค์ด๋ ํธX๊ฐ ์ค์น๋์ด ์๋ค๋ฉด ์น์ฌ์ดํธ
(http://www.microsoft.com/directx)๋ ๊ตญ๋ด ํต์ ๋ง์ ํตํด ๋ค์ด๋ก๋๋ฐ์
์ ์์ ๊ฒ์ด๋ค. ์ฌ์ค ๋ค์ด๋ ํธX์ ์ค์น๋ ๊ฝค ๊น๋ค๋ก์ด ํธ์ธ๋ฐ ๋ค์ด๋ ํธ ์
์ ์ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ์ค์น ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์๋ค.
===============================================================
๋ค์ด๋ ํธ์ผ์ฐ ํ์ผ์ด๋ ์ธํฐ๋ท์์ ์๋ฒ๋ก๋ถํฐ์ ๋์์๋ฑ์
(DirectShow) ํ๋ ์ด๋ ๋ นํ๋ฅผ ๋ด๋นํ๋ ๊ฐ์ฒด
---------------------------------------------------------------
๋ค์ด๋ ํธ ์ ๋๋ฉ์ด์ DHTML๊ณผ ํตํฉ๋์ด ์น ํ์ด์ง์์์ ์ ๋๋ฉ์ด์
์ (DirectAnimation) ์ ๊ณตํด์ฃผ๋ ๊ฐ์ฒด
---------------------------------------------------------------
๋ค์ด๋ ํธ3D 3์ฐจ์ ํ๊ฒฝ์์์ ์ ๋๋ฉ์ด์ ์ ์ฝ๊ฒ ํด์ฃผ๋ ๊ฐ์ฒด(Retained
Mode ๋ค์ด๋ ํธ ํ๋ ์ด ๋คํธ์ํฌ๋ ๋ชจ๋์ ํตํ ๋ฉํฐ ์ฌ์ฉ์ ๊ฒ์์ ์ฝ๊ฒ
(DirectPlay) ํด์ฃผ๋ ๊ฐ์ฒด
===============================================================
ํ 2 : ๋ค์ด๋ ํธX ๋ฏธ๋์ด๋ฅผ ๊ตฌ์ฑํ๋ ์์๋ค์ ์ญํ
๊ทธ๋ฆผ 3 : ๋ค์ด๋ ํธX ๋ฏธ๋์ด์ ๊ตฌ์กฐ
๋ค์ด๋ ํธX์ COM
์ ์๊ณ ์๋ฏ์ด ๋ค์ด๋ ํธ X ๊ตฌ์ฑ ์์๋ค์ ๋ชจ๋ COM ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ
๊ณ ์๋ค. ์ด COM์ ๋ง์ดํฌ๋ก์ํํธ์์ ์ ์ํ ๋ฐ์ด๋๋ฆฌ ํ์ค ์ธํฐํ์ด์ค
์คํ์ผ๋ก์ ๋ฐ์ด๋ ํ์ฅ์ฑ์ ์ ๊ณตํ๋ ๊ธฐ๋ฐ์ด ๋๊ณ ์๋ค. ๊ฒฐ๊ตญ ๋ค์ด๋ ํธ X
๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด COM์ ๋ํ ์ง์์ด ํ์ํ๋ค. ๊ทธ๋ ๋ค๊ณ ์์ฃผ ์ด๋ ค์ด ๊ฒ
์ ์๋๋๊น ๊ฑฑ์ ํ ํ์๋ ์๋ค. COM ํ๋ก๊ทธ๋๋ฐ์ ๋ ๊ฐ์ง ์ข ๋ฅ๊ฐ ์
๋ค. ํ๋๋ COM ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ํ๋ก๊ทธ๋๋ฐ์ด๊ณ ๋๋จธ์ง ํ๋๋ ๋จ์ด ๋ง๋ค
์ด ๋์ COM ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ์ด๋ค. ์ ์๋ฅผ COM ์๋ฒ ํ๋ก๊ทธ๋
๋ฐ์ด๋ผ๊ณ ํ๊ณ ํ์๋ฅผ COM ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ํ๋ค. ์ ์๋ ์
๋นํ ๊น๋ค๋กญ๊ณ ์ด๋ ต๊ณ ํ๋ค๊ณ ๋ฐ๋ถํ์ง๋ง ํ์๋ ๊ทธ๋ฆฌ ๋ณต์กํ๊ฑฐ๋ ์ด๋ ต์ง
์๋ค. ๋ค์ด๋ ํธX์ ๊ตฌ์ฑ ์์๋ค์ COM ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ๊ทธ ์ด์ผ๊ธฐ
๋ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๋ COM ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋จ์ ์ ์ํ ๋
ํ์ํ๋ค๋ฉด ๊ฐ๋ค ์ฐ๊ธฐ๋ง ํ๋ฉด ๋๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ๋ค์ด๋ ํธX ํ๋ก๊ทธ๋๋ฐ
์ COM ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋๋ฐ์ด ๋๊ธฐ ๋๋ฌธ์ COM์ ๋ํ ๋ง์ ์ง์์ ํ
์๋ก ํ์ง ์๋๋ค.
์๋ COM ํ๋ก๊ทธ๋๋ฐ์์ ์ด๋ค COM ๊ฐ์ฒด๊ฐ ์ ๊ณตํด์ฃผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉ
ํ๋ ค๋ฉด ๊ทธ ๊ฐ์ฒด์ CLSID๋ ProgID๋ฅผ ์์์ผํ๋ค. ๊ทธ ๋ค์์ผ๋ก ๊ทธ๊ฒ์ ํด๋
์คํฉํ ๋ฆฌ(IClassFactory) ์ธํฐํ์ด์ค๋ฅผ ์ป์ด์ ๊ฐ์ฒด๋ฅผ ํ๋ ์์ฑํ๋ฉด์
์ง์ ํ ์ธํฐํ์ด์ค์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ป์ ์ ์๋ค. ๋ชจ๋ COM ์ธํฐ
ํ์ด์ค๋ IUnknown์ผ๋ก ๊ณ์น๋๋ฏ๋ก QueryInteface, AddRef, Release ๋ฑ์
๋ฉ์๋ ํธ์ถ์ ํตํด ๋ค๋ฅธ ๊ด๋ จ ์ธํฐํ์ด์ค์ ๋ํ ํฌ์ธํฐ๋ ์ป์ ์ ์๊ณ
๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ์์์ ์ ๊ฑฐ๋ ํด์ค ์ ์๋ค. COM ํ๋ก๊ทธ๋๋ฐ์ ๋ํ ์ง์์ด
์๋ ์ฌ๋์ด ์์ ๋ง์ ์ฝ์ด๋ณด๋ฉด ๋ฌด์จ ์๋ฆฌ์ธ์ง ์ดํด๊ฐ ์ ๊ฐ ๊ฒ์ด๋ค. ๋ค์ด
๋ ํธX ๊ฐ์ฒด๋ค์ด ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ฅ๋ค์ ์ด์ฉํ ๋๋ ์๋๋ ์์ ๊ฐ์ ์ ์ฐจ
๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค. ํ์ง๋ง ๊ฐ๋ฐ์์ ํธ์๋ฅผ ์ํด ์ด๋ฐ ๊ฒ์ ์ ๋ชฐ๋ผ๋ ์ํ
๋ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํด์ฃผ๋ ๋์ฐ๋ฏธ ํจ์๋ค(Helper Function)์ด ์ ๊ณต๋๊ธฐ
๋๋ฌธ์ ํฐ ๊ฑฑ์ ์ ํ ํ์๋ ์๋ค.
๋ค์ด๋ ํธX๋ COM์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ํ์ฅ์ฑ์ด ๋ฐ์ด๋๋ค. ์๋ฌด๋ฆฌ ํ์ฅ
์ฑ์ด ๋ฐ์ด๋๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด ์ ์ง๋์ง ์๋๋ค๋ฉด ๋ณ ์๋ฏธ๊ฐ ์
์ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค๋ณด๋ฉด
IDirectDrawSurface2๋ฅผ ๋ณผ ์ ์๋ค. ์ด์ฐฝ๊ธฐ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ
๋ก๊ทธ๋๋ฐ์ ํ ์ฌ๋๋ค์ IDirectDrawSurface๋ง ๋ณด์์ ๊ฒ์ด๋ค. 2๊ฐ ๋ถ
์์ผ๋๊น ๋ฌด์์ธ๊ฐ ๊ฐ์ ๋ ๋ฒ์ ์ด๋ ๋๋์ ๋ค ๊ฒ์ด๋ค. ๋ค์ด๋ ํธX์์๋ ์ด
๋ค ์ธํฐํ์ด์ค์ ๊ธฐ๋ฅ์ ์ถ๊ฐ๊ฐ ํ์ํ๋ฉด ๊ธฐ์กด์ ์ธํฐํ์ด์ค๋ ๊ทธ๋๋ก ๋
๋ ์ฑ ์๋ก์ด ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด๋ธ๋ค.
๊ทธ๋์ ์ด์ ์ ๋ง๋ค์ด์ง ํ๋ก๊ทธ๋จ๋ค์ ์๋ ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด ๋์
ํ๊ณ ์๋ก ๋ง๋ค์ด์ง๋ ํ๋ก๊ทธ๋จ๋ค์ ์๋ก ์ถ๊ฐ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด ๋ง๋ค
์ด ์ง ์ ์๋๋ก ํ๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๋ค์ด๋ ํธX๋ง์ด ๊ฐ๋ ํน์ง์ด ์๋๊ณ
๋ฐ๋ก COM์ ํน์ง์ด๋ค.
- the end of this article -
DirectX Programming (2)
๋ค์ด๋ ํธ ๋๋ก์ฐ ์ค์ ํ๋ก๊ทธ๋๋ฐ
์ด์ ๋ถํฐ ์ค์ ๋ก ํ๋ก๊ทธ๋๋ฐ์ ๋ค์ด๊ฐ๋๋ก ํ๊ฒ ๋ค.
๋จผ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ์ด์ฉํ ์์ ํ๋ก๊ทธ๋จ์ ํ๋ ์์ฑํด๋ณด๊ณ ๋ค์์ผ
๋ก ๋ค์ด๋ ํธ ์ฌ์ด๋๋ฅผ ์ด์ฉํ ์์ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด๋๋ก ํ๊ฒ ๋ค.
๋ค์ด๋ ํธ ๋๋ก์ฐ ์ค์ ํ๋ก๊ทธ๋๋ฐ
๋ค์ด๋ ํธ ๋๋ก์ฐ๋ ?
๋ค์ด๋ ํธX๋ ์๋ 95๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒ์ ์ ์์ ์ํด ๊ตฌํ๋์์ผ๋ฉฐ ๋ฌด์
๋ณด๋ค๋ ์๋ ํฅ์์ ๊ทธ ๋ชฉ์ ์ ๋๊ณ ์๋ค. ๋ค์ด๋ ํธX์์ ๊ฐ์ฅ ํฐ ๋น์ค์
์ฐจ์งํ๊ณ ์๋ ๊ฒ์ด ๋ฐ๋ก ์ฌ๊ธฐ์ ์ค๋ช ํ ๋ค์ด๋ ํธ ๋๋ก์ฐ์ด๋ค. ๊ทธ๋ด๋ฏํ ๊ฒ
์์ ์ ์ํ๋ ค๋ฉด ํ๋ฉด ์ถ๋ ฅ ์๋๊ฐ ๋น ๋ฅด์ง ์๊ณ ์๋ ๋ง์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ค
์ด๋ ํธ ๋๋ก์ฐ๊ฐ ์ฌ์ค์ ๋ค์ด๋ ํธX์ ํต์ฌ์ด๋ผ๋๋ฐ ์ด๊ฒฌ์ ์ ์ํ ๊ฐ๋ฐ์
๋ ์๋ง ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฆผ 4 : ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ๊ตฌ์กฐ
๋ค์ด๋ ํธ ๋๋ก์ฐ๋ ํ๋ง๋๋ก ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์๋ก ์๋ GDI์ ํธํ์ ์
์งํ๋ฉด์ ์ง์ ๋์คํ๋ ์ด ๋๋ฐ์ด์ค์ ์ ๊ทผํ ์ ์๋ ์ํํธ์จ์ด ์ธํฐํ
์ด์ค๋ผ๊ณ ํ ์ ์๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ฅผ ํตํด ๊ฒ์ ๊ฐ๋ฐ์๋ค์ ์ด์ ๋ ์ด
์ ์๋ง์ ํ๋์จ์ด ๋๋ผ์ด๋ฒ ์ธํฐํ์ด์ค๋ฅผ ๋ง์ถ๋ ์์ ์ ํ์ง ์๊ณ ๋ GDI
๋ฅผ ๊ฑฐ์น์ง ์๋ ํ์๋ ๋ฒจ API๋ก ํ๋์จ์ด๋ฅผ ์ง์ ์ ์ดํ ์ ์๊ฒ ๋์๋ค.
์ฆ ๊ทธ๋ํฝ ๋๋ฐ์ด์ค์ ์๊ด์์ด, ๋ ์๋ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ ๊ณ์ธต์ ๊ฑฐ์น
์ง ์๊ธฐ ๋๋ฌธ์ ๋ณด๋ค ๊ฐ๋จํ๊ฒ ๊ทธ๋ํฝ ๋ฃจํด์ ๊ตฌํํ ์ ์๊ณ ๋น ๋ฅธ ์ฒ๋ฆฌ
์๋๋ฅผ ๊ธฐ๋ํ ์ ์๊ฒ ๋์๋ค.
ํนํ ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ ํ๋์จ์ด ๊ฐ์์ ๊ดํ ๋ง์ ๊ธฐ๋ฅ์ ๋ถ์ฌํ๊ณ ์
๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ ํ๋์จ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ ์๋จ์ผ
๋ก HAL (Hardware Abstraction Layer)์ด๋ ๋ชจ๋์ ์ฌ์ฉํ๋ค. ์ฌ์ฉํ๊ณ
์ ํ๋ ๊ธฐ๋ฅ์ด ํ๋์จ์ด์ ์๋ ๊ฒ์ด๋ผ๋ฉด ๊ทธ๊ฒ์ ์ด์ฉํ๊ณ ๋ง์ผ ์๋ค๋ฉด
์ํํธ์จ์ด์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๊ณ ์ฑ๋ฅ์ ํ๋์จ์ด์์๋ ๋ ๋น ๋ฅด๊ณ
์ ํํ๊ฒ ๊ธฐ๋ฅ์ด ๊ตฌํ๋๊ณ ์ฑ๋ฅ์ด ์ข์ง ์์ ํ๋์จ์ด์์๋ ์ํ๋ ๊ธฐ๋ฅ
์ด ๋์ํ๋ค.
์ด๋ ๊ฒ ํ๋์จ์ด์ ์ผ๋ก ์ง์๋์ง ์๋ ๊ธฐ๋ฅ์ ์ํํธ์จ์ด์ ์ผ๋ก ๊ตฌํํ๊ธฐ
์ํด HEL(Hardware Emulation Layer)์ด๋ผ๋ ๋ชจ๋์ด ์ง์๋๋ค. ๊ฐ๋จํ ์ ๋ฆฌ
ํด ๋ณด๋ฉด ๋ค์ด๋ ํธX์ ๋ฑ์ฅ๊ณผ ๋ฐ์ ์ผ๋ก ์ธํด ๊ฑฐ์ ์๋ฒฝํ ํ๋์จ์ด ๋ ๋ฆฝ์ฑ
์ด ๊ฐ๋ฅํด์ก๊ณ ์ด ๋๋ฌธ์ ๊ฒ์ ๊ฐ๋ฐ์๋ค์ด ๋ ์ด์ ์์ ๋ง์ ๋ ์์ ์ธ ๋๋ผ
์ด๋ฒ๋ฅผ ์ ์ํ ํ์๊ฐ ์์ด์ ธ ๊ฒ์ ์ ์ ๊ณ ์ ์ ์์ ์ ๋ชฐ๋ํ ์ ์๊ฒ ๋
์๋ค๋ ์๋ฏธ๋ก ๋ฐ์๋ค์ด๋ฉด ๋๋ค.
์ฉ์ด ์ ๋ฆฌ ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ฅผ ์ด์ฉํ ํ๋ก๊ทธ๋๋ฐ์ ๋ค์ด๊ฐ๊ธฐ์ ์์ ๋ช ๊ฐ
์ง ์์๋์ด์ผ ํ ์ฉ์ด๋ค๊ณผ ๊ฐ๋ ์ด ์๋ค. ์ผ๋จ ๊ทธ๊ฒ๋ถํฐ ์ ๋ฆฌํ๊ณ ๋ค์ด๊ฐ
๋๋ก ํ๊ฒ ๋ค.
๋น๋์ค ๋ชจ๋๋น๋์ค ๋ชจ๋๋ ํ๋ฉด์ ํด์๋์ ํํ ๊ฐ๋ฅํ ์์์๋ฅผ ๋งํ
๋ค. ๋จผ์ ํด์๋์ ๋ํด ์ธ๊ธํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํด์๋๊ฐ ๋ํ์ ์ธ ํด์๋๋ค
์ด๋ค.
320ร200, 320ร240, 640ร400, 640ร480, 800ร600,
1024ร768, 1280ร1024, 1600ร1200
ํ์ฌ ๊ฒ์ ํ๊ฒฝ์ผ๋ก ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํด์๋๋ 320ร200๊ณผ 640ร480์ด
๋ค. ์์ ํ๋ก๊ทธ๋จ์์๋ 640ร480์ ์ฌ์ฉํ ๊ฒ์ด๋ค. ํํ ๊ฐ๋ฅํ ์์์
๋ ๊ฒฐ๊ตญ ํ ์ ์ ์์์ ํํํ๊ธฐ์ํด ์ด๋ค ๋ฐฉ๋ฒ์ ์ฐ๋๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง
๋ค. ์ฌ๊ธฐ์๋ ํฌ๊ฒ ์ธ๋ฑ์ค ๋ชจ๋์ RGB ๋ชจ๋๊ฐ ์๋ค. ์ธ๋ฑ์ค ๋ชจ๋๋ ๋ณ๋
์ ์์ ํ ์ด๋ธ์ ๋๊ณ ๊ฑฐ๊ธฐ์ ์์์ RGB๋ก ์ ์ํด ๋ ๋ค์ ์ด ํ ์ด๋ธ์
์ ์ธ๋ฑ์ค๋ก ํ ์ ์ ์์์ ํํํ๋ ๊ฒ์ด๋ค. ๋๋ฆฌ ์ฌ์ฉ๋๋ ์์ ํํ ๋ฐฉ
๋ฒ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ์๋ค.
- 1, 2, 4, 8๋นํธ ์ธ๋ฑ์ค ๋ชจ๋
- 16๋นํธ(64K๊ฐ์ ์์) โํ์ด ์ปฌ๋ฌ(High Color)โ ๋ชจ๋
- 24๋นํธ(16.7M๊ฐ์ ์์) โํธ๋ฃจ ์ปฌ๋ฌ(True Color)โ ๋ชจ๋
- 32๋นํธ RGBA ๋ชจ๋
8๋นํธ ์ธ๋ฑ์ค ๋ชจ๋๋ 256๊ฐ์ ์์์ ํํํ ์ ์๋ ๋ชจ๋๋ก ํํ 256์ปฌ๋ฌ
๋ชจ๋๋ผ๊ณ ํ๋ค. ์ฆ ํ ์ ์ ๋ํ๋ด๋๋ฐ 8๋นํธ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ด ๊ฐ์ ์ปฌ๋ฌ ํ
์ด๋ธ์์์ ์ธ๋ฑ์ค๊ฐ ๋๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด 8๋นํธ ๋ชจ๋์์ ์ด๋ค ์ ์
๊ฐ์ด 5์๋ค๋ฉด ๊ทธ ์ ์ ์ค์ ์์์ ์์์ ํ ์ด๋ธ์ 5๋ฒ์งธ ํญ๋ชฉ์ ์ด๋ค ๊ฐ
์ด ๋ค์ด์๋์ง๋ฅผ ๋ด์ผ๋ง ์ ์ ์๋ค. ์ธ๋ฑ์ค ๋ชจ๋๋ฅผ ํ๋ ํธ(Palette) ๋ชจ๋
๋ผ๊ณ ํ๊ธฐ๋ ํ๋ค.
ํ๋ ํธ๋ ์์์ ์ปฌ๋ฌ ํ ์ด๋ธ์ ๋งํ๋ค.
===============================================================
์ธ๋ฑ์ค ๋ชจ๋์ ์ฅ์
1) ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฐจ์งํ๋ค. ๋ฌผ๋ก ๊ทธ ๋งํผ ํํ๊ฐ๋ฅํ ์์์ ์๋ ์ค
์ด๋ ๋ค.
2) ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฐจ์งํ๋ ๋งํผ ์ถ๋ ฅ ์๋๊ฐ ๋น ๋ฅด๋ค.
3) ์์ ํ ์ด๋ธ์ ๋ด์ฉ์ ๋ณ๊ฒฝํ์ฌ ์ฌ๋ฌ ๊ฐ์ง ํจ๊ณผ๋ฅผ ๋ผ ์ ์๋ค. ์
์ ํ ์ด๋ธ์ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ฉด ๊ทธ ๊ฒ์ด ๋ฐ๋ก ํ๋ฉด์ ๋ฐ์๋๊ธฐ ๋
๋ฌธ์ด๋ค. ์ด๋ฅผ ์ด์ฉํด ํ์ด๋์ธ(fade-in)์ด๋ ํ์ด๋์์(fade-out)
ํจ๊ณผ๋ฅผ ๋ผ ์ ์๋ค.
===============================================================
โํ์ด ์ปฌ๋ฌโ๋ชจ๋๋ ํ๋์ ์์์ ํํํ๋๋ฐ 16๋นํธ๋ฅผ ์ฌ์ฉํ๋ค. RGB๋ก
์์์ ํํํ๋๋ฐ R, G, B ๊ฐ๊ฐ์ 5๋นํธ, 6๋นํธ, 5๋นํธ์ฉ์ ํ ๋นํ๋ค. 24
๋นํธ ๋ชจ๋๋ R, G, B ๊ฐ๊ฐ์ 8๋นํธ์ฉ์ ํ ๋นํ๋ค. 32๋นํธ RGBA ๋ชจ๋๋ R,
G, B ๊ฐ๊ฐ์ 8๋นํธ์ฉ์ ํ ๋นํ๊ณ ๋ง์ง๋ง ํ ๋ฐ์ดํธ๋ก ๋ถํฌ๋ช ๋๋ฅผ ๋ํ๋ธ
๋ค. ํ ์ ์ ํํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋นํธ์๊ฐ ๋ง์ผ๋ฉด ๋ง์์๋ก ์ข๊ฒ ์ง๋ง
๊ทธ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฐจ์งํ๊ฒ ๋๋ค. ์์ ํ๋ก๊ทธ๋จ์์๋ 8๋นํธ ์ธ๋ฑ์ค
๋ชจ๋๋ฅผ ์ฌ์ฉํด๋ณด๊ฒ ๋ค.
๋นํธ๋งต
์ปดํจํฐ ์์์ ์ ์ ๋ฐฐ์ด ํํ๋ก ์ ์ฅ๋๋ ์ด๋ฏธ์ง๋ฅผ ๋งํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก
์ปดํจํฐ์์ ๋ชจ๋ ๊ทธ๋ฆผ์ ๋นํธ๋งต์ด๋ผ๊ณ ํ ์ ์์ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ๋นํธ๋งต
์ BMP ํ์ผ ํ์์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ ์๋๋ค.
์คํ๋ผ์ดํธ(Sprite)
ํฌ๋ช ํ ์์ญ์ด ์กด์ฌํ๋ค๋ ์ ๋ง ์ ์ธํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํธ๋งต๊ณผ ๊ฐ๋ค. ์ค
ํ๋ผ์ดํธ๋ ๊ฒ์์์ ์์ฃผ ์ค์ํ ์์์ด๋ค. ๊ฒ์์ ๋ฐฐ๊ฒฝ ํ๋ฉด ์์์ ์์ง
์ด๋ ๋ชจ๋ ๊ฒ๋ค์ ์คํ๋ผ์ดํธ๋ก ๋ง๋ค์ด์ ธ์ผ ํ๋ค.
๋ง์ผ ์์ง์ด๋ ๊ฒ์ด ์ฌ๊ฐํ ๋ชจ์์ด๋ผ๋ฉด ์คํ๋ผ์ดํธ๋ก ๋ง๋ค ํ์๊ฐ ์์ง๋ง
์๋ฅผ ๋ค์ด ์ฌ๋์ด๋ผ๋ฉด(์์ ํ ๋ค๋ชจ๋ ์ฒดํ์ ์ฌ๋์ด ์๋๋ผ๋ฉด) ๊ทธ๋ฅ ๋ฐฐ๊ฒฝ
์์ ๋ฎ์ด์จ์ง ๊ฒฝ์ฐ ๊ฒน์ณ์ง๋ ๋ถ๋ถ์ ๋ฐฐ๊ฒฝ ํ๋ฉด์ด ์ง์์ ธ ๋ฒ๋ฆฐ๋ค. ๊ทธ๋์
์คํ๋ผ์ดํธ์๋ ํฌ๋ช ์์ญ์ด ์ฃผ์ด์ง๋๋ฐ ์ด๋ ๋๊ฐ ํน์ ์์์ ์ง์ ํด ์ด
๊ฒ์ด ์ฌ์ฉ๋๋ฉด ํฌ๋ช ์์ญ์ผ๋ก ์ธ์ํ๋ค. ์ด๋ฐ ์ฉ๋์ ์์์ ๋ค์ด๋ ํธ
๋๋ก์ฐ์์๋ ์ปฌ๋ฌํค(Color Key)๋ผ๊ณ ํ๋ค. ์ฌ๊ธฐ์๋ ์์ค ์ปฌ๋ฌํค
(Source color key)๊ฐ ์๊ณ ํ๊ฒ ์ปฌ๋ฌํค(Destination color key)๊ฐ ์๋
๋ฐ ์ด์ ๋ํด์๋ ๋ค์์ ์์ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณผ ๋ ๋ค์ ์ค๋ช ํ๋๋ก
ํ๊ฒ ๋ค.
๊ทธ๋ฆผ 5 : ์คํ๋ผ์ดํธ
์คํ๋ผ์ดํธ๋ฅผ ์ด์ฉํ ์ ๋๋ฉ์ด์ ์์ ์ค์ํ ์ผ ๋ ๊ฐ์ง๋ ๋ค์๊ณผ ๊ฐ๋ค.
๊ฒฝ๊ณ ๊ฒ์ฌ(Bounds checking)
์คํ๋ผ์ดํธ์ ์ด๋ ์์ญ์ ์ ํํ๋ ๊ฒ์ ๋งํ๋ค. ์ด๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ
์์ ์ง์ ์ง์๋์ง ์๋ ์๋น์ค๋ก ๊ฐ๋ฐ์๊ฐ ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก
ํ์ฌ ์ง์ ๊ตฌํํด์ผ ํ๋ค.
์ถฉ๋ ๊ฒ์ฌ(Collision detection)
ํ๋ ์ด์์ ์คํ๋ผ์ดํธ๊ฐ ์ถฉ๋ํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฐ์งํ๋ ์ ์ฐจ๋ฅผ ๋งํ๋ค.
์ด ์ญ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ์์ ์ง์ ์ง์๋์ง ์๋ ์๋น์ค๋ก ๊ฐ๋ฐ์๊ฐ ๋ค์ด
๋ ํธ ๋๋ก์ฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์ง์ ๊ตฌํํด์ผ ํ๋ค.
๋๋ธ ๋ฒํผ๋ง(Double Buffering)
๊ฒ์์ด๋ ์ด๋ค ์์ฉํ๋ก๊ทธ๋จ์์์ ์ ๋๋ฉ์ด์ ์ ์ํํด์ผ ํ๋ค๋ฉด ์ฌ๋ฌ
๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค. ๊ฒ์์ ๋ง์น ์ํ์ฒ๋ผ ์๊ฐํด๋ณด์. ์ํ๋
๊ฐ ์ฅ๋ฉด์ฅ๋ฉด(์ด๋ฅผ ํ๋ ์์ด๋ผ ํ๋ค)์ ๊ณ์์ ์ผ๋ก ์ดฌ์ํ์ฌ ์ด๋ฅผ ์ฌ์ํ
๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค. ์ฆ, ์ํ์์์ ์์ง์ด๋ ๋์๋ค๋ ์๊ณ ๋ณด๋ฉด ์ ์ง ํ
๋ฉด์ด ๊ณ์์ ์ผ๋ก ๋ฟ๋ ค์ ธ ์์ง์ด๋ ๋ฏํ ํจ๊ณผ๋ฅผ ๋ด๋ ๊ฒ์ด๋ค. ๋ฐ๋ก ์ฌ๋ ๋
์ ์์ ํจ๊ณผ๋ฅผ ์ด์ฉํ ๊ฒ์ด๋ค. ์์ ํจ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด 1์ด์ ํ๋ ์์ด ์ ์ด
๋ 30๊ฐ ์ด์์ ์์ด์ผ ํ๋ค.
๊ฒ์์์์ ์ ๋๋ฉ์ด์ ๋ ๋ง์ฐฌ๊ฐ์ง ์๋ฆฌ์ด๋ค. ๋ฐฐ๊ฒฝ ํ๋ฉด์์ ์บ๋ฆญํฐ๋ค์
๊ทธ๋ ค๋๊ณ ๊ทธ ๊ฒ๋ค์ ์์น๋ฅผ ์กฐ๊ธ์ฉ ๋ณ๊ฒฝํด๊ฐ๋ฉฐ ์ฃผ๊ธฐ์ ์ผ๋ก(1์ด์ 30๋ฒ ์ด
์) ๋ฐ๋ณตํ์ฌ ๊ทธ๋ ค์ฃผ๋ฉด ๋ณด๋ ์ฌ๋ ์ ์ฅ์์๋ ์์ง์ด๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
์ด ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ฒ์ด ๋ฐ๋ก ๋๋ธ ๋ฒํผ๋ง์ด๋ค. ๋ค์ด๋ ํธ ๋
๋ก์ฐ๋ ๋๋ธ ๋ฒํผ๋ง์ ์ฌ์ฉํ์ฌ ์ ๋๋ฉ์ด์ ์ ์ํํ๋ค. ์ฌ๊ธฐ์๋ ํฌ๊ฒ ๋
๊ฐ์ง ๋ฐฉ์์ด ์๋ค. ์ฒซ ๋ฒ์งธ ๋ฐฉ์์ ์คํ์คํฌ๋ฆฐ ๋ฉ๋ชจ๋ฆฌ(๋น๋์ค ๋ฉ๋ชจ๋ฆฌ๊ฐ ์
๋ ์ผ๋ฐ ๋ฉ๋ชจ๋ฆฌ)์ ๋ค์ ์ฅ๋ฉด์ ๋ค ๊ทธ๋ ค๋๊ณ ์ด๋ฅผ ํ ๋ฒ์ ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ
๋ก ๋ณต์ฌํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ก ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ๋ก ์จ๋ฃ์ผ๋ฉด ๋ฐฐ๊ฒฝ ๋นํธ๋งต์ด ์ถ๋ ฅ๋๊ณ ๊ฐ๊ฐ์ ์คํ๋ผ์ด
ํธ๊ฐ ์ถ๋ ฅ๋๋ ๊ณผ์ ์ด ๋ณ๋๋ก ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ๋ณด๊ธฐ์๋ ๊น๋นก์ด
๋ ๋ฏํ ํ์์ด ๋ฐ์ํ๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ์ํด ์ผ๋จ ๋ฉ๋ชจ๋ฆฌ์ ๋ณ๋ ์์ญ์
์ถ๋ ฅ์ ๋ค ๋ด๋ณด๋ธ ๋ค์ ์ด๋ฅผ ํ ๋ฒ์ ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํ๋ ๊ฒ์ด๋ค. ์ด
๋ ์ผ๋ฐ ์์คํ ๋ฉ๋ชจ๋ฆฌ์ ๋ด์ฉ์ ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํ๋ ๊ฒ์ ์ํํธ์จ
์ด์ ์ผ๋ก ํด๊ฒฐํ๋ ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ค์ ์๋๊ฐ ๋๋ฆฌ๋ค.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ๊ณผ ๊ฐ๋ ์ ์ผ๋ก ๋์ผํ๋ฐ ํ๋์จ์ด์ ๊ธฐ๋ฅ์
์ด์ฉํ๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๋ ๋น ๋ฅด๋ค. ์ด ๋ฐฉ๋ฒ์ ํ์ด์ง ํ๋ฆฝํ(Page
Flipping)์ ์ด์ฉํ๋ ๊ฒ์ด๋ค. ๋จผ์ ๋ ๊ฐ์ ํ์ด์ง๋ฅผ ๋ง๋ ๋ค. ์ฒซ ํ์ด
์ง๋ฅผ ์ ์ ๋ฒํผ(Front Buffer)๋ผ ํ๊ณ ๋ค๋ฅธ ํ ํ์ด์ง๋ฅผ ํ์ ๋ฒํผ(Back
Buffer)๋ผ ํ๋ค. ์ ์ ๋ฒํผ๋ ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ์ ์์นํ์ฌ ํ๋ฉด์ผ๋ก ์ถ๋ ฅ๋
๋ ๋ด์ฉ์ ๋ด๋๋ค. ํ์ ๋ฒํผ๋ ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ(๊ฐ๋ฅํ๋ค๋ฉด)๋ ์์คํ ๋ฉ๋ชจ
๋ฆฌ์ ์์นํ์ฌ ์์ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์์์ ์คํ์คํฌ๋ฆฐ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ์ญํ
์ ์ํํ๋ค. ์ด๋ ๊ฒ ๋ ๊ฐ์ ํ์ด์ง๋ฅผ ๋ง๋ ๋ค์ ํ์ ๋ฒํผ์ ๋ค์ ์ฅ๋ฉด
์ ๋ค ๊ทธ๋ฆฌ๊ณ ๋์ ํ๋์จ์ด์ ํ์ด์ง ํ๋ฆฝํ ๋ช ๋ น์ ๋ด๋ฆฌ๋ฉด ๋ ๊ฐ์ ํ์ด
์ง๊ฐ ๊ต์ฒด๋๋ค. ์ฆ, ํ์ ๋ฒํผ๊ฐ ์ ์ ๋ฒํผ๊ฐ ๋๊ณ ์ ์ ๋ฒํผ๊ฐ ํ์ ๋ฒํผ
๊ฐ ๋๋ค. ๊ฒฐ๊ตญ ํ์ ๋ฒํผ์ ์จ๋ฃ์ ๋ด์ฉ์ด ํ๋ฉด์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค.
์ด๋ ํ๋์จ์ด์ ์ผ๋ก ํ๋ฉด์ ๋ฟ๋ฆด ๋ด์ฉ์ ์ฝ์ด์ฌ ์ฃผ์๋ง ๋ฐ๊ฟ๋ฒ๋ฆฌ๋ ํ์
์ด๊ธฐ ๋๋ฌธ์ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋นํด ํจ์ฌ ๋ ๋น ๋ฅด๋ค. ์ด๋ ๊ฒ ํ์ด์ง๋ฅผ ๊ต์ฒด
ํด๋ฒ๋ฆฌ๋ ๊ฒ์ ํ์ด์ง ํ๋ฆฝํ์ด๋ผ ํ๋ค.
===============================================================
๋น๋์ค ๋ฉ๋ชจ๋ฆฌ
๋น๋์ค ๋ฉ๋ชจ๋ฆฌ๋ ๋ชจ๋ํฐ๋ก ์ถ๋ ฅ๋ ๋ด์ฉ์ด ๋ค์ด๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋งํ๋ค.
์ด ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ด์ฉ์ด ์ฝ๊ฐ์ ์ฐจ์ด๋ ์์ง๋ง ๋๋ต 1์ด์ 70ํ ์ ๋ ๋ฐ
๋ณต์ ์ผ๋ก ๋ชจ๋ํฐ๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค.
===============================================================
๋ค์ด๋ ํธ ๋๋ก์ฐ์์๋ ์ด ๋ ๊ฐ์ง ๋ฐฉ์์ ๋ชจ๋ ์ง์ํ๋ค. ๋ค์ด๋ ํธ ๋๋ก
์ฐ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ ์๋ ๋ชจ๋๋ ํ์คํฌ๋ฆฐ ๋ชจ๋๋ก ๋์ํ ์ ์๋ค.
์๋ ๋ชจ๋๋ ์ฌํ ๋ค๋ฅธ ์๋ ํ๋ก๊ทธ๋จ์ฒ๋ผ ์๋๋ฅผ ๊ฐ๋ ํ๋ก๊ทธ๋จ์ผ๋ก ์คํ
๋๋ ๊ฒ์ ๋งํ๋ค. ์ฆ ๋ค๋ฅธ ์๋ ํ๋ก๊ทธ๋จ(GDI๋ฅผ ์ฌ์ฉํด ์ถ๋ ฅํ๋ ํ๋ก๊ทธ
๋จ)๋ค๊ณผ ๊ณต์กดํ๋ ๊ฒ์ด๋ค. ํ์คํฌ๋ฆฐ ๋ชจ๋๋ ์ ์ ํ๋ฉด์ ๋ค ์ฐจ์งํ์ฌ ๋ ์
ํ๋ ๊ฒ์ด๋ค. ์ฆ ๋ค๋ฅธ ์๋ ํ๋ก๊ทธ๋จ๋ค์ ๋ณด์ด์ง ์๊ฒ ๋๋ค. ์๋ ๋ชจ๋์
์๋ ๋๋ธ ๋ฒํผ๋ง ๋ฐฉ๋ฒ ์ค ์ ์์ ๋ฐฉ๋ฒ์ ์ทจํ๊ฒ ๋๊ณ ํ์คํฌ๋ฆฐ ๋ชจ๋์์
๋ ํ์์ ๋ฐฉ๋ฒ์ ํํด์ผ ํ๋ค.
ํด๋ฆฝํ(Clipping)
์ ์ฒด ๊ทธ๋ฆผ ์์ญ ์ค์์ ์ผ๋ถ ์์ญ๋ง ์ถ๋ ฅํ๋๋ก ํ๊ณ ๋๋จธ์ง ์์ญ์ ์ถ๋ ฅ
์ ๋ง๋ ๊ธฐ์ ์ ๋งํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ์ฌ์ฉํ๊ณ ์๋ ์๋๋ ๋ชจ๋ ํด๋ฆฝํ์
์ฌ์ฉํ๊ณ ์๋ค. ์ฆ ์๋๋ง๋ค ์์ ์ด ์ ์งํ๋ ๋ด์ฉ์ ๋ชจ๋ ๋ค ํ์ํ๋ ๊ฒ
์ด ์๋๋ผ ์์ ์ ํฌ๊ธฐ์ ๋ง์ถฐ ๊ทธ ๋ถ๋ถ๋ง ์ถ๋ ฅํ๊ณ ๋๋จธ์ง๋ ์ถ๋ ฅํ์ง ์
๋๋ค. ์ด ๊ฒ์ด ๋ฐ๋ก ํด๋ฆฝํ์ด๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ฅผ ํ์คํฌ๋ฆฐ ๋ชจ๋๋ก ์ฌ์ฉ
ํ ๋๋ ํด๋ฆฝํ์ด๋ผ๋ ๊ฒ์ด ํ์์๋ค. ์ ์ฒด ํ๋ฉด์ ๋ชจ๋ ๋ด๊ฐ ์ฌ์ฉํ๋๋ฐ
์ ๊ฒฝ์ธ ์ผ์ด ์๋ค. ํ์ง๋ง ์๋ ๋ชจ๋์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ก๊ทธ๋จ์์๋
์ด๋ฅผ ๋ช ์ฌํด์ผ ํ๋ค. ์ถ๋ ฅ์ด ์์ ์ด ์ํ ์๋ ๋ฐ๊นฅ์ผ๋ก ๋๊ฐ์ง ์๋๋ก
์ฃผ์ํด์ผ ํ๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ์๋ ์ด๋ฐ ์ฉ๋๋ก ํด๋ฆฝํผ(Clipper)๋ผ๋ ๊ฐ
์ฒด๊ฐ ์ ๊ณต๋๋ค. ์์ ์ด์ผ๊ธฐ๋ ๊ฒ์ฒ๋ผ ์ด ๊ฐ์ฒด๋ ์๋ ๋ชจ๋์์๋ง ์ฌ์ฉ๋
๋ค.
๊ทธ๋ฆผ 7์ ๋ณด๋ฉด ์๋ A๋ ์๋ B์ C์ ์ํด ๊ฐ๋ ค์ ธ ์๋ค. ์ด ๊ฒฝ์ฐ ์๋ A
์ ๋ด์ฉ์ ์๋ B์ C์ ์ํด ๊ฐ๋ ค์ง ๋ถ๋ถ์ ์ ์ธํ๊ณ ์ถ๋ ฅ๋๋ค. ์ด๊ฒ์ด ๋ฐ
๋ก ํด๋ฆฝํ์ด๋ค.
๋ฉด(Surface) ๊ฐ์ฒด
๋ค์ด๋ ํธ ๋๋ก์ฐ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ถ๋ ฅ ๋์์ด ๋๋ ๋นํธ๋งต์ด๋ ์คํ๋ผ์ด
ํธ์ ๋ด์ฉ์ ๋ณด๊ดํ๊ธฐ์ํด ๋ฉด(surface)์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋ค. ๋ํ ์์ ๋
๋ธ ๋ฒํผ๋ง์์ ๋ฒํผ๋ ๋ฉด์ผ๋ก ํํํ๋ค. ์ ์ ๋ฒํผ๋ฅผ ๋ค์ด๋ ํธ ๋๋ก์ฐ
์ฉ์ด๋ก๋ ์ฃผ๋ฉด(Primary Surface)์ด๋ผ ํ๊ณ ํ์ ๋ฒํผ๋ฅผ ํ์ ๋ฉด(Back
Surface)์ด๋ผ ํ๋ค. ์์์ ์ด์ผ๊ธฐํ ๊ฒ์ฒ๋ผ ๋ฐฐ๊ฒฝ์ด ๋๋ ๋นํธ๋งต์ด๋ ์ ๋
๋ฉ์ด์ ์ ๋์์ด ๋๋ ์คํ๋ผ์ดํธ๋ค๋ ๊ฐ๊ธฐ ๋ฉด ๊ฐ์ฒด๋ก ์์ฑ๋์ด ์์ด์ผ๋ง
ํ์ ๋ฉด์ผ๋ก์ ๋ณต์ฌ๊ฐ ์ฉ์ดํ๋ค.
===============================================================
์ฃผ ์
๋๋ธ ๋ฒํผ๋ง์ ์ฌ์ฉํ ๋๋ ํ ๊ฐ์ง ์ฃผ์ํ ์ ์ด ์๋ค. โ์ฐข์ด์ง(teari
ng)โ ํ์์ด ๋ฐ๋ก ๊ทธ๊ฒ์ธ๋ฐ ๋ชจ๋ํฐ ํ๋ฉด์ ๋๊ฐ 1์ด์ 70ํ ์ ๋ ๋ค์ ๊ทธ
๋ ค์ง๋ค. ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ด์ฉ์ ๋ณ ์๊ฐ์ด ์์ด 1์ด์ 70๋ฒ์ฉ ๊ฐ์ ธ๋ค
๊ฐ ๊ทธ๋ฆฌ๋ ์ ์ธ๋ฐ ๋ง์ผ ํ๋ฉด์ ๋ด์ฉ์ด ์ค๊ฐ์ฏค ๊ทธ๋ ค์ง ์ํ์์ ๋ฒํผ์ ์ ํ
์ด ์ด๋ฃจ์ด์ ธ ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ์ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด ํ๋ฉด์ ํ๋จ์ด ๋จผ์ ๊ทธ๋ ค
์ง๊ณ ์๋จ์ด ๊ทธ๋ ค์ง ๊ฒ์ด๋ค. ์ด๋ ์๊ฐ์ ์ผ๋ก ์ฌ์ฉ์์ ๋์ ๋ฌด์์ธ๊ฐ ์ด์
ํ ๋๋์ ์ฃผ๊ฒ ๋๋ค. ์ด๋ฅผ ํผํ๋ ค๋ฉด ๋ฒํผ์ ์ ํ์ด ์ด๋ฃจ์ด์ง๋ ์์ ์
์ ๋ง์ถ์ด์ผ ํ๋ค. ์ฆ, ํ๋ฉด์ ๊ฐฑ์ ์ด ๋ชจ๋ํฐ ํ๋ฉด์ ์์ง ์ฃผ์ฌ์ ๋ง์ถ์ด
๋ฒํผ๋ฅผ ๊ต์ฒดํด์ผ ํ๋ค.
๋ฉด ๊ฐ์ฒด๋ โ์ ์ค(lost)โ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ ๊ธฐ์กด์ ์
๋ ์ถ๋ ฅ ์์คํ ์ธ GDI์ ๊ณต์กดํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ GDI๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ
๋ ๋์ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๊ณ ์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ๋ง์ผ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ
๋ก๊ทธ๋จ์ ์คํํด ๋์ ์ํ์์ ๋ค๋ฅธ ์ผ๋ฐ ์๋ ํ๋ก๊ทธ๋จ์ ์ ๋ฉด์ผ๋ก ๋์ฐ
๋ฉด(ํ์คํฌ๋ฆฐ ๋ชจ๋์์๋ Alt+Tabํค๋ฅผ ์ด์ฉํด ์ผ๋ฐ ์๋ ํ๋ก๊ทธ๋จ์ผ๋ก์ ์
์ด๊ฐ ๊ฐ๋ฅํ๋ค) ์์ฌ๋ง์ GDI๋ ๊ทธ๋์ ๋ค์ด๋ ํธ ๋๋ก์ฐ๊ฐ ํ๋ค๊ฒ(?) ๋ง๋ค
์ด ๋์ ์์๋ค์ ๋ชจ๋ ํ์ํด๋ฒ๋ฆฐ๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ ์ ์ฅ์์ ๋ณผ ๋๋
์๋ง์ด ๋๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ๋ฉด์ด ์ ์ค๋์๋ค๊ณ ํ๋ค. ์ด ๊ฒฝ์ฐ์๋ ๋ฉด ๊ฐ์ฒด
์ ๋ด์ฉ์ ๋ค์ ๋ณต๊ตฌํด์ฃผ์ด์ผ ํ๋ค.
๋ฉด์ ์ ์ค ์ฌ๋ถ๋ ๋ฉด์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ ๋ฆฌํด ๊ฐ์ ๋ณด๋ฉด ์ ์ ์๋ค.
===============================================================
์ค๋ฒ๋ ์ด(Overlay)
๊ฐ๋ ์ ์ผ๋ก ๋ณผ ๋ ์ฃผ ๋ฉด์ ์ ์ฉ๋์ด ์ฃผ ๋ฉด์ ๋ฎ๊ณ ์๋ ์ฌ๊ฐํ์ ์์ญ์ผ๋ก
๋ณผ ์ ์๋ค. ์ค๋ฒ๋ ์ด๋ ๋ค๋ฅธ ๋ฉด ๊ฐ์ฒด๋ค๋ณด๋ค ์์ ํญ์ ๋ ์๋ค๊ณ ์๊ฐํ
๋ฉด ๋๋ค.
์ค๋ฒ๋ ์ด๋ ์ด๋ฅผ ํ๋์จ์ด์ ์ผ๋ก ์ง์ํ๋ ๊ทธ๋ํฝ ์นด๋์์ ์ ๋์ํ๋ค.
์๋ฅผ ๋ค์ด ์๋์ฐจ ๊ฒฝ์ฃผ ๊ฒ์์ด๋ ๋นํ ์๋ฌผ๋ ์ด์ ์ ๋ณด๋ฉด ๊ฒ๊ธฐํ์ ๋ณผ ์
์๋๋ฐ ์ด๋ฅผ ์ค๋ฒ๋ ์ด๋ก ๋ง๋ค์ด ๋๋ฉด ๋๋ค.
๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ด๋ จ ๊ฐ์ฒด
๋ค์ด๋ ํธ ๋๋ก์ฐ๋ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋๋ค. ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ ์๋ก ์๊ด
๊ด๊ณ๋ฅผ ๊ฐ๊ฒ ๋๋ฉฐ ์ฌ๋ฌ ๊ฐ์ ๋ฉค๋ฒ ํจ์๋ฅผ ๊ฐ๊ฒ ๋๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ ๋ค
์๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋๋ค.
โ ๋ค์ด๋ ํธ ๋๋ก์ฐ(DirectDraw) ๊ฐ์ฒด
โ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด(DirectDrawSurface) ๊ฐ์ฒด
โ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ(DirectDrawPalette) ๊ฐ์ฒด
โ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํด๋ฆฝํผ(DirectDrawClipper) ๊ฐ์ฒด
์ญ์ ๋ฉ์ธ์ด ๋๋ ๊ฐ์ฒด๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ์ด๋ค. ์ด ๊ฐ์ฒด๋ฅผ ํตํด ๋ค๋ฅธ ๊ฐ์ฒด
๋ค์ ์์ฑ์ด ๊ฐ๋ฅํ๋ฐ ์ด ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ด๋ค. ๊ฐ๊ฐ์ ๊ฐ
์ฒด๋ฅผ ๋ณ๋๋ก ์์ฑํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด๋ ํ๋ฉด ํด์
๋๋ฅผ ์ง์ ํ๊ณ ํ์คํฌ๋ฆฐ ๋ชจ๋์ ์๋ ๋ชจ๋ ์ค์ ์ด๋ค ๊ฒ์ ์ฌ์ฉํ ์ง์ ๋ค
๋ฅธ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด๋ค์ ์์ฑํ๋ ์ญํ ์ ๋ด๋นํ๋ค.
๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด ๊ฐ์ฒด๋ ์ค์ ํ๋ฉด ์ถ๋ ฅ๊ณผ ๊ด๋ จ๋๋ ๊ฐ์ฒด๋ก ๋๊ฐ์ ๊ฒฝ
์ฐ ์ ์ด๋ ์ฃผ ๋ฉด ๊ฐ์ฒด์ ํ์ ๋ฉด ๊ฐ์ฒด์ ๋ ๊ฐ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๊ฒ ๋๋ค.
๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ ๊ฐ์ฒด๋ ๋ฉด ๊ฐ์ฒด๋ก ๋๊ฐ๋ ์ถ๋ ฅ์์ ์ด๋ค ์์์ ์ฌ
์ฉํ ๊ฒ์ธ์ง ๊ทธ ํ๋ ํธ๋ฅผ ์ง์ ํ๋ ์ญํ ์ ๋ด๋นํ๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ ํด
๋ฆฝํผ ๊ฐ์ฒด๋ ์๋ ๋ชจ๋์ ๋๊ฐ๋ ์ถ๋ ฅ์ด ๋ค๋ฅธ ์๋๋ค์ ์์ญ์ ์นจ๋ฒํ๋ ๊ฒ
์ ๋ง๋ ์ญํ ์ ๋ด๋นํ๋ค.
๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ก๊ทธ๋จ ์์ฑ
์ด์ ๋ถํฐ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ก ์์ ํ๋ก๊ทธ๋จ์ ์์ฑํด๊ฐ๋ฉด์ ๋ค์ด๋ ํธ ๋
๋ก์ฐ์ ๋ํด์ ์ค๋ช ํ๋๋ก ํ๊ฒ ๋ค. ์์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ฒ๋ผ ์์ ํ๋ก๊ทธ๋จ
์ ์๋ API๋ฅผ ๊ฐ๊ณ ์์ฑํ๋๋ก ํ๊ฒ ๋ค. MFC๋ก ์์ฑํ๊ฒ ๋๋ฉด MFC ์์ฒด์
๋ํ ์ง์์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ์์ฒด์ ๋ํด ์ง์คํ ์๊ฐ ์
๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ธํ์ด๋ ๋น์ฃผ์ผ๋ฒ ์ด์์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ค์ด๋ ํธ
๋๋ก์ฐ ์ปดํฌ๋ํธ๊ฐ ์๊ธฐ๋ ํ์ง๋ง ์ด ๊ฒ์ ์ฌ์ฉํ๋ฉด ๋ค์ด๋ ํธ ๋๋ก์ฐ ์์ฒด
์ ๋ํด ์ ๋๋ก ์ดํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ์ ์ฌ๋ฌ๋ถ๋ค์ด ๋ค์ ์์ํ ๋๋
์ ๊ฐ์ง์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง API๋ฅผ ์ด์ฉํด์ ์์ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ฒ ๋ค. ๋ฐ๋ผ
์ ์ฌ๋ฌ๋ถ์ API๋ฅผ ์ด์ฉํ ํ๋ก๊ทธ๋๋ฐ์ ๋ํ ์ฌ์ ์ง์์ด ํ์ํ๋ค. ์์ฃผ
์ ์์์ผํ ํ์๋ ์์ง๋ง ์ ์ด๋ โHello, world?โ๋ฅผ ์ถ๋ ฅํ๋ ์ ๋์
ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ณ ๊ทธ ๋ด์ฉ์ ์ดํดํ ์ ์๋ ์์ค์ ๋์ด์ผ ํ๋ค. ๋ง๋ค
๊ณ ์ ํ๋ ํ๋ก๊ทธ๋จ์ ํ์คํฌ๋ฆฐ ๋ชจ๋์ ํ๋ก๊ทธ๋จ์ด๋ฉฐ ์ํ ๊ฒ์์ ๊ธฐ๋ณธ์
์ธ ๋ผ๋๋ง์ ์ก์ ๊ฒ์ผ๋ก ๋ฐฐ๊ฒฝ ํ๋ฉด์ด ์คํฌ๋กค๋๊ณ ๋นํ๊ธฐ ํ ๋๊ฐ ํค ์ ๋ ฅ
์ ๋ฐ๋ผ ์์๋์ ์ข์ฐ๋ก ์ด๋ํ๋ ๊ฒ์ด๋ค.
- ๊ณ์ -
- the end of this article -
DirectX Programming (3)
===============================================================
๋ฆฌ์คํธ 1 : WinMain์ ๋ด์ฉ
---------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE
hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
MSG msg;
HWND hwnd;
WNDCLASS wc;
// ์๋ ํด๋์ค๋ฅผ ๋ฑ๋กํ๋ค.
wc.lpszClassName = "MAIN";
wc.hInstance = hInst;
wc.lpfnWndProc = WndProc;
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hIcon = LoadIcon (NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground= (HBRUSH)GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL;
RegisterClass (&wc);
// ๋ฉ์ธ ์๋๋ฅผ ์์ฑํ๋ค.
hwnd = CreateWindow ("MAIN", "DirectDraw Test",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, (HMENU)NULL, hInst, NULL);
ShowWindow (hwnd,nCmdShow);
UpdateWindow (hwnd);
// ๋ฃจํ๋ฅผ ๋๋ฉฐ ํ๋ ์์ ๊ฐฑ์ ํ๋ค.
for(;;){
// ์ฝ์ด์ฌ ๋ฉ์์ง๊ฐ ์๋์ง ๊ฒ์ฌํ๋ค.
if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
if (GetMessage(&msg, NULL, NULL, NULL)) {
// ์์ผ๋ฉด ๊ฐ์ ธ์จ๋ค.
// ์ข
๋ฃ ๋ฉ์์ง๊ฐ ์๋๋ฉด ์ด๋ฅผ ์ฒ๋ฆฌํ๋ค.
TranslateMessage(&msg);
DispatchMessage(&msg);
} else // ์ข
๋ฃ ๋ฉ์์ง๊ฐ ๋ฐ์ํ์ผ๋ฉด ๊ทธ๋ฅ ๋๋ธ๋ค.
break;
}
if (bPlaying) // ๊ฒ์์ด ์งํ ์ค์ด๋ฉด
UpdateFrame(); // ํ๋ ์์ ๋ณํํ๋ค.
else // ์งํ ์ค์ด์ง ์๋๋ฉด
WaitMessage();// ๋ฉ์์ง๊ฐ ๋ฐ์ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
// ํค ๋๋ฆผ ์ฒดํฌ
if (GetAsyncKeyState(VK_ESCAPE) < 0)
// ESCAPEํค๊ฐ ๋๋ ธ์ผ๋ฉด ๋น ์ ธ๋๊ฐ๋ค.
break;
} ......
return msg.wParam;
}
===============================================================
์์ ํ๋ก๊ทธ๋จ์ ์์
๋ค์ด๋ ํธ ๋๋ก์ฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ ์ผ ๋จผ์ ํด์ผํ ์ผ์ ddraw.h๋ผ๋ ํค๋ ํ
์ผ์ ํฌํจํ๊ณ ddraw.lib๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ ๋งํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํญ๋ชฉ์ผ
๋ก ์ง์ ํ๋ ์ผ์ด๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํญ๋ชฉ์ผ๋ก์ ์ง์ ์ Project ๋ฉ๋ด์
Settings ๋ช ๋ น์ ์ด์ฉํ๋ฉด ๋๋ค. ์ด ๋ช ๋ น์ ์คํํ์ฌ Link ํญ์ ํํ ๋ค
์ Category ๋ฐ์ค๋ก General์ ์ ํํ๋ค. ๊ทธ ๋ค์ Object/Library
modules ๋ฐ์ค์ ddraw.lib๋ฅผ ์ถ๊ฐํ๋ค(๊ทธ๋ฆผ 8 ์ฐธ์กฐ)
๋ชจ๋ ์๋ ํ๋ก๊ทธ๋จ์ WinMain์ผ๋ก ์์ํ๋ค. WinMain์ ๋ด์ฉ์ ๋ฆฌ์คํธ 1
๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
๊ทธ๋ฆผ 8 : ddraw.lib๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํญ๋ชฉ์ ์ถ๊ฐํ๊ธฐ
๋ฆฌ์คํธ 1์ ํจ์๋ฅผ ๋ณด๋ฉด ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ฅผ ์ด์ฉํ ํ๋ก๊ทธ๋จ์ ์ ์ฒด์ ์ธ
ํ๋ฆ์ ๋ณผ ์ ์๋ค. ์๋ ํด๋์ค๋ฅผ ๋ฑ๋กํ๊ณ ๋ฉ์ธ ์๋๋ฅผ ์์ฑํ๋ ๋ถ๋ถ์
์ฌํ ์๋ ํ๋ก๊ทธ๋จ๊ณผ ๋ค๋ฅผ ๊ฒ์ด ์๋ค. ์ค์ํ ๋ถ๋ถ์ ๋ฐ๋ก ๊ทธ ๋ค๋ฅผ ์ด์ด
๋์ค๋ ๋ฉ์์ง ์ฒ๋ฆฌ ๋ฃจํ์ด๋ค. ์ด ๋ฃจํ์ ๋ชจ์์ ๋ณด๋ฉด ์ฐ๋ฆฌ๊ฐ ํํ ๋ณด์์
๋ ๋ฉ์์ง ๋ฃจํ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ๊ณผ๋ ์๋นํ ์์ดํจ์ ์ ์ ์๋ค.
API ํ๋ก๊ทธ๋จ์ ์๋นํ ํด๋ณด์๋ค๊ณ ์์ ํ๋ ์ฌ๋๋ค๋ PeekMessage
๋ WiatMessage์ ๊ฐ์ API์ ๋ํด์๋ ์์ํ๊ฒ ๋๋ ๊ฒ์ด๋ค. ์ด ๋ฃจํ์
๋ด์ฉ์ ์กฐ๊ธ ๋ ์๊ธฐ ์ฝ๊ฒ ๊ทธ๋ ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
for(;;) {
// ์ฒ๋ฆฌํ ๋ฉ์์ง๊ฐ ์์ผ๋ฉด ์ฒ๋ฆฌํ๋ค.
// ๋ง์ผ ์ข
๋ฃ ๋ฉ์์ง๊ฐ ๋ค์ด์์ผ๋ฉด ๋ฃจํ๋ฅผ ๋๋ธ๋ค.
// ๊ฒ์์ด ์งํ์ค์ด๋ฉด(bPlaying์ด๋ผ๋ ๋ณ์๋ก ํ๋จํ๋ค)
// ๋ค์ ํ๋ฉด์ ๊ทธ๋ ค์ ๋ฟ๋ฆฐ๋ค(UpdateFrame)
// ๊ฒ์์ด ์งํ์ค์ด์ง ์์ผ๋ฉด ์ฒ๋ฆฌํ ๋ฉ์์ง๊ฐ ๋ฐ์ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
// ESCํค๊ฐ ๋๋ ธ๋์ง ๊ฒ์ฌํ์ฌ ๋๋ ธ์ผ๋ฉด ๋ฃจํ๋ฅผ ๋๋ธ๋ค.
}
์ด ํ๋ก๊ทธ๋จ์์๋ ์ ๋๋ฉ์ด์ ์ ์ํํ๊ธฐ ์ํด ๋๋ธ ๋ฒํผ๋ง์ ์ฌ์ฉํ
๋ค. ์ด ๋๋ธ ๋ฒํผ๋ง์ ์์ ์ค๋ช ํ๋ฏ์ด ์ํ์ฒ๋ผ ์ฅ๋ฉด์ ๊ณ์์ ์ผ๋ก ๋ง๋ค์ด
๋ด๋ ๋ฐฉ์์ ์ทจํ๋ค. ์ฆ, ๋ค์ ์ฅ๋ฉด์ ๋ง๋ค์ด ์ด๋ฅผ ํ์ด์ง ํ๋ฆฝํ์ ํตํด
๋น๋์ค ๋ฉ๋ชจ๋ฆฌ๋ก ์ ํํ๋ ๋ฐฉ์์ ์ทจํ๋ ๊ฒ์ด๋ค. ๊ทธ ํต์ฌ์ด ๋๋ ํจ์๊ฐ
๋ฐ๋ก UpdateFrame์ด๋ค.
์ด ํจ์์ ๋ด์ฉ์ ๋ค์์ ์ดํด๋ณด๊ฒ ์ง๋ง ์ฌ๊ธฐ์ ๋ฐ๋ก ์ด ์์ ํ๋ก๊ทธ๋จ์
ํฌ์ธํธ๊ฐ ์๋ค. ์ด์ ๋ํด์๋ ๋ค์์ ์ดํด๋ณด๊ณ ๋ค์์ผ๋ก ๋ค์ด๋ ํธ ๋๋ก
์ฐ ๊ฐ์ฒด์ ์ด๊ธฐํ ๋ฐฉ๋ฒ์ ๋ํด ์ดํด๋ณด์.
๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ ์ด๊ธฐํ
์ผ๋จ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด๋ฅผ ๋ํํ๋ ์ ์ญ ๋ณ์๋ฅผ ํ๋ ์ ์ธํ๋ค.
// DirectDraw ๊ด๋ จ ๋ณ์
LPDIRECTDRAW pDirectDrawObj; // DirectDraw ๊ฐ์ฒด
๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๊ทธ ๊ฐ์ ์์ ๋ณ์์ ์ ์ฅํด๋์ด์ผ ํ
๋ค. ์ด ์์ ์ ๋ฉ์ธ ์๋์ WM_CREATE ๋ฉ์์ง ์ฒ๋ฆฌ๋ถ์์ ์ํํ๋๋ก ํ
๊ฒ ๋ค.
WM_CREATE ๋ฉ์์ง๋ ์๋๊ฐ ์์ฑ๋์๋ง์ ๋ฐ์ํ๋ ๋ฉ์์ง๋ก ๋ธํ์ด๋ ๋น
์ฃผ์ผ๋ฒ ์ด์์ผ๋ก ์น๋ฉด OnLoad ์ด๋ฒคํธ์ ํด๋นํ๋ค.
switch (message){
// ๋ณ์๋ฅผ ์ด๊ธฐํํ๋ค.
case WM_CREATE:
{
pDirectDrawObj = NULL;
....
// ----------------------------------
// DirectDraw ๊ด๋ จ ์ด๊ธฐํ๋ฅผ ์ํํ๋ค.
// ----------------------------------
// DirectDraw ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
if (DirectDrawCreate(NULL, &pDirectDrawObj, NULL) != DD_OK)
return -1;
// ํ๋ก๊ทธ๋จ์ ๋
์ ๋ชจ๋์ ์ ์ฒด ํ๋ฉด ๋ชจ๋๋ก ๋์ด๋ค.
if (pDirectDrawObj->SetCooperativeLevel(hWnd,
DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)!= DD_OK)
return -1;
// ํ๋ฉด ํด์๋๋ฅผ ์ค์ ํ๋ค. (640X480)์ 256 ์ปฌ๋ฌ ๋ชจ๋
if (pDirectDrawObj->SetDisplayMode(640, 480, 8)!= DD_OK)
return -1;
....
๋จผ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ทธ๊ฒ์ ํ๋ ๋ชจ๋์ ๋น๋์ค ๋ชจ๋
๋ฅผ ์ค์ ํ์๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋
DirectDrawCreate๋ผ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ๋์ฐ๋ฏธ ํจ์๋ฅผ ์ด์ฉํ์๋ค. ๋
๋ฒ์งธ ์ธ์๋ก ์์ฑ๋๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ป์ด์ฌ ๋ณ์
์ ์ฃผ์๋ฅผ ์ง์ ํ์๋ค. ๋ชจ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ด๋ จ ํจ์๋ค์ ์ฑ๊ณต์ ์ผ๋ก ์ข
๋ฃ๋ ๊ฒฝ์ฐ ๋ฆฌํด๊ฐ์ด DD_OK๊ฐ ๋๋ค๋ ์ ๋ ํ๋ ์์๋๊ธฐ ๋ฐ๋๋ค. ์ฌ๊ธฐ์ ์ฌ
์ฉ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ด๋ จ ํจ์๋ค์ ๋ํ ๋ ํผ๋ฐ์ค๋ ๋ท ๋ถ๋ถ์ ๋ณ๋๋ก ๋ชจ
์๋์์ผ๋ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋ค.
์๋ฌดํผ DirectDrawCreate ํจ์์ ํธ์ถ์ด ์ฑ๊ณต์ ์ผ๋ก ๋๋๋ฉด
pDirectDrawObj ๋ณ์์๋ ์์ฑ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ ์ฃผ์๊ฐ ๋ค์ด๊ฐ๊ฒ
๋๋ค. ๊ทธ ๋ค์์ ๋ฐ๋ก ํด์ผํ ์ผ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ๊ฐ ํ์คํฌ๋ฆฐ ๋ชจ๋๋ก ์ค
ํ๋ ๊ฒ์ธ์ง ์๋๋ฉด ์๋ ๋ชจ๋๋ก ์คํ๋ ๊ฒ์ธ์ง๋ฅผ ์ง์ ํ๋ ๊ฒ์ด๋ค. ์ด ์ผ
์ ์ํํ๊ธฐ ์ํด์๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ SetCooperativeLevel์ด๋ ํจ
์๋ฅผ ํธ์ถํด์ผ ํ๋ค. ํ์คํฌ๋ฆฐ ๋ชจ๋๋ก ์คํ๋๋ ค๋ฉด ๋ ๋ฒ์งธ ์ธ
์๋ก DDSCL_EXCLUSIVE | DDSCL_FULLSCRE EN์ ์ฃผ์ด์ผ ํ๋ค. ์๋ ๋ชจ๋
๋ก ์คํ๋๋ ค๋ฉด ๋ ๋ฒ์งธ ์ธ์๋ก DDSCL_NORMAL์ ์ฃผ์ด์ผ ํ๋ค. ์ฌ๊ธฐ์๋ ํ์ค
ํฌ๋ฆฐ ๋ชจ๋๋ก ๋ฐ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ DDSCL_EXCLUSIVE์ DDSCL_ FULLSCREEN์ ์ฃผ
์๋ค.
๋ค์์ผ๋ก ๋น๋์ค ๋ชจ๋๋ฅผ ์ค์ ํ๊ธฐ ์ํด ๋ค์ด๋ ํธ ๋๋ก์ฐ์ SetDisplayMode
ํจ์๋ฅผ ํธ์ถํ์๋ค. ์ฒซ ๋ฒ์งธ ์ธ์์ ๋ ๋ฒ์งธ ์ธ์๋ก๋ ๊ฐ๋ก์ ์ธ๋ก ํด์๋
๋ฅผ ์ง์ ํ๋ค. ์ฌ๊ธฐ์๋ 640ร480์ ์ฌ์ฉํ์๋ค. ๋ง์ง๋ง ์ธ์๋ก๋ ํ ์ ์
์์์ ํํํ๊ธฐ ์ํด ์ฌ์ฉํ ๋นํธ์๋ฅผ ์ง์ ํ๋ค. ์ฌ๊ธฐ์๋ 8์ ์ง์ ํ๊ธฐ
๋๋ฌธ์ 256์ปฌ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ์ธ๋ฑ์ค ๋ชจ๋๊ฐ ๋๋ค.
์ธ๋ฑ์ค ๋ชจ๋๋ฅผ ์ฌ์ฉํ ๋๋ ์ด๋ค ์ปฌ๋ฌ ํ ์ด๋ธ์ ์ฌ์ฉํ ๊ฒ์ธ์ง๋ ์ง์ ํด์ฃผ
์ด์ผ ํ๋ค. ๋ท ๋ถ๋ถ์ ๋ณด๋ฉด ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์
๋ณผ ์ ์์ ํ ๋ฐ ์ฌ๊ธฐ์ ์ด๋ค ์ปฌ๋ฌ ํ ์ด๋ธ์ ์ฌ์ฉํ ๊ฒ์ธ์ง ์ง์ ํ๋ ๋ฐฉ๋ฒ
์ ๋ณผ ์ ์์ ๊ฒ์ด๋ค. ์ด ๊ฒ์ผ๋ก ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ด๊ธฐํ
๋ ๋์ด ๋ฌ๋ค.
===============================================================
๋ฆฌ์คํธ 2 : CreateSurfaces ํจ์
---------------------------------------------------------------
// ----------------------------------------------
// CreateSurfaces : ์ ์ ๋ฉด๊ณผ ํ์ ๋ฉด์ ์์ฑํ๋ค.
// ----------------------------------------------
BOOL CreateSurfaces()
{
DDSURFACEDESC ddSurfaceDesc;
DDSCAPS ddsCaps;
BOOL bSuccess = FALSE;
HRESULT hResult;
// ์ ์ ๋ฉด์ ํ๋์ ํ์ ๋ฒํผ ๋ฉด์ ๊ฐ๋๋ก ์์ฑํ๋ค.
// ๋จผ์ DDSURFACEDESC ๊ตฌ์กฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ค.
memset(&ddSurfaceDesc, 0, sizeof(DDSURFACEDESC));
ddSurfaceDesc.dwSize = sizeof(DDSURFACEDESC);
ddSurfaceDesc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddSurfaceDesc.ddsCaps.dwCaps
= DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddSurfaceDesc.dwBackBufferCount = 1;
// ์ ์ ๋ฉด์ ์์ฑํ๋ค.
hResult = pDirectDrawObj->CreateSurface
(&ddSurfaceDesc, &pPrimarySurface, NULL);
if (hResult == DD_OK) {
// ํ์ ๋ฒํผ ๋ฉด์ ํฌ์ธํฐ๋ฅผ ๋ง๋ ๋ค.
ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
hResult = pPrimarySurface->GetAttachedSurface
(&ddsCaps, &pBackSurface);
if (hResult == DD_OK)
bSuccess = TRUE;
}
return bSuccess;
}
===============================================================
๋ฉด ๊ฐ์ฒด์ ์์ฑ
์ด์ ํด์ผํ ์ผ์ ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ํ์ด์ง
ํ๋ฆฝํ์ ์ด์ฉํ ์คํ๋ผ์ดํธ ์ ๋๋ฉ์ด์ ์ ์ํํด ๋ณผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์
์ ๋ฒํผ์ ํ์ ๋ฒํผ๋ฅผ ์์ฑํด์ผ ํ๋ค. ์์ ์ด์ผ๊ธฐํ๋ฏ์ด ๋ค์ด๋ ํธ ๋
๋ก์ฐ์์๋ ์ ์ ๋ฒํผ๋ฅผ ์ฃผ๋ฉด(Primary Surface)์ด๋ผ ํ๊ณ ํ์ ๋ฒํผ๋ฅผ ํ
์ ๋ฉด(Back Surface)๋ผ๊ณ ํ๋ค.
์ด ๋ฐ์๋ ํ์ ๋ฉด์ ํ๋ฉด์ ๊ตฌ์ฑํ๋๋ฐ ์ฌ์ฉ๋ ๋นํธ๋งต์ด๋ ์คํ๋ผ์ดํธ๋ค
๋ ๋ฉด ๊ฐ์ฒด(์ด๋ฐ ๋ฉด๋ค์ ์คํ์คํฌ๋ฆฐ ๋ฉด์ด๋ผ๊ณ ํ๊ธฐ๋ ํ๋ค)๋ก ๊ตฌ์ฑ๋์ด์ผ
ํ๋ค. ๋จผ์ ์ฃผ ๋ฉด ๊ฐ์ฒด์ ํ์ ๋ฉด ๊ฐ์ฒด์ ์์ฑ ์ ์ฐจ๋ฅผ ์ดํด๋ณด์. ๊ด๋ จ ๋ณ์
๋ค์ ์ผ๋จ ์ ์ญ ๋ณ์๋ก ์ ์ํ๋ค.
LPDIRECTDRAWSURFACE pPrimarySurface; // ์ฃผ ๋ฉด ๊ฐ์ฒด
LPDIRECTDRAWSURFACE pBackSurface; // ํ ๋ฉด ๊ฐ์ฒด
์ด ๊ฐ์ฒด๋ค ์ญ์ WM_CREATE ๋ฉ์์ง ์ฒ๋ฆฌ๋ถ์์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ ์
์ฑ์ด ๋๋์๋ง์ ์์ฑํ๊ฒ ๋๋ค.
....
// ์ ์ ๋ฉด๊ณผ ํ์ ๋ฒํผ ๋ฉด์ ์์ฑํ๋ค.
if (CreateSurfaces() == FALSE)
return -1;
....
์ฃผ ๋ฉด๊ณผ ํ์ ๋ฉด ๊ฐ์ฒด์ ์์ฑ์ ์ํด CreateSurfaces๋ผ๋ ํจ์๋ฅผ ๋ณ๋๋ก
๋ง๋ค์ด ๋์๋ค. ์ด ํจ์์ ๋ด์ฉ์ ๋ฆฌ์คํธ 2์ ๊ฐ๋ค.
๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ฐ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ Crea teSurface๋ผ๋ ํจ
์๋ฅผ ์ด์ฉํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ค ๋ฉด์ ์์ฑํ ๊ฒ์ธ์ง๋ CreateSurface ํจ์
์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ง์ ๋๋ DDSURFACEDESC ๊ตฌ์กฐ์ฒด์ ์ง์ ํ๊ฒ ๋์ด ์๋ค.
์ด ๊ตฌ์กฐ์ฒด์ ํจ์์ ๋ํด ์์ธํ ์ฌํญ์ ๋ค์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํจ์ ๋ ํผ๋ฐ
์ค๋ฅผ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋ค. ์ฌ๊ธฐ์๋ ๊ฐ๋จํ ์ค๋ช ๋ง ํ๊ฒ ๋ค. ์ด ๊ตฌ์กฐ์ฒด์
ddsCaps.dwCaps ํ๋์ ์ด๋ค ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฒ์ธ์ง ์ง์ ํ๋๋ก ๋์ด ์
๋ค.
์ฌ๊ธฐ์๋ ์ฃผ ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด DDSCAPS_PRIM ARYSURFACE๋ฅผ ์ง
์ ํ์๊ณ ์ด๊ฒ์ด ํ์ด์ง ํ๋ฆฝํ์ ์ฌ์ฉ๋๋ฉฐ ๋ฐ๋ผ์ ํ์ ๋ฉด ๊ฐ์ฒด์ ์์ฑ๋
ํ์ํ๋ค๋ ์ ๋ ์๋ฆฌ๊ธฐ์ํด DDSCAPS_FLIP๊ณผ DDSCAPS_COMPLEX๋ ์ง์
ํ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ ๋ฉด ๊ฐ์ฒด๋ ํ๋๋ง ์์ฑํ ๊ฒ์ด๋ ์ ๋ ๋ช ์ํ๊ธฐ
์ํด dwBackBufferCount ํ๋์ ๊ฐ์ 1๋ก ์ง์ ํ์๋ค.
์ฌ์ค ํ์ ๋ฉด์ ํ๋๋ง ์์ฑํด์ผํ๋ ๊ฒ์ ์๋๋ค. N๊ฐ์ ํ์ ๋ฉด์ ์์ฑํ
์ฌ ์ด๊ฒ๋ค์ ์ฃผ ๋ฉด๊ณผ ๋๋ ค๊ฐ๋ฉฐ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ์ด๋ ๊ฒ
DDSURF ACEDESC ๊ตฌ์กฐ์ฒด์ ์ด๊ธฐํ๊ฐ ๋๋๋ฉด ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์
CreateSurface ํจ์๋ฅผ ํธ์ถํ๋ค. ์ด ํจ์์ ํธ์ถ์ด ์ฑ๊ณต์ ์ผ๋ก ๋๋๋ฉด
pPrimary Surface ๋ณ์์ ์์ฑ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด ๊ฐ์ฒด์ ์ฃผ์๊ฐ ๋ค์ด์จ
๋ค.
์ด ๊ฒฝ์ฐ์๋ ์ฃผ ๋ฉด ๊ฐ์ฒด์ ์ฃผ์๊ฐ ๋ค์ด์ค๊ฒ ๋๋ค. ์ฃผ ๋ฉด ๊ฐ์ฒด์ ์์ฑ์ด ์ฑ
๊ณต์ ์ผ๋ก ๋๋๋ฉด ์์ฑ๋ ์ฃผ ๋ฉด ๊ฐ์ฒด์์ ํ์ ๋ฉด ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ๋นผ
๋ด๊ธฐ์ํด GetAttachedSurface ํจ์๋ฅผ ํธ์ถํ๋ค.
// ํ์ ๋ฒํผ ๋ฉด์ ํฌ์ธํฐ๋ฅผ ๋ง๋ ๋ค.
ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
hResult = pPrimarySurface->
GetAttachedSurface(&ddsCaps, &pBackSurface);
์ฃผ์ํ ๊ฒ์ ์ด ํจ์๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ ํจ์๊ฐ ์๋๋ผ ๋ฉด ๊ฐ์ฒด(์ฌ
๊ธฐ์๋ ์ฃผ ๋ฉด ๊ฐ์ฒด)์ ํจ์๋ผ๋ ์ ์ด๋ค. ํ์ ๋ฉด ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ
๋ pBack Surface ๊ฐ ๋ฐ๊ฒ ๋๋ค.
๋ค์์ผ๋ก ๋ฐฐ๊ฒฝ ๋นํธ๋งต๊ณผ ์คํ๋ผ์ดํธ๋ก ์ฌ์ฉ๋ ๋ฉด ๊ฐ์ฒด์ ์์ฑ์ ๋ํด ์
์๋ณด์. ์ด๋ฐ ์ฉ๋์ ๋ฉด ๊ฐ์ฒด๋ค์ ๋ด์ ๋ณ์๋ค์ ์ ์ญ ๋ณ์๋ก ๋ค์๊ณผ ๊ฐ
์ด ์ ์ํ๋ค.
LPDIRECTDRAWPALETTE pDirectDrawPal; // ํ๋ ํธ ๊ฐ์ฒด
LPDIRECTDRAWSURFACE pBackground; // ๋ฐฐ๊ฒฝ ๋ฉด ๊ฐ์ฒด
LPDIRECTDRAWSURFACE pMainCharacter; // ๋ฉ์ธ ์บ๋ฆญํฐ ๋ฉด ๊ฐ์ฒด
์ฌ๊ธฐ์ ์ฃผ์ํ ๊ฒ์ ๋จ์ํ ๋ฉด ๊ฐ์ฒด๋ง ์์ฑํ๋ฉด ๋๋๋ ๊ฒ์ด ์๋๋ผ ๊ด๋ จ
๋ ๋ฉด ๊ฐ์ฒด๋ค์์ ์ฌ์ฉํ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ ๊ฐ์ฒด๋ ์์ฑํด์ผ ํ๋ค
๋ ์ ์ด๋ค.
ํ๋ ํธ ๊ฐ์ฒด๊ฐ ํ์ํ ์ ์ ์ด ํ๋ก๊ทธ๋จ์์ ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ๋น๋์ค ๋ชจ
๋๋ฅผ 8๋นํธ ์ธ๋ฑ์ค ๋ชจ๋๋ก ์ ํํ๊ธฐ ๋๋ฌธ์ด๋ ์ ์ ๋ค์ ํ ๋ฒ ๋ช ์ฌํ๊ธฐ ๋ฐ
๋๋ค.
๊ทธ๋์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๊ทธ ์ฃผ์๋ฅผ ๋ณด๊ดํ๊ธฐ
์ํด pDirectDrawPal์ด๋ ์ ์ญ๋ณ์๋ฅผ ์ ์ํ์๋ค. pBackground๋ ๋ฐฐ๊ฒฝ์ด ๋
๋ ๋นํธ๋งต์ ๋ณด๊ดํ๋๋ฐ ์ฌ์ฉ๋๋ ๋ฉด ๊ฐ์ฒด์ด๋ค. pMainCharacter๋ ์ด ํ๋ก
๊ทธ๋จ์์ ์ฐ๋ ํ๊ฒ ๋์๋ค๋ ๋จ ํ๋์ ์คํ๋ผ์ดํธ ๋ด์ฉ์ ๋ด๋๋ฐ ์ฌ์ฉ๋
๋ ๋ฉด ๊ฐ์ฒด์ด๋ค.
์ด ๋ณ์๋ค์ ์ด๊ธฐํ ์ญ์ WM_CREA TE ๋ฉ์์ง ์ฒ๋ฆฌ๋ถ์์ ์ํํ๋๋ฐ ์์
์ ์ฃผ ๋ฉด๊ณผ ํ์ ๋ฉด ๊ฐ์ฒด์ ์ด๊ธฐํ๊ฐ ๋๋ ๋ค์์ ๋ฐ๋ก ์ํํ๋ค.
// ๋ฐฐ๊ฒฝ ๋นํธ๋งต์ ๋ง์ถ์ด DirecrDrawPalette๋ฅผ ์์ฑํ๋ค.
if ((pDirectDrawPal = DXLoadPalette("MEDIA\\BACK0000.BMP")) == NULL)
return -1;
// ํ๋ ํธ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์๋ค๋ฉด ์ด๋ฅผ ์ค์ ํ๋ค.
//์ด ๋ถ๋ถ์ ํธ์ถ์ ์คํ์คํฌ๋ฆฐ๋ฉด์ ์์ฑ์ ์์ ์ด๋ฃจ์ด์ ธ์ผํ๋ค.
if (pPrimarySurface->SetPalette(pDirectDrawPal)!= DD_OK)
return -1;
// ๋ฐฐ๊ฒฝ ๋นํธ๋งต์ ๋ถ๋ฌ๋ค์ฌ ์คํ์คํฌ๋ฆฐ ๋ฉด์ ์์ฑํ๋ค.
if ((pBackground = DXLoadBitmap("MEDIA\\BACK0000.BMP")) == NULL)
return -1;
// ๋ฉ์ธ ์บ๋ฆญํฐ์ ๋นํธ๋งต์ ๋ถ๋ฌ๋ค์ฌ ์คํ์คํฌ๋ฆฐ ๋ฉด์ ์์ฑํ๋ค.
if ((pMainCharacter = DXLoadBitmap("MEDIA\\SHIP0000.BMP")) == NULL)
return -1;
bDirectDrawOK = TRUE;
return 0;
}
ํ์๋ ๋ฐฐ๊ฒฝ๊ณผ ์คํ๋ผ์ดํธ๋ก ์ฌ์ฉ๋ ๊ทธ๋ฆผ์ ๋ชจ๋ MEDIA๋ผ๋ ๋๋ ํฐ๋ฆฌ ๋ฐ
์ ๋ฃ์ด๋์๋ค. BACK0000.BMP๋ ๋ฐฐ๊ฒฝ์ด ๋๋ ๊ทธ๋ฆผ์ด ๋ค์ด๊ฐ ์๋ ๋นํธ๋งต
ํ์ผ(.BMP ํ์ผ)์ด๊ณ SHIP0000.BMP๋ ์ฃผ์ธ๊ณต์ด ๋๋ ๋นํ๊ธฐ์ ๊ทธ๋ฆผ์ด ๋ค์ด
๊ฐ ์๋ ๋นํธ๋งต ํ์ผ์ด๋ค.
BITMAPFILEHEADER
BITMAPINFOHEADER
์นผ๋ผ ํ ์ด๋ธ
๋นํธ๋งต ๋ฐ์ดํฐ
๊ทธ๋ฆผ 9 : ๋นํธ๋งต ํ์ผ์ ๊ตฌ์กฐ
์ ์ผ ๋จผ์ ํ ์ผ์ ์ฃผ ๋ฉด ๊ฐ์ฒด์ ์ปฌ๋ฌ ํ ์ด๋ธ(ํ๋ ํธ)์ ์ค์ ํ๋ ์ผ์ด
๋ค. ์ฆ, ์ฃผ ๋ฉด ๊ฐ์ฒด์์ ์ด๋ค ์์๋ค์ ์ฌ์ฉํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ด
๋ค. ๋ชจ๋ ๋ฉด ๊ฐ์ฒด๋ค์ด ๊ฒฐ๊ตญ์ ์ฃผ ๋ฉด ๊ฐ์ฒด๋ฅผ ํตํด์ ์ถ๋ ฅ์ด ๋๊ฐ๊ฒ ๋๊ธฐ ๋
๋ฌธ์ ์ฃผ ๋ฉด ๊ฐ์ฒด์ ์ด๋ค ํ๋ ํธ๋ฅผ ์ค์ ํ๋๋๋ ๋ฌธ์ ๋ ์์ฃผ ์ค์ํ ๋ฌธ์
๊ฐ ๋๋ค. ๊ทธ๋์ ์ฌ๊ธฐ์๋ ๋ฐฐ๊ฒฝ ๊ทธ๋ฆผ์ ํ๋ ํธ๋ฅผ ์ฝ์ด๋ค๊ฐ ์ฃผ ๋ฉด ๊ฐ์ฒด์
์ค์ ํ๊ณ ์๋ค. ๊ทธ๋ ๊ฒ ํ๊ธฐ์ํด DXLoadPalette ํจ์๋ฅผ ํธ์ถํ๊ณ ์๋ค.
์ด ํจ์์ ๋ด์ฉ์ ๋ฆฌ์คํธ 3๊ณผ ๊ฐ๋ค.
DXLoadPalette ํจ์๋ ์ธ์๋ก ๋นํธ๋งต ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ๋ฐ์์ ๊ทธ ํ์ผ์ ์ปฌ
๋ฌ ํ ์ด๋ธ ๋ด์ฉ๋ง ์ฝ์ด๋ค์ฌ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๊ทธ
๊ฒ์ ๋ฆฌํดํ๋ค. ๋ฆฌ์คํธ 3์ ์ฝ๋๋ฅผ ์ดํดํ๋ ค๋ฉด(๊ทธ๋ฅ ๊ฐ์ ธ๋ค ์ธ๋ ค๋ฉด ๊ตณ์ด
์ดํดํ ํ์๋ ์์ง๋ง) ๋นํธ๋งต ํ์ผ์ ๊ตฌ์กฐ์ ๋ํด ์์์ผ ํ๋ค. ๋นํธ๋งต ํ
์ผ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋จํ ๋ณด๋ฉด ๊ทธ๋ฆผ 9์ ๊ฐ๋ค.
๋นํธ๋งต ํ์ผ์ ๋งจ ์์๋ BITMAPFILEHEADER๋ผ๋ ๊ตฌ์กฐ์ฒด๊ฐ ๋ค์ด์จ๋ค. ๊ทธ
๋์ ์ด ๊ฒ์ด ๋นํธ๋งต ํ์ผ์ด๋ฉฐ ์ค์ ๋ด์ฉ ๋ฐ์ดํฐ๋ ์ด๋๋ถํฐ ์์ํ๋์ง
๋ฑ์ ์ ๋ณด๊ฐ ๋ค์ด์จ๋ค. ์ด ๊ตฌ์กฐ์ฒด์ ๋ค๋ฅผ ์ด์ด์ BITMAPINFOHEADER๋ผ๋ ๊ตฌ
์กฐ์ฒด๊ฐ ๋ฐ๋ผ์จ๋ค. ์ด ๊ตฌ์กฐ์ฒด์๋ ์ด ํ์ผ์ ํฌํจ๋ ๋นํธ๋งต ๊ทธ๋ฆผ์ ๋ํ
์ ๋ณด๊ฐ ๋ค์ด์จ๋ค. ์๋ฅผ ๋ค๋ฉด ํญ๊ณผ ๋์ด๋ ์ผ๋ง์ด๊ณ ํ ์ ์ ํํํ๋๋ฐ
๋ช ๋นํธ๋ฅผ ์ฌ์ฉํ๋์ง ๋ฑ์ ์ฌ๋ถ๊ฐ ๋ค์ด์จ๋ค. ์ด ๊ตฌ์กฐ์ฒด์ ๋ค์๋ ๋ฐ๋ก ์ปฌ
๋ฌ ํ ์ด๋ธ์ด ๋ฐ๋ผ์จ๋ค. ๊ทธ๋ฐ๋ฐ ๋ชจ๋ ๋นํธ๋งต ํ์ผ์ ์ปฌ๋ฌ ํ ์ด๋ธ์ด ๋ฐ๋ผ์ค
๋ ๊ฒ์ ์๋๋ค. ์ธ๋ฑ์ค ๋ชจ๋๋ก ์ ์ฅ๋ ๋นํธ๋งต ํ์ผ์ ๊ฒฝ์ฐ์๋ง ์ปฌ๋ฌ ํ ์ด
๋ธ์ด ํ์ํ์ง ํ์ด ์ปฌ๋ฌ๋ ํธ๋ฃจ ์ปฌ๋ฌ์ ๊ฐ์ด ์ ์ ๊ฐ์ผ๋ก ์์ ์์ ์ฝ๋
(RGB)๊ฐ ๋ค์ด๊ฐ ๊ฒฝ์ฐ์๋ ์ปฌ๋ฌ ํ ์ด๋ธ์ด ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ปฌ๋ฌ ํ
์ด๋ธ์ PALETT EENTRY ๊ตฌ์กฐ์ฒด์ ๋ฐฐ์ด๋ก ๊ตฌ์ฑ๋๋ค.
์ฌ๊ธฐ์๋ ์์ 256๊ฐ์ ํญ๋ชฉ์ ๊ฐ๋ ํ ์ด๋ธ์ ๊ตฌ์ฑํ๋ค๊ณ ๊ฐ์ ํ๊ธฐ ๋
๋ฌธ์ PALETTEENTRY ๋ฐฐ์ด์ 256๊ฐ๋ก ๊ณ ์ ํ์๋ค.
PALETTEENTRY ape[256];
===============================================================
๋ฆฌ์คํธ 3 : DXLoadPalette ํจ์
---------------------------------------------------------------
// -----------------------------------------------
// DXLoadPalette : ์ง์ ๋ ๋นํธ๋งต ํ์ผ์ ํ๋ ํธ๋ฅผ ๋ฐํ
// ์ผ๋ก ํ๋ ํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
// -----------------------------------------------
IDirectDrawPalette *DXLoadPalette(LPCSTR lpBitmapFilename)
{
IDirectDrawPalette* ddpal;
int i;
int n;
int fh;
PALETTEENTRY ape[256];
if (lpBitmapFilename && (fh=_lopen(lpBitmapFilename, OF_READ)) != -1){
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
_lread(fh, &bf, sizeof(bf));
// BITMAPFILEHEADER ๊ตฌ์กฐ์ฒด๋ฅผ ์ฝ์ด๋ค์ธ๋ค.
_lread(fh, &bi, sizeof(bi));
// BITMAPINFOHEADER ๊ตฌ์กฐ์ฒด๋ฅผ ์ฝ์ด๋ค์ธ๋ค.
_lread(fh, &ape, sizeof(ape));
// ์ปฌ๋ฌ ํ
์ด๋ธ์ ๋ด์ฉ์ ์ฝ์ด๋ค์ธ๋ค.
// ์ผ๋จ ๋ฌด์กฐ๊ฑด 256๊ฐ๋ฅผ ์ฝ์ด๋ค์ธ๋ค.
_lclose(fh);
// ๋ณ์ n์ผ๋ก๋ ์ปฌ๋ฌ ํ
์ด๋ธ์ ํญ๋ชฉ์๋ฅผ ๊ณ์ฐํ๋ค.
if (bi.biSize != sizeof(BITMAPINFOHEADER))
n = 0;
else if (bi.biBitCount > 8)
// ํ ์ ์ 8๋นํธ ์ด์์ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ ์ธ๋ฑ์ค
// ๋ชจ๋๊ฐ ์๋๋ค.
n = 0;
else if (bi.biClrUsed == 0)
n = 1 << bi.biBitCount;
else
n = bi.biClrUsed;
// ์ปฌ๋ฌ ํ
์ด๋ธ์ ๋ด์ฉ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ์
// ํ์์ ๋ง๊ฒ ์กฐ์ ํ๋ค.
for (i=0;i<n;i++) {
BYTE r = ape[i].peRed;
ape[i].peRed = ape[i].peBlue;
ape[i].peBlue = r;
}
}
if (pDirectDrawObj->CreatePalette(DDPCAPS_8BIT |
DDPCAPS_ALLOW256, ape, &ddpal, NULL)!= DD_OK) {
return NULL;
} else {
return ddpal;
}
}
===============================================================
์ฝ์ด๋ค์ธ ์ปฌ๋ฌ ํ ์ด๋ธ์ ๋ด์ฉ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ CreatePalette ํจ
์๋ฅผ ์ด์ฉํด ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ ๊ฐ์ฒด๋ก ๋ง๋ค ์ ์๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ
์ ์ฃผ์ํ ๊ฒ์ ํ ์์์ ํํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ RGB์ ๋ฐฐ์ด ์์๊ฐ
PALETTEENT RY ๊ตฌ์กฐ์ฒด์ CreatePalette ํจ์์ ์ธ์์์์ ์ฝ๊ฐ ๋ค๋ฅด๋ค๋
๊ฒ์ด๋ค.
๊ทธ๋์ ์ด ์์๋ฅผ ๋ง์ถ๊ธฐ ์ํด CreatePalette ํจ์์ ํธ์ถ์ ์์ ์ฝ๊ฐ์
์กฐ์ ์์ ์ ์ํํ๊ณ ์๋ค. Red์ Blue์ ์์น๋ฅผ ๋ฐ๊พธ์ด ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋
๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ CreatePalette ํจ์๋ฅผ ํธ์ถํ ๋๋ ์ด ํ๋ ํธ
๊ฐ 256 ์์์ ๊ฐ๋ ๊ฒ์์ ๋ช ์ํ๊ธฐ ์ํด ์ธ์๋ก DDPCAPS_8BIT |
DDPCAPS_ALLOW256์ ์ค๋ค. ๊ฒฐ๊ณผ๋ก ์์ฑ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ ๊ฐ์ฒด๋
pDirectDrawPal์ด๋ผ๋ ๋ณ์์ ์ ์ฅ๋๋ฉฐ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ ๊ฐ์ฒด๊ฐ ๋๋ค.
์ด ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๋ฉด ๊ฐ์ฒด์์ ์ฌ์ฉํ๋๋ก ํ๋ ค๋ฉด(์ฆ, ๋ฉด ๊ฐ์ฒด์์ ์ด ํ๋
ํธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ ค๋ฉด) ๋ฉด ๊ฐ์ฒด์ SetPalette ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ
๋ค. ๊ทธ๋์ DXLoadPalette ํจ์์ ํธ์ถ์ด ์ฑ๊ณต์ ์ผ๋ก ๋๋๋ฉด ๋ค์๊ณผ ๊ฐ์
์ฝ๋๊ฐ ์ํ๋๊ณ ์๋ค.
// ํ๋ ํธ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์๋ค๋ฉด ์ด๋ฅผ ์ค์ ํ๋ค.
// ์ด ๋ถ๋ถ์ ํธ์ถ์ ์คํ์คํฌ๋ฆฐ ๋ฉด์ ์์ฑ์ ์์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค.
if (pPrimarySurface->SetPalette(pDirectDrawPal) != DD_OK)
return -1;
์ด์ ํ๋ ํธ ๊ฐ์ฒด์ ์์ฑ๊ณผ ๊ทธ๊ฒ์ ์ฃผ ๋ฉด ๊ฐ์ฒด์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ๋๋ฌ๋ค.
๋ค์์ผ๋ก ๋ฐฐ๊ฒฝ ๋นํธ๋งต๊ณผ ๋นํ๊ธฐ ์คํ๋ผ์ดํธ์ ํด๋นํ๋ ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ
๋ ์ผ์ด ๋จ์๋ค. ์ด๋ DXLoadBitmap์ด๋ ํจ์๋ฅผ ํตํด์ ์ํํ๋๋ฐ ๋ด์ฉ
์ ๋ฆฌ์คํธ 4์ ๊ฐ๋ค.
DXLoadBitmap ํจ์๋ ์ธ์๋ก ์ฃผ์ด์ง ๋นํธ๋งต ํ์ผ์ ๋ก๋ํ์ฌ ๊ทธ ๋ด์ฉ์ ๋ฐ
ํ์ผ๋ก ์คํ์คํฌ๋ฆฐ ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ๊ทธ ๊ณผ์ ์์ ์คํ์คํฌ๋ฆฐ ๋ฉด ๊ฐ์ฒด
์์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด CreateOffScreenSurface๋ผ๋ ํจ์๋ฅผ ํธ์ถํ๊ณ ๊ฑฐ๊ธฐ
์ ๋นํธ๋งต ํ์ผ์ ๋ด์ฉ์ ๋ณต์ฌํ๊ธฐ ์ํด DXCopyBitmap์ด๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ
๋ค.
๋จผ์ ๋นํธ๋งต ํ์ผ์ ๋ด์ฉ์ ์ฝ์ด๋ค์ด๊ธฐ ์ํด LoadImage๋ผ๋ API๋ฅผ ํธ์ถํ
๋ค. ์ด ํจ์์ ๋ฆฌํด๊ฐ์ผ๋ก๋ ๋นํธ๋งต ํธ๋ค์ด ๋์ด์จ๋ค. ๋นํธ๋งต ํธ๋ค
์ ์ธ์๋ก GetObject๋ผ๋ API๋ฅผ ํธ์ถํ์ฌ ๋นํธ๋งต์ ํญ(bm.bmWidth)๊ณผ ๋
์ด(bm.bmHeight)๋ฅผ ์์๋ธ ๋ค์ ์ด๋ฅผ ์ธ์๋ก ํ์ฌ ์คํ์คํฌ๋ฆฐ ๋ฉด ๊ฐ์ฒด๋ฅผ ์
์ฑํ๊ธฐ ์ํด CreateOffScreenSurface ํจ์๋ฅผ ํธ์ถํ๋ค. ์คํ์คํฌ๋ฆฐ ๋ฉด ๊ฐ์ฒด
์ ์์ฑ์ด ์ฑ๊ณตํ๋ฉด ๋นํธ๋งต ํ์ผ์ ๋ด์ฉ์ ๋ณต์ฌํ๊ธฐ ์ํด DXCopyBitmap ํจ
์๋ฅผ ํธ์ถํ๋ค. ์ด์ CreateOffScreenSurface์ DXCopyBitmap ํจ์์ ๋ด์ฉ
์ ์ดํด๋ณด์(๋ฆฌ์คํธ 5, 6 ์ฐธ์กฐ).
CreateOffScreenSurface ํจ์๋ ์ธ์๋ก ์ฃผ์ด์ง ํฌ๊ธฐ์ ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ
๋ ์ญํ ์ ํ๋ค. ์ด ์ญ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ CreateSurface ํจ์๋ฅผ ์ด
์ฉํ๋๋ฐ ์์ฑํ๊ณ ์ ํ๋ ๋ฉด ๊ฐ์ฒด๋ฅผ ๊ธฐ์ ํ๋ DDSURFACEDESC ๊ตฌ์กฐ์ฒด์ ์ด
๊ธฐํ ๋ฐฉ๋ฒ์ด ์์ ์ฃผ ๋ฉด ๊ฐ์ฒด์ ์์ฑ์์๋ ๋ฌ๋ผ์ง๋ค. DDSURFAC EDESC ๊ตฌ
์กฐ์ฒด์ ddsCaps.dwCaps ํ๋์๋ DDS CAPS _OFFSCREENPLAIN๋ผ๋ ๊ฐ์ ์ง์
ํ๊ณ dwWidth์๋ ํญ์ ์ง์ ํ๊ณ dwHeight ํ๋์๋ ๋์ด๋ฅผ ์ง์ ํ๋ค. ์
์ฑ์ด ์ฑ๊ณต์ ์ผ๋ก ๋๋๋ฉด ์ปฌ๋ฌํค๋ฅผ ์ง์ ํ๋ค. ์ปฌ๋ฌํค์ ์์ฑ์๋
๋ฉด ๊ฐ์ฒด์ SetColorKey ํจ์๋ฅผ ์ด์ฉํ๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ก DDCKEY_SRCBLT
๋ฅผ ์ฃผ์๊ธฐ ๋๋ฌธ์ ์์ค ์ปฌ๋ฌํค๋ฅผ ์ง์ ํ ์ ์ด ๋๋ค.
- ๊ณ์ -
- the end of this article -
DirectX Programming (4)
===============================================================
๋ฆฌ์คํธ 4 : DXLoadBitmap ํจ์
---------------------------------------------------------------
// -------------------------------------------------
// DXLoadBitmap : ์ง์ ๋ ๋นํธ๋งต ํ์ผ์ ๋ก๋ํ์ฌ ์คํ์คํฌ๋ฆฐ
// ๋ฉด์ ์์ฑํ๋ค.
// -------------------------------------------------
IDirectDrawSurface *DXLoadBitmap(LPCSTR lpBitmapFilename)
{
HBITMAP hbm;
BITMAP bm;
IDirectDrawSurface *pdds;
hbm = (HBITMAP)LoadImage(NULL, lpBitmapFilename,
IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if (hbm == NULL)
return NULL;
GetObject(hbm, sizeof(bm), &bm);
pdds = CreateOffScreenSurface(bm.bmWidth, bm.bmHeight);
if (pdds)
DXCopyBitmap(pdds, hbm, bm.bmWidth, bm.bmHeight);
DeleteObject(hbm);
return pdds;
}
===============================================================
===============================================================
๋ฆฌ์คํธ 5 : CreateOffScreenSurface ํจ์
---------------------------------------------------------------
// ----------------------------------------------
// CreateOffScreenSurface : ์ฃผ์ด์ง ํฌ๊ธฐ๋ฅผ ๊ฐ๋ ์คํ์คํฌ๋ฆฐ
// ๋ฉด์ ์์ฑํ๋ค.
// ----------------------------------------------
IDirectDrawSurface *CreateOffScreenSurface(int dx, int dy)
{
DDSURFACEDESC ddsd;
IDirectDrawSurface *pdds;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = dx;
ddsd.dwHeight = dy;
if (pDirectDrawObj->CreateSurface(&ddsd, &pdds, NULL) != DD_OK){
return NULL;
} else {
// ์ปฌ๋ฌํค๋ฅผ ์ค์ ํ๋ค.
// ์ฌ๊ธฐ์ ์ปฌ๋ฌํค๋ ํฐ ์์ผ๋ก ํ๋ค.
DDCOLORKEY ddck;
ddck.dwColorSpaceLowValue = 0xff;
ddck.dwColorSpaceHighValue = 0xff;
pdds->SetColorKey(DDCKEY_SRCBLT, &ddck);
return pdds;
}
}
===============================================================
DXCopyBitmap ํจ์๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ฃผ์ด์ง ๋ฉด ๊ฐ์ฒด์ ๋ด์ฉ์, ๋ ๋ฒ์งธ
์ธ์๊ฐ ๊ฐ๋ฆฌํค๋ ๋นํธ๋งต ํธ๋ค์ ๋ด์ฉ์ผ๋ก ๋ณ๊ฒฝํ๋ ์ญํ ์ ํ๋ค. ์ธ ๋ฒ์งธ
์ธ์์ ๋ค ๋ฒ์งธ ์ธ์๋ก๋ ๋นํธ๋งต์ ํญ๊ณผ ๋์ด๋ฅผ ๋ฐ๋๋ค. ์ค์ ์ ์ฐจ๋ API
๋ MFC์์ ๋นํธ๋งต ํธ๋ค์ ๋ด์ฉ์ ํ๋ฉด์ผ๋ก ๋ณต์ฌํ๋ ์ ์ฐจ์ ๋์ผํ๋ค. ๋จผ
์ ๋นํธ๋งต ํธ๋ค์ ๋ด์ฉ์ผ๋ก ๊ฐ๋ ๋๋ฐ์ด์ค ์ปจํ ์คํธ๋ฅผ ๋ฉ๋ชจ
๋ฆฌ์ ๋ง๋ค์ด๋๋ค(CreateCompatibleDC์ SelectObject ํจ์ ํธ์ถ๋ถ).
๊ทธ ๋ค์ ๋ฉด ๊ฐ์ฒด์ ๋๋ฐ์ด์ค ์ปจํ ์คํธ ํธ๋ค์ ์ป์ด๋ด๊ณ (pdds->GetDC)
BitBlt ํจ์(์ด ํจ์๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ํจ์๊ฐ ์๋ GDI ํจ์์ด๋ค)์ ํธ
์ถ์ ํตํด ๋นํธ๋งต์ ๋ด์ฉ์ ๋ฉด ๊ฐ์ฒด๋ก ๋ณต์ฌํ๋ค.
===============================================================
๋ฆฌ์คํธ 6 : DXCopyBitmap ํจ์
---------------------------------------------------------------
// ----------------------------------------------
// DXCopyBitmap : ์ง์ ๋ ๋ฉด์ผ๋ก ์ง์ ๋ ๋นํธ๋งต ๋ฆฌ์์ค์
// ๋ด์ฉ์ ๋ณต์ฌํ๋ค.
// ----------------------------------------------
HRESULT DXCopyBitmap(IDirectDrawSurface *pdds,
HBITMAP hbm, int dx, int dy)
{
HDC hdcImage;
HDC hdc;
HRESULT hr;
HBITMAP hbmOld;
hdcImage = CreateCompatibleDC(NULL);
hbmOld = (HBITMAP)SelectObject(hdcImage, hbm);
if ((hr = pdds->GetDC(&hdc)) == DD_OK)
{
BitBlt(hdc, 0, 0, dx, dy, hdcImage, 0, 0,
SRCCOPY);
pdds->ReleaseDC(hdc);
}
SelectObject(hdcImage, hbmOld);
DeleteDC(hdcImage);
return hr;
}
===============================================================
===============================================================
๋ฆฌ์คํธ 7 : UpdateFrame ํจ์
---------------------------------------------------------------
// ----------------------------------------------
// UpdateFrame : ์ฃผ๊ธฐ์ ์ผ๋ก ํธ์ถ๋์ด ํ์๋ฉด๊ณผ ์ ์๋ฉด์
// ๋ด์ฉ์ ๊ต์ฒดํ๋ค.
// ----------------------------------------------
void UpdateFrame(void)
{
RECT rcRect = { 0, 0, 26, 32 };
HRESULT ddrval;
static int xpos=(640-26)/2, ypos=440;
// ๋ฐฐ๊ฒฝ ๋ฉด์ ๊ทธ๋ฆฐ๋ค.
if (DrawBackground() == DDERR_SURFACELOST)
RestoreSurface();
// ํค๋๋ฆผ์ ์ฒดํฌํ์ฌ ๋ฉ์ธ ์บ๋ฆญํฐ๋ฅผ ์์ง์ธ๋ค.
if (GetAsyncKeyState(VK_LEFT) < 0) // ์ผ์ชฝ์ผ๋ก
xpos -= 5;
else if (GetAsyncKeyState(VK_RIGHT) < 0)
// ์ค๋ฅธ์ชฝ์ผ๋ก
xpos += 5;
else if (GetAsyncKeyState(VK_UP) < 0) // ์๋ก
ypos -= 5;
else if (GetAsyncKeyState(VK_DOWN) < 0)
// ์๋๋ก
ypos += 5;
// ์ขํ๊ฐ ๊ฒฝ๊ณ๋ฅผ ๋ฒ์ด๋ฌ๋์ง ๊ฒ์ฌํ๋ค.
if (xpos < 0)
xpos = 0;
else if (xpos > 640-26)
xpos = 640-26;
if (ypos < 0)
ypos = 0;
else if (ypos > 480-32)
ypos = 480-32;
// ๋ฉ์ธ ์บ๋ฆญํฐ๋ฅผ ๊ทธ๋ฆฐ๋ค.
ddrval = pBackSurface->BltFast
(xpos, ypos, pMainCharacter, &rcRect,
DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
// ์ ์ ๋ฉด๊ณผ ํ์ ๋ฉด์ ๊ต์ฒดํ๋ค.
ddrval = pPrimarySurface->Flip(NULL,
DDFLIP_WAIT);
}
===============================================================
UpdateFrame ํจ์
์ด์ ๋ถํฐ ํ ์ผ์ ๋ฐ๋ก ์์ ์ ์ผ ์ฒ์ WinMain์์ ๋ณด์๋ ๊ฐ์ฅ ์ค์ํ
ํจ์ Updateframe์ ๋ด์ฉ์ ์ดํด๋ณด๋ ์ผ์ด๋ค. UpdateFrame์ ๊ฒ์์ ์ฅ๋ฉด
์ ํ๋ ํ๋์ฉ ๊ตฌ์ฑํ์ฌ ์ด๋ฅผ ํ์ด์ง ํ๋ฆฝํ์ ํตํด ํ๋ฉด์ผ๋ก ๋ด๋ณด๋ด๋ ์ผ
์ ๋ด๋นํ๋ค. ์ด ํจ์์ ๋ด์ฉ์ ๋ฆฌ์คํธ 7๊ณผ ๊ฐ๋ค.
์๋ก์ด ์ฅ๋ฉด์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค. ๋จผ์ ๋ฐฐ๊ฒฝ ๋นํธ๋งต์ ๋ด์ฉ์ ํ
์ ๋ฉด์ ๋ณต์ฌํ๋ค. ๋ค์์ผ๋ก ์คํ๋ผ์ดํธ์ ๋ด์ฉ์ ํ์ ๋ฉด์ ๋ฎ์ด์จ์ฃผ๋
๋ฐ ํค ์ ๋ ฅ์ด๋ ์ํฉ ๋ณํ ๋ฑ์ ๊ณ ๋ คํด ์คํ๋ผ์ดํธ์ ์ถ๋ ฅ ์์น๋ฅผ ๋ณด์ ํด์ค
๋ค. ๋ฐฐ๊ฒฝ์ ๊ทธ๋ ค์ฃผ๊ธฐ ์ํ ์ฉ๋๋ก DrawBackground๋ผ๋ ํจ์๋ฅผ ํธ์ถํ๋ค(๋ฆฌ
์คํธ 8 ์ฐธ์กฐ).
DrawBackground ํจ์๋ ๋จ์ํ ๋ฐฐ๊ฒฝ์ ๊ทธ๋ ค์ฃผ๋ ๊ฒ์ด ์๋๋ค. ๋นํ๊ธฐ๊ฐ ๊ฐ
๋งํ ์์ด๋ ์์ผ๋ก ์งํ๋๋ ๋ฏํ ํจ๊ณผ๋ฅผ ์ฃผ๊ธฐ ์ํด ๋ฐฐ๊ฒฝ ๋นํธ๋งต์ ์กฐ๊ธ
์ฉ ํ์ ์์ผ๊ฐ๋ฉฐ ๋ฟ๋ ค์ค๋ค. nStartRow๋ผ๋ ๋ณ์๋ฅผ ๋์ด ๋ฐฐ๊ฒฝ ๋นํธ๋งต ์ถ๋ ฅ
์ ์ด ์ค๋ถํฐ ๋ง์ง๋ง ์ค๊น์ง๋ฅผ ํ์ ๋ฉด์ ์์ ์ถ๋ ฅํ๊ณ ์ฒซ ๋ฒ์งธ ์ค๋ถํฐ
nStartRow์ ์ ์ค๊น์ง๋ฅผ ํ์ ๋ฉด์ ๊ทธ ๋ค์ ์ด์ด์ ์ถ๋ ฅํ๋ค. ์ถ๋ ฅ์ด ๋๋
๋ฉด nStartRow์ ๊ฐ์ 5์ฉ ์ฆ๊ฐ์์ผ ๋ง์น ๋ฐฐ๊ฒฝ ๋ฉด์ด ์์ผ๋ก ์งํํ๋ ๋ฏ
ํ ํจ๊ณผ๋ฅผ ์ค๋ค. ์ถ๋ ฅ์ด ํ์ ๋ฉด์ผ๋ก ๋๊ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ์ ๋ฉด ๊ฐ์ฒด
์ BltFast ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
์ฒซ ๋ฒ์งธ ์ธ์์ ๋ ๋ฒ์งธ ์ธ์๋ก๋ ์ถ๋ ฅ์ด ์ด๋๋ก ๋๊ฐ ๊ฒ์ธ์ง ๊ทธ ์์ ์์น
๋ฅผ ๋ํ๋ธ๋ค. ์ธ ๋ฒ์งธ ์ธ์๋ก๋ ์์ค ๋ฉด ๊ฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ์ง์ ํ๋ ๋ถ๋ถ์ด
๋ค. ๋ค ๋ฒ์งธ ์ธ์๋ก ์์ค ๋ฉด ๊ฐ์ฒด์ ์ด๋ ์์ญ์ ๋ณต์ฌํ ๊ฒ์ธ์ง๋ฅผ ์ง์ ํ
๋ค. BltFast ํจ์์ ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ ๊ฒ์ผ๋ก Blt ํจ์๊ฐ ์๋๋ฐ ์ด๋
๋ณต์ฌ์ ํ๋๋ ์ถ์๊น์ง ๊ฐ๋ฅํ๋ค. BltFast๋ 1:1 ๋ณต์ฌ๋ง ๊ฐ๋ฅํ๋ค. ๋ฐฐ๊ฒฝ
๋ฉด์ ๋ณต์ฌ์์๋ ์ปฌ๋ฌํค๊ฐ ํ์์๋ค(์ฒ์ ๋ฟ๋ ค์ง๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณด์กดํด
์ผํ ๋ฐฐ๊ฒฝ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค). ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ BltFast ํจ์์ ๋ง์ง๋ง ์ธ์
๋ฅผ ๋ณด๋ฉด DDBLTFAST_SRCCOLORKEY๋ผ๋ ๊ฐ์ ์ง์ ํ๊ณ ์๋ค. ๋ค์
UpdateFrame ํจ์๋ก ๋์๊ฐ์ ๋ฐฐ๊ฒฝ ๋ฉด์ ์ถ๋ ฅ์ด ๋๋๋ฉด ํค ์ ๋ ฅ์ ๊ฒ์ฌํ
๋ค. ์ฌ์ค ํค ์ ๋ ฅ์ ์ฒดํฌ๋ Update Frame์ด ์๋ WM_KEY* ๋ฉ์์ง์์ ์ํ
ํด๋ ๊ด๊ณ์์ง๋ง ๋ณด๋ค ๋ ์ค์๊ฐ์ผ๋ก ์ฒดํฌํ๋ ค๋ฉด ์ฌ๊ธฐ์ ์ํํด์ฃผ๋ ๊ฒ์ด
๋ ์ข๋ค. ๋ฐฉํฅํค๋ฅผ ์ฒดํฌํ์ฌ ๋นํ๊ธฐ ์คํ๋ผ์ดํธ์ ์ถ๋ ฅ ์์น๋ฅผ ๋ณด์ ํด ์ค
๋ค. ์ถ๋ ฅ ์์น๋ xpos์ ypos ๋ณ์์ ๋ค์ด๊ฐ๋ค. ์คํ๋ผ์ดํธ์ ์ถ๋ ฅ ์ขํ๊ฐ
๊ฒฐ์ ๋๋ฉด ํ์ ๋ฉด์ ๊ทธ ๋ด์ฉ์ ์ถ๋ ฅํ๊ณ ์ฃผ ๋ฉด ๊ฐ์ฒด์ Flip ํจ์๋ฅผ ์ด์ฉ
ํด ์ฃผ ๋ฉด๊ณผ ํ์ ๋ฉด์ ๋ด์ฉ์ ๊ต์ฒดํ์ฌ ํ์ ๋ฉด์ ๋ด์ฉ์ด ์ฌ์ฉ์ ๋์ ๋ณด์ด
๋๋ก ํ๋ค.
// ๋ฉ์ธ ์บ๋ฆญํฐ๋ฅผ ๊ทธ๋ฆฐ๋ค.
ddrval = pBackSurface->BltFast
(xpos, ypos, pMainCharacter, &rcRect,
DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
// ์ ์ ๋ฉด๊ณผ ํ์ ๋ฉด์ ๊ต์ฒดํ๋ค.
ddrval = pPrimarySurface->Flip(NULL, DDFLIP_WAIT);
๋ฆฌ์คํธ 8 : DrawBackground ํจ์
// ----------------------------------------------
// DrawBackground : ๋ฐฐ๊ฒฝ ๋ฉด์ ๋ด์ฉ์ ์คํฌ๋กค์์ผ๊ฐ๋ฉฐ
// ํ์ ๋ฉด์ผ๋ก ๊ทธ๋ ค์ค๋ค.
// ----------------------------------------------
HRESULT DrawBackground()
{
RECT rcRect;
HRESULT ddrval;
static int nStartRow = 0;
// ๋ฐฐ๊ฒฝ ๋นํธ๋งต์ ์ด๋ ์ค๋ถํฐ ์ถ๋ ฅ์ด ์์๋ ์ง๋ฅผ ๋ํ๋ธ๋ค.
rcRect.left = 0;
rcRect.top = nStartRow;
rcRect.right = 640;
rcRect.bottom = 480;
ddrval = pBackSurface->BltFast
(0, 0, pBackground, &rcRect,
DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
if (ddrval != DD_OK)
{
return ddrval;
}
if (nStartRow)
{
rcRect.top = 0;
rcRect.bottom = nStartRow-1;
ddrval = pBackSurface->BltFast
(0, 480-nStartRow, pBackground, &rcRect,
DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
if (ddrval != DD_OK)
{
return ddrval;
}
}
nStartRow += 5;
nStartRow = nStartRow % 480;
return DD_OK;
}
๋ฉด์ ์ ์ค ์ฒ๋ฆฌ
์์ ์ฉ์ด ์ ๋ฆฌ์์ ์ค๋ช ํ๋ ๊ฒ์ฒ๋ผ ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด
๋ฉด ๊ฐ์ฒด์ ๋ด์ฉ์ด ์ฌ๋ผ์ ธ ๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ
๊ฐ ๋์ํ๋ ์๋ ํ๊ฒฝ์ด ํผ์์๋ง ์ฌ๋ ๊ณต๊ฐ์ด ์๋๋ผ ๋ค๋ฅธ ์๋ ํ๋ก๊ทธ๋จ
๋ค๊ณผ ๊ฐ์ด ๊ณต์กดํ๋ ๊ณต๊ฐ์ด๋ฉฐ ๋ํ ๋ค๋ฅธ ์๋ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๋ GDI
๊ฐ ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ค.
๋ค์ด๋ ํธ ํ๋ก๊ทธ๋จ์ ์คํ ์ค์ธ ์ํ์์ ๋ค๋ฅธ ์๋ ํ๋ก๊ทธ๋จ์ ์ ์ด๋ ์ผ
๋ง๋ ์ง ๊ฐ๋ฅํ๋ค. ์ด ๊ฒฝ์ฐ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์์ ์ถ๋ ฅ ๋ชจ๋๋ก GDI๋ฅผ ์ฌ์ฉํ
๊ฒ์ด๊ณ ์ด ๋ GDI๋ ์ถ๋ ฅ ๊ด๋ จ ์์์ ๋ ์ ํด๋ฒ๋ฆฐ๋ค. ์ฆ, ๋ค์ด๋ ํธ ๋๋ก์ฐ
์์ ์ค์ ํด๋จ๋ ๋ด์ฉ์ด ๋ชจ๋ ๊นจ์ ธ๋ฒ๋ฆฌ๊ฒ ๋๋ค.
์ด ํ์์ ๋ฉด์ด ์ ์ค๋์๋ค๊ณ ํ๋ค. ๋ฉด์ ์ ์ค ์ฌ๋ถ๋ ๋ฉด ๊ฐ์ฒด์ IsLost
ํจ์๋ฅผ ๋ถ๋ฌ๋ณด๊ฑฐ๋ ๋ฉด ์ถ๋ ฅ ๊ด๋ จ ํจ์์ ๋ฆฌํด๊ฐ์ด DDERR_SURFACELOST์ธ์ง
๋ฅผ ์ดํด๋ณด๋ฉด ๋๋ค. UpdateFrame ํจ์์์์ ๋ฐฐ๊ฒฝ ๋ฉด์ ์ถ๋ ฅ์์ ๋ฉด์ ์
์ค ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ์ฌ ์ ์ค๋์์ผ๋ฉด ๋ณต๊ตฌํ๋ ๋ถ๋ถ์ด ๋์จ๋ค.
// ๋ฐฐ๊ฒฝ ๋ฉด์ ๊ทธ๋ฆฐ๋ค.
if (DrawBackground() == DDERR_SURFACELOST)
RestoreSurface();
๋ฉด์ด ์ ์ค๋์์ผ๋ฉด RestoreSurface๋ฅผ ํธ์ถํ์ฌ ๋ฉด์ ๋ณต๊ตฌํ๋ค. ์ด ํจ์์
๋ด์ฉ์ ๋ฆฌ์คํธ 9์ ๊ฐ๋ค.
๋ฉด ์์ฒด์ ๋ณต๊ตฌ๋ ๋ฉด ๊ฐ์ฒด์ Restore ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋๋ค. ํ์ง๋ง ์คํ
์คํฌ๋ฆฐ ๋ฉด ๊ฐ์ฒด์ ๊ฒฝ์ฐ ๊ทธ ๋ด์ฉ์ Restore์์ ๋ณต๊ตฌํ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ค
์ ๋ก๋ํด์ฃผ์ด์ผ ํ๋ค. ๊ทธ ์ฉ๋๋ก ์ฌ์ฉํ๋ ํจ์๊ฐ ๋ฐ๋ก DXReLoadBitmap
ํจ์์ด๋ค(๋ฆฌ์คํธ 10 ์ฐธ์กฐ). ์์ ๋ณด์๋ DXLoadBitmap ํจ์์ ๊ทธ ๋ด์ฉ์
๋น์ทํ์ง๋ง ๋ฉด ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ง๋ ์๊ณ ๋ด์ฉ๋ง ๋ค์ ๋ก๋ํ๋ ์ญํ ์
ํ๋ค.
๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด ์ ๊ฑฐ
๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ ์ ๊ฑฐ๋ UpdateFrame ํจ์์ ๋ค์์ ์ํํ๋ค.
....
}
// DirectDraw ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ค.
if (pBackground)
pBackground->Release();
if (pMainCharacter)
pMainCharacter->Release();
if (pPrimarySurface)
pPrimarySurface->Release();
if (pBackSurface)
pBackSurface->Release();
if (pDirectDrawPal)
pDirectDrawPal->Release();
if (pDirectDrawObj)
pDirectDrawObj->Release();
===============================================================
๋ฆฌ์คํธ 9 : RestoreSurface ํจ์
---------------------------------------------------------------
// -----------------------------------------------
// RestoreSurface : ๋ฉด ์ ์ค์ ๋ฉด์ ๋ด์ฉ์ ๋ณต๊ตฌํด์ค๋ค.
// -----------------------------------------------
BOOL RestoreSurface()
{
if (pPrimarySurface && pPrimarySurface->IsLost() != DD_OK) {
pPrimarySurface->Restore();
if (pDirectDrawPal)
pPrimarySurface->SetPalette(pDirectDrawPal);
}
// ๋ฐฐ๊ฒฝ ๋นํธ๋งต์ ๋ณต๊ตฌํ๋ค.
if (pBackground && pBackground->IsLost()!= DD_OK) {
pBackground->Restore();
DXReLoadBitmap(pBackground, "MEDIA\\BACK0000.BMP");
}
// ๋นํ๊ธฐ ๋นํธ๋งต์ ๋ณต๊ตฌํ๋ค.
if (pMainCharacter && pMainCharacter->IsLost()!= DD_OK) {
pMainCharacter->Restore();
DXReLoadBitmap(pMainCharacter, "MEDIA\\SHIP0000.BMP");
}
return TRUE;
}
===============================================================
===============================================================
๋ฆฌ์คํธ 10 : DXReLoadBitmap ํจ์
---------------------------------------------------------------
// ---------------------------------------------
// DXReLoadBitmap : ๋ฉด ์ ์ค์ ๊ฒฝ์ฐ ์คํ์คํฌ๋ฆฐ ๋ฉด์
// ๋ด์ฉ์ ๋ค์ ๋ก๋ํ๋๋ฐ ์ฌ์ฉ๋๋ค.
// ----------------------------------------------
BOOL DXReLoadBitmap(IDirectDrawSurface *pdds,LPCSTR lpBitmapFilename)
{
HBITMAP hbm;
BITMAP bm;
BOOL bSuccess = FALSE;
hbm = (HBITMAP)LoadImage(NULL, lpBitmapFilename, IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if (hbm == NULL)
return NULL;
GetObject(hbm, sizeof(bm), &bm);
if (pdds) {
bSuccess = (DXCopyBitmap(pdds, hbm, bm.bmWidth, bm.bmHeight) == DD_OK) ? TRUE : FALSE;
}
DeleteObject(hbm);
return bSuccess;
}
===============================================================
- ๊ณ์ -
- the end of this article -
์ ๋ชฉ:[๊ฐ์ข] DirectX Programming (5)
๊ธฐํ ์ด ํ๋ก๊ทธ๋จ์ ์๋ ํ๋ก์์ ๋ฅผ ๋ณด๋ฉด WM_ACTIVATEAPP ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ๊ณ ์๋ค. case WM_ACTIVATEAPP : { if (wParam) // ํ๋ก๊ทธ๋จ์ด ํ์ฑํ๋๋ฉด { bPlaying = TRUE; ShowCursor(FALSE); // ์ปค์๋ฅผ ์จ๊ธด๋ค. } else // ํ๋ก๊ทธ๋จ์ด ํ๋ฉด์ผ๋ก ์จ์ผ๋ฉด { bPlaying = FALSE; ShowCursor(TRUE); // ์ปค์๋ฅผ ๋ณด์ด๋๋ก ํ๋ค. } } ์ด ๋ฉ์์ง๋ ์๋๊ฐ ์ ๋ฉด์ผ๋ก ๋์ค๊ฒ ๋๊ฑฐ๋ ํ๋ฉด์ผ๋ก ์จ๊ฒ ๋๋ฉด ๋ฐ์ํ ๋ ๋ฉ์์ง์ด๋ค. ์๋ ํ๋ก์์ ์ ์ธ ๋ฒ์งธ ์ธ์์ธ wParam์ผ๋ก ์ด ์๋๊ฐ ์ ๋ฉด์ผ๋ก ๋์ค๋ ๊ฒ์ธ์ง ์๋๋ฉด ํ๋ฉด์ผ๋ก ์จ๋ ๊ฒ์ธ์ง์ ์ฌ๋ถ๋ฅผ ํ๋จ ํ ์ ์๋ค. wParam์ด TRUE์ด๋ฉด ์ ๋ฉด์ผ๋ก ๋์ค๋ ๊ฒ์ด๊ณ FALSE์ด๋ฉด ํ๋ฉด์ผ๋ก ์จ๋ ๊ฒ ์ด๋ค. ์ฌ๊ธฐ์๋ ์ด ํ๋ก๊ทธ๋จ์ด ์ ๋ฉด์ ์์ ๋๋ง ๋์ํ๋๋ก ํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ์ ๋ฉด์ผ๋ก ๋์ฌ ๋๋ง bPlaying ๋ณ์์ ๊ฐ์ TRUE๋ก ์ค์ ํ๋ค. ๋ํ ์ด ํ๋ก๊ทธ๋จ์ ๋ง์ฐ์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ๋ก๊ทธ๋จ์ด๊ธฐ ๋๋ฌธ์ ๋ง์ฐ์ค ํฌ์ธํฐ๊ฐ ๋ณด์ธ๋ค๋ฉด ์ด์ํ ๊ฒ์ด๋ค. ๊ทธ๋์ ShowCursor ํจ์๋ฅผ ์ด์ฉํด ์ปค์ ์ ๋ณด์ ์ฌ๋ถ๋ ์กฐ์ ํ๊ณ ์๋ค. ์์์ ์ค๋ช ์ผ๋ก ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋จํ ํ๋ก๊ทธ๋จ์ ์ดํด๋ณด์ ๋ค. ์ด ํ๋ก๊ทธ๋จ์ ์ถ๊ฐ๋ก ๋ค์ด๋ ํธ ์ฌ์ด๋์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ์ํฅ ํจ๊ณผ๋ ๋ผ ์ ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํ๋ก๊ทธ๋จ์ด ์ง์ง ์ํ ๊ฒ์์ด ๋๋ ค๋ฉด ์ฌ ๋ฌ ๊ฐ์ ์บ๋ฆญํฐ๋ฅผ ์ถ๊ฐํด์ผํ๊ณ ๊ฐ ์บ๋ฆญํฐ๊ฐ์ ์์ง์์ด๋ ์๊ด๊ด๊ณ ๋ฑ์ ์ ํด์ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์ด์ผ ํ ๊ฒ์ด๋ค. ์บ๋ฆญํฐ๊ฐ์ ์ถฉ๋์ ์ด๋ป๊ฒ ์ฒดํฌํ ๊ฒ์ธ์ง ๋ ์ ์์ ๋ฐ๋ผ ์์ง์์ ๋น ๋ฅด๊ฒ ํ๋ค๋ ์ง ํญํ์ ๋น๋๋ฅผ ๋์ธ๋ค๋ ์ง ์๊ฐํด์ฃผ์ด์ผ ํ ๊ฒ์ ๋ฌด๊ถ๋ฌด์งํ ๊ฒ์ด๋ค. ๋ค๋ง ์ด๋ฐ ์์๋ค์ ๋ค์ด๋ ํธ ๋๋ก์ฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ ์๋ ๊ฒ์ด์ง ๋ค์ด๋ ํธ ๋๋ก์ฐ์์ ํด์ค ์ ์ ๋ ๊ฒ์ ์๋๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ ํผ๋ฐ์ค ์ฌ๊ธฐ์์๋ ์์์ ์ฌ์ฉํ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ด๋ จ ํจ์๋ค์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค. ๊ฐ ๊ฐ์ฒด๋ณ๋ก ์ ๋ฆฌํ๋๋ก ํ๊ฒ ๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ ๋ฉค๋ฒ ํจ์ ์ด ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ๋ฉค๋ฒ ํจ์๋ ๋๋ต ๊ทธ ์๊ฐ 20๊ฐ ์ ๋ ๋๋๋ฐ ๊ทธ ์ค์ ์ ํ์ํ ๊ฒ๋ค๋ง ์ธ๊ธํ๋๋ก ํ๊ฒ ๋ค. ๋จผ์ ์ธ๊ธํ ๊ฒ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ์ ๋ฉค๋ฒ ํจ์๊ฐ ์๋๋ผ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ๋ ์ญํ ์ ํ ๋ DirectDraw Create ํจ์์ด๋ค. DirectDrawCreate ํจ์ ์ด ํจ์๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ์์ ๊ฐ์ฅ ์ค์ํ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด๋ฅผ ์์ฑ ํด์ฃผ๋ ํจ์์ด๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ๊ฐ COM ์ธํฐํ์ด์ค๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ๋ ํ์ง๋ง ์ธํฐํ์ด์ค์ ์์ฑ๊น์ง COM ํ๋ก๊ทธ๋๋ฐ์์ ํ๋ฏ์ด ํ๊ฒ๋๋ฉด ๊ฐ๋ฐ ์๋ค์ด ๋ถ๋ด๊ฐ์ ๋๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฝ๊ฒ ํด์ค ์ ์๋๋ก ๋ณ๋์ ๋์ฐ๋ฏธ ํจ์(Helper Function)๋ฅผ ์ ๊ณตํด์ค๋ค. ์ด๋ฐ ํจ์๋ ๋ค์ด๋ ํธX์ ๋ค ๋ฅธ ๊ตฌ์ฑ์์์๋ ๋์ผํ๊ฒ ์ ์ฉ๋๋ค. DirectDrawCreate ํจ์์ ์ํ์ ๋ค์ ๊ณผ ๊ฐ๋ค. HRESULT DirectDrawCreate(GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter); ์ธ์๋ฅผ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. ๋จผ์ ์ฒซ ๋ฒ์งธ ์ธ์์ธ lpGUID๋ ์์ฑํ๊ณ ์ ํ๋ ๋ค์ด๋ ํธ๋๋ก์ฐ ์ธํฐํ์ด์ค์ ์ด๋ฆ์ ํด๋นํ๋ GUID(Globally Unique IDentifier)๋ฅผ ์ง์ ํ๋ ๋ถ๋ถ์ด๋ค. ๋๊ฐ NULL์ ์ง์ ํ๋๋ฐ ๊ทธ๋ฌ ๋ฉด ํ์ฌ ์ค์ ๋ ๋ํดํธ ๋์คํ๋ ์ด ๋๋ผ์ด๋ฒ๋ฅผ ๋ฐํ์ผ๋ก IDirectDraw ์ธํฐ ํ์ด์ค๋ฅผ ์์ฑํ์ฌ ๊ทธ ํฌ์ธํฐ๋ฅผ ๋ ๋ฒ์งธ ์ธ์์ธ lplpDD์ ๋ฃ์ด ์ค๋ค. ๋ ๋ฒ ์งธ ์ธ์์ธ lplpDD๋ ์ค์ ๋ก ์์ฑ๋ IDirectDraw ์ธํฐํ์ด์ค์ ํฌ์ธํฐ๋ฅผ ๋ฐ๋ ๋ถ๋ถ์ผ๋ก ํฌ์ธํฐ์ ํฌ์ธํฐ ํ์ ์์ ๋ช ์ฌํ๊ธฐ ๋ฐ๋๋ค. ๋ง์ง๋ง ์ธ ๋ฒ ์งธ ์ธ์๋ COM์ ๋ํ ์๋นํ ์ง์์ ํ์๋ก ํ๋ ๋ถ๋ถ์ธ๋ฐ ์ผ๋จ NULL๋ก ์ง์ ํ๋ค๊ณ ๋ง ์์๋๊ธฐ ๋ฐ๋๋ค. COM์๋ ์ธ๋ถ Unknown์ด๋ผ๋ ๊ฒ์ ํตํด COM ๊ฐ์ฒด๊ฐ์ ํฌํจ(aggregation)์ด ๊ฐ๋ฅํ๋ฐ ์ด์ ์ฐ๊ด๋ ๊ธฐ๋ฅ์ด ๋ค. ์ธํฐํ์ด์ค์ ์์ฑ์ ์ฑ๊ณตํ๋ฉด ๋ฆฌํด๊ฐ์ DD_OK๊ฐ ๋๋ค. ์คํจํ๋ฉด ์๋ฌ ์ฝ๋๊ฐ ๋ฆฌํด๋๋ค. SetCooperativeLevel ํจ์ ํ์คํฌ๋ฆฐ ๋ชจ๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง ์๋๋ฉด ์๋ ๋ชจ๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ํจ์์ด๋ค. ํ์คํฌ๋ฆฐ ๋ชจ๋๋ ๋ง๊ทธ๋๋ก ํ๋ฉด ์ ์ฒด๋ฅผ ๋ค์ด๋ ํธ ๋๋ก์ฐ ์ ์ถ๋ ฅ ๋ฒ์๋ก ๋ง๋๋ ๊ฒ์ด๋ค. ์๋ ๋ชจ๋๋ ์๋๋ฅผ ํ๋ ๋ง๋ค์ด ๊ทธ ์๋ ๋ก๋ง ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ์ถ๋ ฅ์ ๋ด๋ณด๋ด๋ ๊ฒ์ด๋ค. ํ๋ก๊ทธ๋จํ๊ธฐ๋ ํ์๊ฐ ๋ ๊น๋ค๋กญ๋ค. ํจ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค. HRESULT SetCooperativeLevel(HWND hWnd, DWORD dwFlags); ์ฒซ ๋ฒ์งธ ์ธ์์ธ hWnd๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ์ถ๋ ฅ์ด ๋๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ์๋ ํธ๋ค์ด๋ค. ๋ ๋ฒ์งธ ์ธ์์ธ dwFlags๋ ํ 3๊ณผ ๊ฐ์ ๊ฐ๋ค์ ๊ฐ์ง ์ ์ ๋ค(๋นํธํฉ๋ ๊ฐ๋ฅํ๋ค). ์๋ 98๊ณผ ์๋ NT 5.0์์๋ง ์ฌ์ฉํ ์ ์๋ ํ ๋๊ทธ๋ค๋ ์๋๋ฐ ์ผ๋จ ์ฌ๊ธฐ์ ์ค๋ช ์ ์ ์ธํ์๋ค. ๋ ๋ฒ์งธ ์ธ์์์ ์ค์ํ ๊ฒ์ DDSCL_EXCLUSIVE(ํ์คํฌ๋ฆฐ ๋ชจ๋)์ DDSCL_NORMAL (์๋ ๋ชจ๋)๋ ์ค์ ํ๋๋ ์ ์ด๋ ๋ฐ๋์ ์ง์ ๋์ด์ผ ํ๋ค ๋ ์ ์ด๋ค. ๋ ํ์คํฌ๋ฆฐ ๋ชจ๋๋ก ์ง์ ๋์์ ๊ฒฝ์ฐ ๊ทธ ์ ์ฒด ํ๋ฉด์ ํด์๋ ์ ์ปฌ๋ฌ ๋นํธ์๋ฅผ ์ง์ ํ๊ธฐ ์ํด SetDisplayMode์ ๊ฐ์ ๋ฉค๋ฒ ํจ์๋ฅผ ๋ฐ๋ ์ ํธ์ถํด์ผ ํ๋ค. SetDisplayMode ํจ์ SetDisplayMode๋ ๋์คํ๋ ์ด ๋๋ฐ์ด์ค ํ๋์จ์ด์ ๋ชจ๋๋ฅผ ๊ฒฐ์ ํ๋ค. ๊ตฌ ๋ฒ ์ ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ์์๋ ์ด ํจ์์ ์ธ์๊ฐ 3๊ฐ๋ฟ์ด์๋๋ฐ ์ต๊ทผ ๋ฒ์ ์ ์๋ ์ธ์๊ฐ ๋ ๊ฐ ๋ ์ถ๊ฐ๋์๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ด๋ จ ๋ ํผ๋ฐ์ค๋ฅผ ๋ณด๋ค ๋ณด๋ฉด IDirectDraw์ IDirectDraw2๋ฅผ ๋ณผ ์ ์์ํ ๋ฐ ์ด๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ ํด๋นํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ง์นญํ๋ COM ์ฉ์ด๋ก IDirectDraw2 ๊ฐ ๋ฐ๋ก ์ต์ ๋ฒ์ ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ ํด๋นํ๋ ์ธํฐํ์ด์ค์ด๊ณ IDirectDraw๋ ๊ตฌ ๋ฒ์ ์ ํด๋นํ๋ ์ธํฐํ์ด์ค์ด๋ค. ์์ ํ๋ก๊ทธ๋จ์์๋ IDirectDraw๋ฅผ ์ฌ์ฉํ์๋ค. HRESULT SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags); ์ฒซ ๋ฒ์งธ ์ธ์์ ๋ ๋ฒ์งธ ์ธ์๋ ๊ฐ๊ฐ ์๋ก์ด ๋ชจ๋์ ํญ๊ณผ ๋์ด๋ฅผ ํฝ์ ๋จ์ ๋ก ์ง์ ํ๋ค. ์ธ ๋ฒ์งธ ์ธ์์ธ dwBPP๋ ์๋ก์ด ๋ชจ๋์ ํฝ์ ๋น ๋นํธ์๋ฅผ ์ง ์ ํ๋ค. ๋ค ๋ฒ์งธ ์ธ์๋ ๋ฆฌํ๋ ์ฌ์จ์ ์ง์ ํ๋ ๋ถ๋ถ์ธ๋ฐ 0์ ์ง์ ํ๋ฉด ๊ตฌ ๋ฒ์ ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ SetDisplayMode๋ฅผ ํธ์ถํ๋ค. ๋ง์ง๋ง ์ธ ์๋ ์ ํ์ ์ธ ์ธ์๋ก 0์ ์ฃผ๊ฑฐ๋ DDSDM_STAND ARDVGAMODE๋ฅผ ์ค๋ค. ์ด ํ ๋๊ทธ๋ 320x200x8 ๋ชจ๋๋ฅผ ์ค์ ํด๋ฒ๋ฆฐ๋ค. ๋ง์ผ ๋ค๋ฅธ ํด์๋๋ ๋นํธ ์๋ฅผ ์ฌ ์ฉํ๋ ค ํ๋ค๋ฉด ๋ง์ง๋ง ์ธ์์ ๊ฐ์ผ๋ก๋ 0์ ์ง์ ํด์ผ ํ๋ค. =============================================================== DDSCL_ALLOWMODEX ๋ชจ๋ X ๋์คํ๋ ์ด ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ค. ์ด ํ ๋๊ทธ๊ฐ ์ฌ์ฉ๋๋ฉด ๋ฐ๋์ DDSCL_EXCLU SIVE, DDSCL_FULLSCREEN ํ๋๊ทธ๊ฐ ๊ฐ ์ด ์ฌ์ฉ๋์ด์ผ ํ๋ค. DDSCL_ALLOWREBOOT ํ์คํฌ๋ฆฐ ๋ชจ๋์์ CTRL+ALT+DELํค๊ฐ ๋์ํ๋๋ก ํ์ฉํ๋ค. DDSCL_EXCLUSIVE ์ถ๋ ฅ ๊ด๋ จ ์์์ ๋ ์ ํ๊ฒ ๋ค๋ ์๋ฏธ์ ํ๋ ๊ทธ๋ก ํ์คํฌ๋ฆฐ ๋ชจ๋์์๋ง ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ ์ DDSCL_FULLSCREEN ํ๋๊ทธ์ ๊ฐ์ด ์ฌ์ฉ๋์ด์ผ ํ๋ค. DDSCL_FULLSCREEN ํ๋ฉด ์ ์ฒด๋ฅผ ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ์ถ๋ ฅ ํ๋ฉด ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ๋ก ์ถ๋ ฅ ๊ด๋ จ ์์ ์ ๋ ์ ํ๊ฒ ๋ค๋ ์๋ฏธ๊ฐ ๋๊ธฐ ๋๋ฌธ์ DDSCL_EXCLUSIVE ํ๋๊ทธ์ ๊ฐ์ด ์ฌ์ฉ ๋์ด์ผ ํ๋ค. DDSCL_NORMAL ํ๋ฉด ์ ์ฒด๊ฐ ์๋ ์๋์ ์์ญ๋ง์ ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ์ถ๋ ฅ ์์ญ์ผ๋ก ์ผ๊ฒ ๋ค๋ ์๋ฏธ์ ํ๋๊ทธ์ด๋ค. ์ด ํ๋๊ทธ๋ DDSCL_ALLOW MODEX, DDSCL_EXCLUSIVE, DDSCL_ FULLSCREEN ํ๋๊ทธ์ ๊ฐ์ด ์ฌ์ฉ๋ ์ ์๋ค. DDSCL_ NOWINDOWCHANGES ๋ค์ด๋ ํธ๋๋ก์ฐ์ ์ถ๋ ฅ์ด ๋๊ฐ๋ ์๋๊ฐ ํ ์ฑํ๋ ๋โ์ต์ํโ,โ์ด์ ํฌ๊ธฐ๋กโ์ ๊ธฐ ๋ฅ์ด ๋์ํ์ง ์๋๋ก ํ๊ณ ์ ํ ๋ ์ฌ์ฉํ ์ ์๋ค. =============================================================== ํ 3 : SetCooperativeLevel ํจ์์์ dwFlags์ ๊ฐ๋ค =============================================================== ์ฐธ๊ณ 1 : DDSURFACEDESC ๊ตฌ์กฐ์ฒด --------------------------------------------------------------- โ dwSize : ์ด ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ์ง์ ํ๋ค. โ dwFlags : ๋ค์ ๋์ค๋ ๋ค๋ฅธ ํ๋๋ค ์ค์ ์ด๋ ๊ฒ์ด ์๋ฏธ์๋ ๊ฐ์ธ์ง ์ง ์ ํ๋ค. ๋ค์๊ณผ ๊ฐ์ ํ๋๊ทธ๋ค์ด ํ๋ ์ด์ ์ง์ ๋ ์ ์๋ค. - DDSD_ALL : ๋ชจ๋ ํ๋๋ค์ด ๋ค ์ฌ์ฉ๋๋ค. - DDSD_ALPHABITDEPTH : dwAlphaBitDepth ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_BACKBUFFERCOUNT : dwBackBufferCount ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_CAPS : ddsCaps ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_CKDESTBLT : ddckCKDestBlt ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_CKDESTOVERLAY : ddckCKDestOverlay ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_CKSRCBLT : ddckCKSrcBlt ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_CKSRCOVERLAY : ddckCKSrcOverlay ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_HEIGHT : dwHeight ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_LINEARSIZE : ์ฌ์ฉ๋์ง ์๋๋ค. - DDSD_LPSURFACE : lpSurface ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_MIPMAPCOUNT : dwMipMapCount ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_PITCH : lPitch ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_PIXELFORMAT : ddpfPixelFormat ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_REFRESHRATE : dwRefreshRate ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_WIDTH : dwWidth ํ๋๊ฐ ์ฌ์ฉ๋๋ค. - DDSD_ZBUFFERBITDEPTH : dwZBufferBitDepth ํ๋๊ฐ ์ฌ์ฉ๋๋ค. โ dwHeight, dwWidth : ์์ฑํ๊ณ ์ ํ๋ ๋ฉด์ ํญ๊ณผ ๋์ด๋ฅผ ํฝ์ ๋จ์๋ก ์ง ์ ํ๋ค. โ lPitch : ํ ์ค์ ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ์ง์ ํ๋ค. โ dwBackBufferCount : ํ๋ฉด ๊ฐ์ฒด์ ์๋ฅผ ์ง์ ํ๋ค. โ lpSurface : ๋ฉด๊ณผ ๊ด๋ จ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฃผ์. ๋ฉด ๊ฐ์ฒด์ Lock ํจ์๋ฅผ ๋ถ ๋ฅด๋ฉด ์ด ํ๋๋ ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์ ํจํ ํฌ์ธํฐ๋ฅผ ์ ์งํ๊ฒ ๋๋ค. โ ddckCKDestOverlay : ์ค๋ฒ๋ ์ด ๋ฉด์ ์ฌ์ฉ๋๋ ๋ชฉ์ ์ง ์ปฌ๋ฌํค๋ฅผ ๊ธฐ์ ํ ๋ DDCOLORKEY ๊ตฌ์กฐ์ฒด. โ ddckCKDestBlt : blit ์์ ์ ์ฌ์ฉ๋๋ ๋ชฉ์ ์ง ์ปฌ๋ฌํค๋ฅผ ๊ธฐ์ ํ๋ DDCOLORKEY ๊ตฌ์กฐ์ฒด โ ddckCKSrcOverlay : ์ค๋ฒ๋ ์ด ๋ฉด์ ์ฌ์ฉ๋๋ ์์ค ์ปฌ๋ฌํค๋ฅผ ๊ธฐ์ ํ ๋ DDCOLORKEY ๊ตฌ์กฐ์ฒด โ ddckCKSrcBlt : blit ์์ ์ ์ฌ์ฉ๋๋ ์์ค ์ปฌ๋ฌํค๋ฅผ ๊ธฐ์ ํ๋ DDCOLO RKEY ๊ตฌ์กฐ์ฒด โ ddpfPixelFormat : ๋ฉด์ ํฝ์ ํ์์ ๊ธฐ์ ํ๋ DDPIXELFORMAT ๊ตฌ์กฐ์ฒด โ ddsCaps : ๋ฉด์ด ์ํํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ธฐ์ ํ๋ DDSCAPS ๊ตฌ์กฐ์ฒด =============================================================== CreateSurface ํจ์ ์ค์ ํ๋ฉด ์ถ๋ ฅ์ ์ฌ์ฉ๋๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ค๋ค. ํจ์ ์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค. HRESULT CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FAR *lplpDDSurface, IUnknown FAR *pUnkOuter); ์ฒซ ๋ฒ์งธ ์ธ์์ธ lpDDSurfaceDesc๋ ๋ง๋ค๊ณ ์ ํ๋ ๋ฉด ๊ฐ์ฒด์ ํน์ฑ์ ๊ธฐ๋ก ํ DDSURFACEDESC ๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ์ด๋ค. ํจ์ ํธ์ถ์ด ์ฑ๊ณตํ์ ๊ฒฝ ์ฐ lplpDDSurface๋ก๋ ์์ฑ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด ๊ฐ์ฒด์ ํฌ์ธํฐ์ ์ฃผ์ ๊ฐ ๋ค์ด์จ๋ค. ๋ง์ง๋ง ์ธ์์ธ pUnkOuter๋ ์์ DirectDrawCreate์์ ์ค๋ช ํ ๊ฒ๊ณผ ๋์ผํ๋ค. DDSURFACEDESC ๊ตฌ์กฐ์ฒด ์ด ๊ตฌ์กฐ์ฒด๋ ์์ฑํ๊ณ ์ ํ๋ ๋ฉด ๊ฐ์ฒด์ ํน์ฑ์ ๋ด์๋๋๋ฐ ์ฌ์ฉ๋๋ค. ๋ง ๋ค๊ณ ์ ํ๋ ๋ฉด ๊ฐ์ฒด์ ๋ฐ๋ผ ์ฌ์ฉ๋๋ ํ๋๊ฐ ๋ฌ๋ผ์ง๋ค. ์ด ๊ตฌ์กฐ์ฒด์ ํ๋ ์๋ ๋ฐฉ๋ํ๋ฐ ์ด ์ค ๋ณ ์๋ฏธ ์๋ ๊ฒ์ ์ค๋ช ์์ ์ ์ธํ๋๋ก ํ๊ฒ ๋ค. DDSURFACEDESC ๊ตฌ์กฐ์ฒด ์์๋ ์ฌ๋ฌ ๊ฐ์ ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด๋ค์ด ํฌํจ๋์ด ์๋ค (์ฐธ๊ณ 1). DDCOLORKEY ๊ตฌ์กฐ์ฒด ์ปฌ๋ฌํค๋ฅผ ๊ธฐ์ ํ๋๋ฐ ์ฌ์ฉ๋๋ ๊ตฌ์กฐ์ฒด์ด๋ค. โ dwColorSpaceLowValue : ์ปฌ๋ฌํค๋ก ์ฌ์ฉ๋๋ ์ปฌ๋ฌ ๊ฐ์ ํ์ ๋๋ธ ์๋ ๊ฐ. โ dwColorSpaceHighValue : ์ปฌ๋ฌํค๋ก ์ฌ์ฉ๋๋ ์ปฌ๋ฌ ๊ฐ์ ์์ ๋๋ธ ์๋ ๊ฐ. DDSCAPS ๊ตฌ์กฐ์ฒด DDSCAPS ๊ตฌ์กฐ์ฒด๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ์ ์ํ๋ค. ์ด ๊ตฌ์กฐ์ฒด ๋ DDCAPS ๊ตฌ์กฐ์ฒด์ DDSURF ACEDESC ๊ตฌ์กฐ์ฒด์ ์ผ๋ถ๋ก ์กด์ฌํ๋ค(์ฐธ๊ณ 2). CreatePalette ํจ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์์ ์ฌ์ฉ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ค. ์ด ํจ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค. HRESULT CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpColorTable, LPDIRECTDRAWPALETTE FAR *lplpDDPalette, IUnknown FAR *pUnkOuter); ์ฒซ ๋ฒ์งธ ์ธ์์ธ dwFlags์๋ ํ 4์ ๊ฐ์ ๊ฐ๋ค์ด ํ๋ ์ด์ ์ฌ ์ ์๋ค. ๋ ๋ฒ์งธ ์ธ์์ธ lpColorTable์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ ๋๋ฐ ์ฌ์ฉ๋ PALETTEENT RY ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ธ ๋ฒ์งธ ์ธ์์ธ lplpDDPalette๋ ์ด ํจ์๊ฐ ์ฑ๊ณตํ์ ๊ฒฝ์ฐ์ ๋ฆฌํด๋๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ ๋ ํธ ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ๋ด์์ฌ ํฌ์ธํฐ์ด๋ค. ๋ง์ง๋ง ์ธ์์ธ pUnkOuter๋ ์์ ์ ๋ดค๋ ๊ฒ์ฒ๋ผ COM ํฌํจ(aggregation)์ ์ฌ์ฉ๋๋ ๊ฒ์ผ๋ก NULL์ ์ค๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด(DirectDrawSurface) ๊ฐ์ฒด Blt ํจ์์ด ํจ์๋ ๊ธฐ์กด GDI์ StretchBlt์ ๋น์ทํ ๊ธฐ๋ฅ์ ์ํํ๋ค๊ณ ์ ๊ฐํ๋ฉด ๋๋ค. ํ ๋ฉด ๊ฐ์ฒด์์ ๋ค๋ฅธ ๋ฉด ๊ฐ์ฒด์ ๋ธ๋ก ๋ณต์ฌ๋ฅผ ์ํํ๋๋ฐ ์์ค ๋ณต์ฌ ์์ญ๊ณผ ๋์ ๋ณต์ฌ ์์ญ์ ํฌ๊ธฐ๊ฐ ์ผ์นํ์ง ์์ ๊ฒฝ์ฐ ์์์ ํ๋๋ ์ถ์๋ฅผ ํ ํ ํ์ ๋ณต์ฌ ์์ ์ ์ํํ๋ค. ์ด ํจ์๋ ํ์ฌ Z-๋ฒํผ๋ง์ด๋ ์ํ ๋ธ๋ ๋ฉ(alpha blending)์ ์ง์ํ์ง ์๋๋ค. ์ด ํจ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ ๋ค. HRESULT Blt(LPRECT lpDestRect, LPDIRECTDRAWSURFACE3 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx); ์ฒซ ๋ฒ์งธ ์ธ์์ธ lpDestRect๋ ๋์ ๋ฉด ๊ฐ์ฒด์ ์ด๋๋ก ๋ธ๋ก ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด ์ง ๊ฒ์ธ์ง๋ฅผ ๋ํ๋ด๋ RECT ๊ตฌ์กฐ์ฒด์ ํฌ์ธํฐ์ด๋ค. ๋ง์ผ ์ด ๊ฐ์ด NULL์ด ๋ฉด ๋์ ๋ฉด ๊ฐ์ฒด์ ์ ์ฒด ์์ญ์ ๋์์ผ๋ก ํ๋ค. ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ์ด RECT ๊ตฌ์กฐ์ฒด์ right์ bottom ํ๋์ ๊ฐ์ ํฌํจ๋์ง ์๋๋ค๋ ์ ์ด๋ค. ์ด ๋ ์ธ ๋ฒ์งธ ์ธ์์ธ lpSrcRect์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ๋ ๋ฒ์งธ ์ธ์๋ ์์ค ๋ฉด ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ์ด๋ค. ์ธ ๋ฒ์งธ ์ธ์์ธ lpSrcRect๋ ์์ค ๋ฉด ๊ฐ ์ฒด์ ์ด๋ ์์ญ์ ๋์ ๋ฉด ๊ฐ์ฒด๋ก ๋ณต์ฌํ ๊ฒ์ธ์ง๋ฅผ ๋ํ๋ด๋ RECT ๊ตฌ์กฐ์ฒด ์ ํฌ์ธํฐ์ด๋ค. ๋ง์ผ ์ด ๊ฐ์ด NULL์ด๋ฉด ์์ค ๋ฉด ๊ฐ์ฒด์ ์ ์ฒด ์์ญ์ ๋์ ์ผ๋ก ํ๋ค. ๋ค ๋ฒ์งธ ์ธ์๋ ๋ณต์ฌ ์์ ์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง๋ฅผ ๋ํ๋ด๋ ํ๋ ๊ทธ๋ฅผ ์ฃผ๋ ๋ถ๋ถ์ผ๋ก ๋ค์ ๊ฐ๋ค์ ํ๋ ์ด์ ์ฃผ๋ฉด ๋๋ค. โ DDBLT_COLORFILL : ์ด ํจ์์ ๋ง์ง๋ง ์ธ์์ธ lpDDBltFx์ dwFillColor ํ๋์ RGB ๊ฐ์ ์ด์ฉํด ๋์ ๋ฉด์ ๋์ ์์ญ์ ์ฑ์ด๋ค. โ DDBLT_DDFX : ์ด ํจ์์ ๋ง์ง๋ง ์ธ์์ธ lpDDBltFx์ dwDDFX ํ๋๋ฅผ ์ด์ฉํด ๋ณต์ฌ ์์ ์ ์ฌ์ฉํ ํจ๊ณผ๋ฅผ ์ง์ ํ๋ค. โ DDBLT_DDROPS : ์ด ํจ์์ ๋ง์ง๋ง ์ธ์์ธ lpDDBltFx์ dwDDROPS ํ๋๋ฅผ ์ด์ฉํด ๋์คํฐ ์์ ์ ์ง์ ํ๋ค. ์ฌ๊ธฐ์์ ๋์คํฐ ์์ ์ Win32 API์๋ ์๋ ๊ฒ๋ค์ด๋ค. โ DDBLT_KEYDEST : ๋์ ๋ฉด์ ์ปฌ๋ฌํค๋ฅผ ์ด์ฉํ๋ค. โ DDBLT_KEYDESTOVERRIDE : ์ด ํจ์์ ๋ง์ง๋ง ์ธ์์ธ lpDDBltFx์ dckDestColorkey ํ๋๋ก ๋์ ๋ฉด์ ์ปฌ๋ฌํค๋ฅผ ๋์ ํ๋ค. โ DDBLT_KEYSRC : ์์ค ๋ฉด์ ์ปฌ๋ฌ ํค๋ฅผ ์ด์ฉํ๋ค. โ DDBLT_KEYSRCOVERRIDE : ์ด ํจ์์ ๋ง์ง๋ง ์ธ์์ธ lpDDBltFx์ dckSrcColorkey ํ๋๋ก ์์ค ๋ฉด์ ์ปฌ๋ฌํค๋ฅผ ๋์ ํ๋ค. โ DDBLT_ROP : ์ด ํจ์์ ๋ง์ง๋ง ์ธ์์ธ lpDDBltFx์ dwROP ํ๋๋ฅผ ์ด์ฉ ํด ๋์คํฐ ์์ ์ ์ง์ ํ๋ค. ์ฌ๊ธฐ์์ ๋์คํฐ ์์ ์ Win32 API์ ์๋ ๊ฒ ๊ณผ ๋์ผํ ๊ฒ์ด๋ค. โ DDBLT_ROTATIONANGLE : ์ด ํจ์์ ๋ง์ง๋ง ์ธ์์ธ lpDDBltFx์ dwRotationAngle ํ๋๋ฅผ ์ด์ฉํด ํ์ ๊ฐ์ ์ง์ ํ๋ค. ํ์ ๊ฐ์ 1/100๋๋ฅผ ๋จ์๋ก ์ง์ ๋๋ค. โ DDBLT_WAIT : ๋ณต์ฌ ์์ ์ด ๋๊ธฐ๋ก ์ธํด ๋ฐ๋ก ์ด๋ฃจ์ด์ง ์ ์๋ ๊ฒฝ์ฐ (DDERR_WASSTILLDRAWING๊ฐ ๋ฆฌํด๋๋ ๊ฒฝ์ฐ) ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ณต์ฌ ์์ ์ด ์ ๋ฃ๋ ๋ค์์ ๋ฆฌํดํ๋๋ก ํ๋ค. ๋ง์ผ ์ด ํ๋๊ทธ๋ฅผ ์ง์ ํ์ง ์๋๋ค๋ฉด ๋๊ธฐ ๋ฑ์ผ๋ก ์ธํด ๋ฐ๋ก ์์ ์ ์๋ฃํ ์ ์๋ ๊ฒฝ์ฐ ์๋ฌด ์ผ๋ ์ํํ์ง ์๊ณ ๋ฐ ๋ก ๋ฆฌํดํ๋ค. ๋ง์ง๋ง ์ธ์๋ ๋ณต์ฌ ์์ ๊ณผ ๊ด๋ จ๋ DDBLTFX ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. BltFast ํจ์์ด ํจ์๋ ์์ค ์ปฌ๋ฌํค๋ ๋ชฉ์ ์ปฌ๋ฌํค๋ฅผ ์ด์ฉํ ํฌ๋ช ๋ณต์ฌ๋ ์์ค๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ๋ ์์ ์ ์ํํด์ค๋ค. ์ด ํจ์์ ํน์ง์ ํ๋์จ์ด์ ์ ์ง์ ๊ฐ๋ฅํ๋ค๋ฉด ๋น๋๊ธฐ ๋ณต์ฌ ์์ ์ ์ํํ๊ณ ๋ ๋น๋์ค ๋ฉ๋ชจ๋ฆฌ ์์ ์์ ๋ณต์ฌ๋ง์ด ๊ฐ๋ฅํ๋ฉฐ ํด๋ฆฌํผ๋ฅผ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๋ค๋ ์ ์ด ๋ฉฐ 1:1 ๋ณต์ฌ๋ง์ ์ง์ํ๋ค. ์ด ํจ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค. HRESULT BltFast(DWORD dwX, DWORD dwY, LPDIRECTDRAWSURFACE3 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwTrans); dwX, dwY๋ ๋ณต์ฌ ์์ ์ด ์์๋ ๋์ ๋ฉด์ ์์ X,Y ์ขํ๋ฅผ ๋ํ๋ธ ๋ค. lpDDSrcSurface๋ ๋ณต์ฌ ์์ ์ ์์ค ๋ฉด ๊ฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. lpSrcRect๋ ์์ค ๋ฉด ๊ฐ์ฒด์ ์ด๋ ๋ถ๋ถ์ ๋ณต์ฌํ ๊ฒ์ธ์ง๋ฅผ ๋ํ๋ด๋ RECT ๊ตฌ์กฐ์ฒด์ ํฌ์ธํฐ์ด๋ค. ๋ค ๋ฒ์งธ ์ธ์์ธ dwTrans๋ ๋ณต์ฌ ์์ ์ ์ด๋ป๊ฒ ์ํ ํ ๊ฒ์ธ์ง๋ ์ง์ ํ๋ ๋ถ๋ถ์ผ๋ก ํ 5์ ๊ฐ์ ๊ฐ์ด ๊ฐ๋ฅํ๋ค. =============================================================== DDBLTFAST_DESTCOLORKEY ๋์ ์ปฌ๋ฌํค๋ฅผ ์ด์ฉํ๋ ํฌ๋ช ๋ณต์ฌ ์ ์ ์ ์ํํ๋ค. DDBLTFAST_NOCOLORKEY ์ปฌ๋ฌํค๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ณดํต ๋ณต์ฌ ์ ์ ์ ์ํํ๋ค. DDBLTFAST_SRCCOLORKEY ์์ค ์ปฌ๋ฌํค๋ฅผ ์ด์ฉํ๋ ํฌ๋ช ๋ณต์ฌ ์ ์ ์ ์ํํ๋ค. DDBLTFAST_WAIT ๋ณต์ฌ ์์ ์ด ๋๊ธฐ๋ก ์ธํด ๋ฐ๋ก ์ด๋ฃจ์ด์ง ์ ์๋๊ฒฝ์ฐ(DDERR_WASSTILLDRAWING๊ฐ ๋ฆฌํด๋๋ ๊ฒฝ์ฐ) ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ณต์ฌ ์์ ์ด ์ ๋ฃ๋ ๋ค์์ ๋ฆฌํดํ๋๋ก ํ๋ค. ๋ง์ผ ์ด ํ๋ ๊ทธ๋ฅผ ์ง์ ํ์ง ์๋๋ค๋ฉด ๋๊ธฐ ๋ฑ์ผ๋ก ์ธํด ๋ฐ๋ก ์์ ์ ์๋ฃํ ์ ์๋ ๊ฒฝ์ฐ ์๋ฌด์ผ๋ ์ํํ์ง ์๊ณ ๋ฐ๋ก ๋ฆฌํดํ๋ค. =============================================================== ํ 5 : BltFast ํจ์์์ dwTrans์ ์ฌ ์ ์๋ ๊ฐ๋คFlip ํจ์ ์ด ํจ์๋ DDSCAPS_BACKBUFFER๋ก ์ง์ ๋ ํ๋ฉด ๋ฒํผ๋ฅผ ์ ๋ฉด ๋ฒํผ์ ๋ด ์ฉ๊ณผ ๋ง๋ฐ๊พธ๊ฒ ํ๋ค. ์ฆ, ์ ๋ฉด ๋ฒํผ๊ฐ ์ด์ ํ๋ฉด ๋ฒํผ๊ฐ ๋๊ณ ํ๋ฉด ๋ฒํผ๊ฐ ์ ๋ฉด ๋ฒํผ๊ฐ ๋๋ ๊ฒ์ด๋ค. ์ด ํจ์๋ DDSCAPS_FLIP๊ณผ DDSCAPS_FRONTB UFFER ํ๋๊ทธ๋ก ๋ง๋ค์ด์ง ๋ฉด์ ๋ํด์๋ง ์ ์ฉ๊ฐ๋ฅํ๋ฉฐ ์ด ํจ์๋ ๋น๋์ค ์ ํธ๊ฐ ์์ง ์ฃผ์ฌ ์ฃผ๊ธฐ์ ๋ง์ถฐ ๋์ํ๋ค. ์ด ํจ์์ ์ํ ์ ๋ค์๊ณผ ๊ฐ๋ค. HRESULT Flip(LPDIRECTDRAWSURFACE3 lpDDSurfaceTarget Override, DWORD dwFlags); ์ฒซ ๋ฒ์งธ ์ธ์์ธ lpDDSurfaceTargetOverride๋ ์ด ๋ฉด ๊ฐ์ฒด์ ๋ง๋ฐ๊พธ์ด์ง ๋ ์ ๋ฉด ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ์ง์ ํ๋ค. ์ง์ ๋ ๋ฉด ๊ฐ์ฒด๋ ํ๋ฆฝํ ์ฒด์ธ์ ์ํ ๊ฒ ์ด์ด์ผ ํ๋ค. ์ด ์ธ์์ ๋ํดํธ ๊ฐ์ NULL์ธ ๊ฒฝ์ฐ ํ๋ฆฝํ ์ฒด์ธ์ ์ํ ๋ค ์ ๋ฒํผ์ ๋ด์ฉ์ ๋ง๋ฐ๊พผ๋ค. ๋ ๋ฒ์งธ ์ธ์์ธ dwFlags๋ ํ๋ฆฝํ ์์ ์ด ์ด ๋ป๊ฒ ์ด๋ฃจ์ด์ง ๊ฒ์ธ์ง๋ฅผ ์ง์ ํ๋ค. ํ 6๊ณผ ๊ฐ์ ๊ฐ์ด ๊ฐ๋ฅํ๋ค. GetDC ํจ์๋ฉด ๊ฐ์ฒด์ DC๋ฅผ ์์ฑํด์ค๋ค. ์ด DC๋ ๋ง์น ๋ณดํต ์๋ DC์ฒ๋ผ ์ฌ ์ฉํ ์ ์๋ค. ์ด๋ ๊ฒ ์ป์ DC๋ ๋์ค์ ๋ฉด ๊ฐ์ฒด์ ReleaseDC ํจ์๋ฅผ ํธ ์ถํด์ฃผ์ด์ผ๋ง ํด์ ๋๋ค. ์ด ํจ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค. HRESULT GetDC(HDC FAR *lphDC); ์ฒซ ๋ฒ์งธ ์ธ์์ธ lphDC๋ ๋ฆฌํด๋๋ ๋๋ฐ์ด์ค ์ปจํ ์คํธ์ ํธ๋ค์ ๋ฐ๋๋ฐ ์ฌ์ฉ ๋๋ค. DDFLIP_EVEN ์ค๋ฒ๋ ์ด ๋ฉด์ ์๋ ๋ด์ฉ์ ๋์คํ๋ ์ดํ๊ณ ์ ํ ๋ ๋ง ์ฌ์ฉ๋๋ค. ์๋ก์ด ๋ฉด์ ๋น๋์ค ์ ํธ ์ค์ ์ง์ ํ๋์ ์๋ ๋ฐ์ดํฐ๋ง ํฌํจํ๋ค. ์ด ๊ฐ์ DDFLIP_ODD ์ ํจ๊ป ์ฌ์ฉ๋ ์ ์๋ค. DDFLIP_ODD ์ค๋ฒ๋ ์ด ๋ฉด์ ์๋ ๋ด์ฉ์ ๋์คํ๋ ์ดํ๊ณ ์ ํ ๋ ๋ง ์ฌ์ฉ๋๋ค. ์๋ก์ด ๋ฉด์ ๋น๋์ค ์ ํธ ์ค์ ํ์ ํ๋์ ์๋ ๋ฐ์ดํฐ๋ง ํฌํจํ๋ค. ์ด ๊ฐ์ DDFLIP_EVEN๊ณผ ํจ๊ป ์ฌ์ฉ๋ ์ ์๋ค. DDFLIP_WAIT ๋ง์ผ ํ๋ฆฝ ์์ ์ ์ํํ๋ ค ํ ๋ ํ๋์จ์ด์ ์ํ ๊ฐ ์ ํฉํ์ง ๋ชปํ๋ฉด DDERR_WASSTILLDRAWING ์๋ฌ๊ฐ ๋ฐ ์ํ๊ณ ํ๋ฆฝ ์์ ์ ์ํ๋ ์ ์๋๋ฐ ์ด ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ฉด ๊ฐ๋ฅํ ์ํ ๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ํ๋ฆฝ ์์ ์ ์ํํ๊ณ ๋ฆฌํดํ๋ค. ํ 6 : Flip ํจ์์์ ๋ ๋ฒ์งธ ์ธ์์ธ dwFlags์ ๊ฐ๋ค GetAttachedSurface ํจ์ ์ด ํจ์๋ ์ง์ ๋ ๊ธฐ๋ฅ์ ๊ฐ๋ ์ถ๊ฐ๋ ๋ฉด์ ํฌ์ธํฐ๋ฅผ ์ป์ด์ค๋ค. ์ํ์ ๋ค ์๊ณผ ๊ฐ๋ค. HRESULT GetAttachedSurface(LPDDSCAPS lpDDSCaps, LPDIRECTDRAWSURFACE3 FAR *lplpDDAttachedSurface); ์ฒซ ๋ฒ์งธ ์ธ์์ธ lpDDSCaps๋ ์ป์ด์ค๊ณ ์ ํ๋ ๋ฉด ๊ฐ์ฒด์ ํ๋์จ์ด์ ์ธ ๊ธฐ ๋ฅ์ ๋ด์๋๋ DDSCAPS ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๋ ๋ฒ์งธ ์ธ ์์ธ lplpDDAttachedSurface๋ ์ป์ด์ฌ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด ๊ฐ์ฒด์ ์ฃผ์ ๋ฅผ ์ป์ด์ฌ ํฌ์ธํฐ์ด๋ค. Lock ํจ์๋ฉด ๊ฐ์ฒด์ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ป์ด์ค๋ค. ์ด ํจ์๋ ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ๊ทผํ๊ณ ์ ํ ๋ ์์ฃผ ์ ์ฉํ ๋ค. ์ด๋ ๊ฒ ํฌ์ธํฐ๋ฅผ ์ป์ด ์ฌ์ฉํ ๋ค์ ๋ฐ๋์ Unlock ํจ์๋ฅผ ํธ์ถํด ์ ๋ฝ์ ํ์ด์ฃผ์ด์ผ ํ๋ค. Lock ํจ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค. HRESULT Lock(LPRECT lpDestRect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD dwFlags, HANDLE hEvent); ์ฒซ ๋ฒ์งธ ์ธ์์ธ lpDestRect๋ ๋ฉด ๊ฐ์ฒด์ ์ด๋ ์์ญ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ป์ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ค. ๋ง์ผ ์ด ์ธ์๋ก NULL์ ์ง์ ํ๋ฉด ์ ์ฒด ์์ญ์ ๋ํ ํฌ ์ธํฐ๋ฅผ ์ป๊ฒ ๋๋ค. ๋ ๋ฒ์งธ ์ธ์์ธ lpDDSurfaceDesc๋ DDSURFACEDESC ๊ตฌ์กฐ ์ฒด ํ์ ์ ๊ฐ๊ฒ ๋๋ฉฐ ๋ฉด์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค. ์ธ ๋ฒ์งธ ์ธ์์ธ dwFlags ๋ก๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ ์ง์ ํ ์ ์๋ค. โ DDLOCK_EVENT : ํ์ฌ ๊ตฌํ๋์ด ์์ง ์๋ค. โ DDLOCK_READONLY : ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋ด์ฉ์ ๋ฝํ๋ค. โ DDLOCK_SURFACEMEMORYPTR : ์ง์ ํ ์ฌ๊ฐ ์์ญ์ ์ ๋์ ๋ํ ํฌ์ธ ํฐ๊ฐ ๋ฆฌํด๋์ด์ผํจ์ ์ง์ ํ๋ค. ๋ง์ผ ์ด๊ฒ์ด ์ง์ ๋์ง ์์ผ๋ฉด ์ง์ ๋ ์ฌ ๊ฐ ์์ญ๊ณผ๋ ๊ด๊ณ์์ด ๋ฉด ์ ์ฒด์ ์ ๋์ ๋ํ ํฌ์ธํฐ๊ฐ ๋ฆฌํด๋๋ค. โ DDLOCK_WAIT : ๋ง์ผ ํ์ฌ ๋ณต์ฌ ์์ ์ด ์งํ์ค์ด๋ผ๋ฉด ๋ฝ์ ์ฑ๊ณตํ ์ ์ ๋ค. ์ด ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ฉด ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ฝ์ ๊ฑด๋ค. โ DDLOCK_WRITEONLY : ์ฐ๊ธฐ ์ ์ฉ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋ด์ฉ์ ๋ฝํ๋ค ๋ง์ง๋ง ์ธ์์ธ hEvent๋ ํ์ฌ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ ๋ฐ๋์ NULL๋ก ์ง์ ํด์ผ ํ ๋ค. SetPalette ํจ์ ์ด ํจ์๋ ์ง์ ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ ๊ฐ์ฒด๋ฅผ ์ด ๋ฉด ๊ฐ์ฒด์ ๋ถ์ด๋ ์ญ ํ ์ ํ๋ค. ๋ฉด ๊ฐ์ฒด๋ ์ดํ ์์ ์ ์ด ํ๋ ํธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. ํ๋ ํธ ๊ฐ์ฒด์ ์ถ๊ฐ๋ก ์ธํ ๋ณ๊ฒฝ์ ๋ฐ๋ก ๋ฐ์๋๋ค. ํ์ฌ ๋ฉด ๊ฐ์ฒด์์ ์ฌ์ฉ์ค ์ธ ํ๋ ํธ์ ๋ด์ฉ์ ์๊ณ ์ถ๋ค๋ฉด GetPalette ํจ์๋ฅผ ํธ์ถํ๋ค. SetPalette ํจ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค. HRESULT SetPalette(LPDIRECTDRAWPALETTE lpDDPalette); lpDDPalette ์ธ์๋ ๋ฉด ๊ฐ์ฒด๊ฐ ์ดํ ์์ ์ ์ฌ์ฉํ ํ๋ ํธ ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ฐธ๊ณ ๋ก ํ๋ ํธ ๊ฐ์ฒด์ ์์ฑ์๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด ๊ฐ์ฒด์ CreatePalette ํจ์๋ฅผ ์ด์ฉํ๋ค. SetColorKey ํจ์ ์ด ํจ์๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด ๊ฐ์ฒด์ ์ปฌ๋ฌํค๋ฅผ ์ง์ ํด์ค๋ค. ๋ฉด์ ๋ํด ํฌ ๋ช ํ ๋ณต์ฌ ์์ ์ ์ํํด์ผ ํ๋ค๋ฉด ์ด ํจ์์ ์ฌ์ฉ์ ํ์์ ์ด๋ค. ์ด ํจ์ ์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค. HRESULT SetColorKey(DWORD dwFlags, LPDDCOLORKEY lpDDColorKey); ์ฒซ ๋ฒ์งธ ์ธ์์ธ dwFlags๋ ์ด๋ค ํํ์ ์ปฌ๋ฌํค๋ฅผ ์ง์ ํ๋์ง ๊ฒฐ์ ํ๋ค. โ DDCKEY_COLORSPACE : ์ฌ๋ฌ ๊ฐ์ ์ปฌ๋ฌํค๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ์ง์ ํ๋ค. ์ฌ๋ฌ ๊ฐ์ ์ปฌ๋ฌํค๊ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์ปฌ๋ฌ ์คํ์ด์ค๋ผ๊ณ ํ๋ค. โ DDCKEY_DESTBLT : ๋ณต์ฌ ์์ ์์ ๋์ ์ปฌ๋ฌํค๋ก ์ฌ์ฉํ ์ปฌ๋ฌํค๋ ์ปฌ ๋ฌ ์คํ์ด์ค๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ์ ์ง์ ํ๋ค. โ DDCKEY_DESTOVERLAY : ์ค๋ฒ๋ ์ด ์์ ์์ ๋์ ์ปฌ๋ฌํค๋ก ์ฌ์ฉํ ์ปฌ ๋ฌํค๋ ์ปฌ๋ฌ ์คํ์ด์ค๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ์ ์ง์ ํ๋ค. โ DDCKEY_SRCBLT : ๋ณต์ฌ ์์ ์์ ์์ค ์ปฌ๋ฌํค๋ก ์ฌ์ฉํ ์ปฌ๋ฌํค๋ ์ปฌ๋ฌ ์คํ์ด์ค๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ์ ์ง์ ํ๋ค. โ DDCKEY_SRCOVERLAY : ์ค๋ฒ๋ ์ด ์์ ์์ ์์ค ์ปฌ๋ฌํค๋ก ์ฌ์ฉํ ์ปฌ๋ฌ ํค๋ ์ปฌ๋ฌ ์คํ์ด์ค๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ์ ์ง์ ํ๋ค. ๋ ๋ฒ์งธ ์ธ์์ธ lpDDColorKey๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด ๊ฐ์ฒด์ ์๋ก์ด ์ปฌ๋ฌํค ๋ก ์ฌ์ฉ๋ ๊ฐ์ ํฌํจํ๋ DDCOLORKEY ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. Restore ํจ์ ์ด ํจ์๋ ์ ์ค๋์๋ ๋ฉด ๊ฐ์ฒด์ ๋ด์ฉ์ ๋ณต๊ตฌํด์ค๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ์ ์ฌ์ฉํ๋ ์ถ๋ ฅ ๊ด๋ จ ์์์ GDI์ ๊ณต์ ๋๋ ๋ถ๋ถ์ด ๋ง๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ก ์ธํด ๊ฐ๋ ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด ๊ฐ์ฒด์ ๋ด์ฉ์ด ๊นจ์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์ ๋ฐ๋ก ์ด ํจ์๋ฅผ ํธ์ถํด์ฃผ์ด์ผ ํ๋ฉฐ ๋ฉด ๊ฐ์ฒด์ ๋ด์ฉ์ด ์ ์ค๋ ์๋์ง์ ์ฌ๋ถ๋ IsLost ํจ์๋ฅผ ํธ์ถํด๋ณด๋ฉด ์ ์ ์๋ค. ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ค์ด๋ ํธ ๋๋ก์ฐ ๋ฉด ๊ฐ์ฒด ๊ด๋ จ ํจ์๋ค์ ๋ฆฌํด ๊ฐ์ด DDERR_SURFACELOST์ธ์ง๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ค์ํ ๊ฒ์ ์ด ํจ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ค์ ์ก์์ค ๋ฟ์ด์ง ์ ์ค ์ด์ ์ ๋ค์ด์๋ ๋ด์ฉ๊น ์ง ๋ณต๊ตฌํด์ฃผ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ์ด๋ป๊ฒ ๋ด์ฉ์ ๋ณต๊ตฌํ ๊ฒ์ธ์ง๋ ๊ฐ๋ฐ์์ ์ฑ ์์ด๋ค. ์ด ํจ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค. HRESULT Restore(); ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ(DirectDrawPalette) ๊ฐ์ฒด ๋ค์ด๋ ํธ ๋๋ก์ฐ ๊ฐ์ฒด์ CreatePalette ํจ์๋ฅผ ํตํด ์์ฑ๊ฐ๋ฅํ๋ฉฐ ๋ชจ๋ 4 ๊ฐ์ ๊ฐ๋จํ ํจ์๋ค์ ๊ตฌ์ฑ๋๋ค. ์ด ์ค์์ GetCaps์ GetEntries์ ๋ํด ์๋ง ์์๋ณด์. GetCaps ํจ์ ์ด ํจ์๋ ํ๋ ํธ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ์์๋ณด๋๋ฐ ์ฌ์ฉ๋๋ค. ์ด ํจ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค. HRESULT GetCaps(LPDWORD lpdwCaps); lpdwCaps ์ธ์๋ก๋ ํ๋ ํธ์ ๊ตฌ์ฑ์ ๋ํ๋ด๋ ๊ฐ์ด ๋ค์ด์ค๋๋ฐ ์ด ๊ฐ ์ DDCAPS ๊ตฌ์กฐ์ฒด์ dwPalCaps ํ๋์ ๊ฐ๊ณผ ๋์ผํ๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ด ๊ฐ ๋ฅํ๋ค. DDPCAPS_1BIT, DDPCAPS_2BIT, DDPCAPS_4BIT, DDPCAPS_8BIT, DDPCAPS_8BITENTRIES, DDPCAPS_ALLOW256, DDPCAPS_PRIMARY SURFACE, DDPCAPS_PRIMARYSURFACELEFT, DDPCAPS_VSYNC GetEntries ํจ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ ํ๋ ํธ ๊ฐ์ฒด์์ ํ๋ ํธ ๊ฐ์ ์ป์ด์จ๋ค. GetEntries ํจ ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค. HRESULT GetEntries(DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries); dwFlags ์ธ์๋ ํ์ฌ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ 0์ ์ง์ ํด์ผ ํ๋ค. dwBase ์ธ์๋ ์ป๊ณ ์ ํ๋ ํญ๋ชฉ์ ์์ ๋ฒํธ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. dwNumEntries ์ธ์๋ dwBase ํญ ๋ชฉ์๋ถํฐ ๋ชจ๋ ๋ช ๊ฐ์ ํญ๋ชฉ์ ์ฝ์ด๊ฐ๋ ค ํ๋์ง ๊ทธ ์๋ฅผ ์ง์ ํ๋ค. lpEntries ์ธ์๋ ์ด๋ฐ ํ๋ ํธ ํญ๋ชฉ์ ๊ฐ์ ๋ฐ์๊ฐ ๋ฒํผ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๋ง์ผ DDPCAPS_8BITENTRIES ํ๋๊ทธ๊ฐ ์ค์ ๋ ํ๋ ํธ๋ผ๋ฉด ๊ฐ ํญ๋ชฉ์ ํฌ๊ธฐ๋ 1 ๋ฐ์ดํธ๊ฐ ๋๊ณ ๋๋จธ์ง ๊ฒฝ์ฐ์๋ 4๋ฐ์ดํธ๊ฐ ๋๋ค. - ๊ณ์ -- the end of this article -
์ ๋ชฉ:[๊ฐ์ข] DirectX Programming (6)
๋ค์ด๋ ํธ ์ฌ์ด๋ ์ค์ ํ๋ก๊ทธ๋๋ฐ
๊ฒ์์ ์์ด ์ค์ํ ๊ฒ ์ค์ ํ๋๊ฐ ๋ฐ๋ก ์ํฅ ํจ๊ณผ์ด๋ค. ์์ฆ์ ๊ฒ์๋ง
๋ค ์ํฅ ํจ๊ณผ์ ์ค์๋ ํ์ธต ๋ ๋ฐฐ๊ฐ๋๋ ๋ถ์๊ธฐ์ด๋ค. ์ฌ์ค์ ์ธ ์ํฅ์ผ๋ก
์ธํด ๊ฒ์์ ํ์ธต ๋ ๋ชฐ์ ํ ์ ์๋ ๊ฒ์ ๋ฌผ๋ก ์ด๊ณ ๋ ์ข ๋ค์์ ๊ฒ ๊ฐ
์ ๋ฐฐ๊ฒฝ ์์ ์ด ๊ณ์์ ์ผ๋ก ๋ค๋ ค๋์ค๊ธฐ๋ ํ๋ค. ๋ค์ด๋ ํธX์ ๋ก์ฐ๋ ๋ฒจ ์
๋น์ค์ธ ๋ค์ด๋ ํธ ํ์ด๋ฐ์ด์ ์ ์ผ๋ถ๋ก ์กด์ฌํ๋ ๋ค์ด๋ ํธ ์ฌ์ด๋์์ ๋ฐ
๋ก ์ด๋ฐ ๊ธฐ๋ฅ์ ์ฌ๋ฌ๋ถ์ ํ๋ก๊ทธ๋จ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋๋ก ํด์ค๋ค.
๋ค์ด๋ ํธ ์ฌ์ด๋ ์ค์ ํ๋ก๊ทธ๋๋ฐ
๋ค์ด๋ ํธ ์ฌ์ด๋๋ ?
๋ค์ด๋ ํธ ์ฌ์ด๋๋ ๋์งํธ ์ฌ์ด๋๋ฅผ ํ๋ ์ดํ๊ณ ์บก์ฒํ๊ณ ์ด๋ค์ ๋ฏน์ฑํ
์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ค๋ค. ๋ค๋ฅธ ๋ค์ด๋ ํธX ์ปดํฌ๋ํธ๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด
์ญ์ ํ๋์จ์ด๋ฅผ ๊ฐ๋ฅํํ ์ต๋๋ก ์ด์ฉํ๊ณ ํ ์ ์๋ ๊ฒฝ์ฐ์๋ง ์ํํธ์จ
์ด๋ฅผ ์ด์ฉํ๋ค. ๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด๋ ์์คํ ์์ ์ค๋์ค ํ๋์จ์ด๋ฅผ
๋ํ๋ธ๋ค. ์ด ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ์ฌ์ด๋ ์นด๋, ์คํผ์ปค์ ๊ด๋ จ ๋ฉ๋ชจ๋ฆฌ ํ๊ฒฝ์ ์
์ดํ ์ ์๋ค. ํ์ฌ๊น์ง ๋ค์ด๋ ํธ ์ฌ์ด๋๋ ์์ถ๋ ํ์์ ์ฌ์ด๋ ๋ฐ์ด
ํฐ๋ ์ง์ํ์ง ๋ชปํ๋ค.
์ฆ, ์๋ฅผ ๋ค์ด .WAV ํ์์ ํ์ผ์ ๋ค์ด๋ ํธ ์ฌ์ด๋๋ฅผ ํตํด ์ฐ์ฃผํ๋ ค๋ฉด
๊ทธ ํ์ผ์ ๋ฐ์ดํฐ๊ฐ ์์ถ๋์ด ์์ ๊ฒฝ์ฐ ์์ถ์ ํ์ด์ ์ฐ์ฃผํด์ผ ํ๋ค. ๋ค
์ด๋ ํธ ์ฌ์ด๋์ ๊ตฌ์กฐ๋ ๊ทธ๋ฆผ 10๊ณผ ๊ฐ๋ค.
๊ทธ๋ฆผ 10 : ๋ค์ด๋ ํธ ์ฌ์ด๋ ์์คํ ์ ๊ตฌ์กฐ
๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ด๋ จ ๊ฐ์ฒด
๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด๋ ํ๋ ์ด์ ์บก์ฒ๋ณ๋ก ๋ณ๋์ ์์ ๊ฐ์ฒด๋ฅผ ์ด์ํ
๋ค. ๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ด๋ จ ๊ฐ์ฒด๋ก๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ์๋ค.
- ๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด
- ๋ค์ด๋ ํธ ์ฌ์ด๋ ๋ฒํผ ๊ฐ์ฒด
- ๋ค์ด๋ ํธ 3D ์ฌ์ด๋ ๋ฒํผ ๊ฐ์ฒด
- ๋ค์ด๋ ํธ ์บก์ฒ ๊ฐ์ฒด
๋ค์ด๋ ํธ ๋๋ก์ฐ์์์ฒ๋ผ ์ค์ฌ์ด ๋๋ ๊ฐ์ฒด๋ ๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด์ด
๋ค. ์ด ๊ฐ์ฒด๋ฅผ ํตํด ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ์์ฑํ๊ฒ ๋๋ค. ์ด๋ค ์ํฅ์ ์ถ๋ ฅํ๋ ค
๋ฉด ๋ค์ด๋ ํธ ์ฌ์ด๋ ๋ฒํผ ๊ฐ์ฒด๋ 3D ์ฌ์ด๋ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ค. ๋ง
์ผ ์ด๋ค ์ํฅ์ ๋ น์ํ๊ณ ์ ํ๋ค๋ฉด ๋ค์ด๋ ํธ ์บก์ฒ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๋ค.
๋ค์ด๋ ํธ ์ฌ์ด๋ ํ๋ก๊ทธ๋จ ์์ฑ
๋ง๋ค๊ณ ์ ํ๋ ๋ค์ด๋ ํธ ์ฌ์ด๋ ์์ ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ฅ์ ๊ฐ๋จํ๋ค. ํ์ผ
๋ฉ๋ด์ ์ด๊ธฐ ๋ช ๋ น์ ํตํด .WAV ํ์ผ์ ๋ก๋ํ ๋ค์ ์ฐ์ฃผ ๋ช ๋ น์ ํํ
๋ฉด .WAV ํ์ผ์ ์ฐ์ฃผ๋ฅผ ์์ํ๊ณ ์ค์ง ๋ช ๋ น์ ํํ๋ฉด ์ฐ์ฃผ๋ฅผ ์ค๋จํ๋ค.
์์ ํ๋ก๊ทธ๋จ์ ์์
๋ค์ด๋ ํธ ๋๋ก์ฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ ์ผ ๋จผ์ ํด์ผํ ์ผ์ dsound.h๋ผ๋ ํค๋
ํ์ผ์ ํฌํจํ๊ณ dsound.lib์ winmm.lib๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ ๋งํฌ์
๋ผ์ด๋ธ๋ฌ๋ฆฌ ํญ๋ชฉ์ผ๋ก ์ง์ ํ๋ ์ผ์ด๋ค. ์์ Project์ Settings ๋ช ๋ น์
์ด์ฉํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ ์ง์ ํ๋ ์๋ ์ค๋ช ํ์๋ค. ์ด ์์ ํ๋ก๊ทธ๋จ ์ญ
์ API๋ฅผ ์ด์ฉํด ์์ฑํ ๊ฒ์ด๋ค. ์ด ํ๋ก๊ทธ๋จ์ ๋ณดํต์ ์๋ ํ๋ก๊ทธ๋จ
๊ณผ ๋์ผํ ํํ์ WinMain์ ๊ฐ๋๋ค. WinMain์ ๋ํ ์ค๋ช ์ ์๋ตํ๊ธฐ๋ก
ํ๊ฒ ๋ค.
๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด์ ์ด๊ธฐํ
์ผ๋จ ๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด๋ฅผ ๋ํํ๋ ์ ์ญ ๋ณ์๋ฅผ ํ๋ ์ ์ธํ๋ค.
// DirectSound ๊ด๋ จ ๋ณ์
LPDIRECTSOUND pDirectSoundObj; // DirectSound ๊ฐ์ฒด
๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด์ ์ด๊ธฐํ๋ WM_CREATE ๋ฉ์์ง๋ถ์์ ์ํํ๋ค.
switch (message)
{
// ๋ณ์๋ฅผ ์ด๊ธฐํํ๋ค.
case WM_CREATE:
{
pDirectSoundObj = NULL;
// ๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด๋ฅผ ์ผ๋จ NULL๋ก
pDirectSoundBuffer = NULL;
// ๋ค์ด๋ ํธ ์ฌ์ด๋ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ์ผ๋จ NULL๋ก
// ----------------------------------
// DirectSound ๊ด๋ จ ์ด๊ธฐํ๋ฅผ ์ํํ๋ค.
// ----------------------------------
if (DirectSoundCreate(NULL, &pDirectSoundObj, NULL) != DS_OK)
return -1;
// ์ฐ์ ์์ ๋ ๋ฒจ์ ์ ํ๋ค.
if (pDirectSoundObj->SetCooperativeLevel(hWnd, DSSCL_NORMAL) != DS_OK)
return -1;
return 0;
}
๋ค์ด๋ ํธ ์ฌ์ด๋์๋ ๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด์ ์์ฑ์ ์ํด์
DirectSoundCreate๋ผ๋ ๋ณ๋์ ๋์ฐ๋ฏธ ํจ์๋ฅผ ์ ๊ณตํด์ค๋ค. ์ด๋ฅผ ์ด์ฉํด ๋ค
์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ด ํจ์ ๋ฐ ์ดํ์ ๋์ค๋ ๋ค์ด๋ ํธ ์ฌ์ด
๋ ๊ด๋ จ ํจ์์ ์์ธํ ๊ธฐ๋ฅ์ ๋ํด์๋ ๋ค์ ์๋ ๋ค์ด๋ ํธ ์ฌ์ด๋ ๋ ํผ๋ฐ
์ค๋ฅผ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋ค.
๋ง์ผ DirectSoundCreate์ ๊ฐ์ ๋์ฐ๋ฏธ ํจ์๋ฅผ ์ด์ฉํ์ง ์๋๋ค๋ฉด
CreateInstance์ ๊ฐ์ COM API๋ฅผ ์ด์ฉํ์ฌ ์ฝ๊ฐ์ ๋ณต์กํ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฑ
ํด์ผ ํ๋ค. ๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด์ ์์ฑ์ด ๋๋๋ฉด ์ด๊ฒ์ ํ๋ ๋ ๋ฒจ์
์ค์ ํด์ผ ํ๋ค. ์ฌ์ด๋ ์ฅ์น๋ผ๋ ๊ฒ์ด ํผ์์๋ง ๋ ์ ํ ์ ์๋ ๊ฒ์ด ์๋
๋ค. ์๋๋ฉด ์๋ ์ด์์ฒด๊ณ๋ ๋ฉํฐํ์คํฌ ํ๊ฒฝ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์
์ ์ฌ์ด๋ ๋๋ฐ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ค ํ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๋ ๋ ๋ฒจ์ ์ง
์ ํ์ฌ ๋จ๋ค๊ณผ์ ๊ณต์กด์ ๊พํ๊ฑฐ๋ ๋ ์ ์ ์๋ํ ์๋ ์๋ค. ์ฌ๊ธฐ์
๋ ๋ ๋ฒ์งธ ์ธ์๋ก DSSCL_NORMAL์ ์ฃผ์ด ๊ณต์กด์ ๊พํ๊ณ ์๋ค. ์ด๋
๊ฒ DSSCL_NORMAL์ ์ฃผ๋ฉด ์ฌ์ด๋ ์นด๋๋ฅผ ํตํ ์ถ๋ ฅ์ด 22KHz์ 8๋นํธ ์ํ
๋ฐ์ดํฐ์ ์คํ ๋ ์ค ์ฌ์ด๋๋ก ๊ณ ์ ๋๋ค๋ ์ ๋ ๊ฐ์ด ์์๋๊ธฐ ๋ฐ๋๋ค.
์ด๋ ๊ฒ ํ๋๋ก ๊ณ ์ ์์ผ์ผ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์์ ๊ณต์ฉํ๊ธฐ๊ฐ ์ฝ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ๋ ๋ ๋ฒจ์๋โ์ ์(normal)โ,โ์ฐ์ (priority)โ,โ๋ ์ (exclusive)โ,
โ์ฐ๊ธฐ์ฐ์ (write primary)โ์ด ์๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํน๋ณํ ์ด์ ๊ฐ ์๋ค
๋ฉด โ์ ์โ์ ์ฌ์ฉํ๋ค.
๋ค์ด๋ ํธ ์ฌ์ด๋ ๋ฒํผ ๊ฐ์ฒด์ ์์ฑ
๋ค์ด๋ ํธ ์ฌ์ด๋๋ฅผ ์ด์ฉํด ์ฌ์ด๋ ์ถ๋ ฅ์ ํํ๋ ค๋ฉด ๋ฒํผ ๊ฐ์ฒด๋ฅผ ๋ณ๋๋ก ์
์ฑํด ์ฃผ์ด์ผ ํ๋ค. ์ด๋ฌํ ๊ฐ๋ ์ ๋ค์ด๋ ํธ ๋๋ก์ฐ์์์ ๋น์ทํ ๋ฉด์ด ์
๋ค. ๋ค๋ง ๋ค์ด๋ ํธ ๋๋ก์ฐ์์๋ ์ ์ ๋ฒํผ์ ํ์ ๋ฒํผ๋ฅผ ๋ช ์์ ์ผ๋ก ์์ฑ
ํด์ฃผ์ด์ผ ํ์ง๋ง ๋ค์ด๋ ํธ ์ฌ์ด๋์์๋ ์ฃผ ์ฌ์ด๋ ๋ฒํผ(Primary sound
buffer)๋ ๋ช ์์ ์ผ๋ก ์์ฑํ ํ์๊ฐ ์๊ณ ๋ค๋ง ์ด์ฐจ ์ฌ์ด๋ ๋ฒํผ๋ง ๋ช ์
์ ์ผ๋ก ์์ฑํ๋ฉด ๋๋ค.
๊ทธ๋์ ์ด์ฐจ ์ฌ์ด๋ ๋ฒํผ์ ์ฌ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์จ๋ฃ๊ณ Play ๋ช ๋ น์ ์ฃผ๋ฉด ์ค
์ง ๋ช ๋ น์ด ๋ค์ด๊ฐ ๋๊น์ง ๋ค์ด๋ ํธ ์ฌ์ด๋๋ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ณ์์ ์ผ๋ก ์ฐ์ฃผ
ํ๋ค.
๋ฌผ๋ก ํ ๋ฒ๋ง ์ฐ์ฃผํ๊ณ ๋๋ด๋๋ก ํ ์๋ ์๊ณ ์ง์ ์ฃผ ์ฌ์ด๋ ๋ฒํผ๋ฅผ ์ ์ด
ํ ์๋ ์๋๋ฐ ํ์์ ๋ฐฉ๋ฒ์ ๊ทธ๋ค์ง ์ข์ ๋ฐฉ๋ฒ์ ์๋ ๋ฏ ํ๋ค.
๋ค์ด๋ ํธ ์ฌ์ด๋๋ฅผ ์ด๊ธฐํํ๋ฉด ๋ค์ด๋ ํธ ์ฌ์ด๋๋ ๋ด๋ถ์ ์ผ๋ก ์ฃผ ์ฌ์ด๋
๋ฒํผ๋ฅผ ์์ฑํ์ฌ ์๋ฆฌ๋ฅผ ํฉ์ฑํ๊ณ ์ถ๋ ฅ์ฅ์น๋ก ๋ด๋ณด๋ด๋๋ฐ ์ฌ์ฉํ๋ค. ๊ฐ
์ฌ์ด๋๋ฅผ ์ถ๋ ฅํ๋ ค๋ฉด ๊ฐ๊ธฐ ์ด์ฐจ ๋ฒํผ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํด์ผ ํ๋ค. ์ฌ์ด๋ ๋ฏน์ฑ
์ ์ด์ฐจ ๋ฒํผ์ ์๋ ์ฌ์ด๋๋ฅผ ๋์์ ์ถ๋ ฅํ์ฌ ์ด๋ค์ง๋ค. ๋ค์ด๋ ํธ ์ฌ์ด
๋ ๋ฏน์์ ์ง์ฐ ์๊ฐ์ 20ms ์ ๋์ด์ง๋ง ์ด๋ฅผ ์ํํธ์จ์ด๋ก ์ ๋ฎฌ๋ ์ดํธ
ํ ๊ฒฝ์ฐ๋ 100~150ms ์ ๋์ ์ง์ฐ ์๊ฐ์ด ๋ฐ์ํ๋ค.
์ด์ฐจ ์ฌ์ด๋ ๋ฒํผ๋ฅผ ์์ฑํ ๋๋ ์ด๊ฒ์ด ์คํํฑ ์ฌ์ด๋ ๋ฒํผ์ธ์ง ์๋๋ฉด
์คํธ๋ฆฌ๋ฐ ์ฌ์ด๋ ๋ฒํผ์ธ์ง๋ฅผ ๋ช ์ํด์ผ ํ๋ค. ์คํํฑ ์ฌ์ด๋ ๋ฒํผ๋ ๋ฉ๋ชจ๋ฆฌ
์ ์ฌ์ด๋๋ฅผ ๋ชจ๋ ๋ณด๊ดํ๋ค. ์คํธ๋ฆฌ๋ฐ ์ฌ์ด๋ ๋ฒํผ๋ ์ฌ์ด๋์ ์ผ๋ถ๋ง ์ ์ง
ํ๋ค. ์คํธ๋ฆฌ๋ฐ ๋ฒํผ๋ฅผ ์ฌ์ฉํ ๋๋ ์์ฉํ๋ก๊ทธ๋จ์์ ์ฃผ๊ธฐ์ ์ผ๋ก ์๋ก์ด
๋ฐ์ดํฐ๋ฅผ ๋ฒํผ์ ์จ๋ฃ์ด์ผ ํ๋ค.
๋ง์ผ ์ฌ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋๊ณ ์ฐ์ฃผํ๋ ค ํ๋ค๋ฉด ๋ฒํผ ๊ด๋ฆฌ
์๋ ๊ฑฐ์ ์ ๊ฒฝ์ธ ์ผ์ด ์๋ค. ํ์ง๋ง ์ด๋ ์์ ํฌ๊ธฐ์ ์ฌ์ด๋ ํ์ผ์๋ง
๊ฐ๋ฅํ ์ผ์ด๋ค. ํฐ ํ์ผ์ ๊ฒฝ์ฐ์๋ ๋ณด๋ค ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์จ์ผ
ํ๋ค. ํฐ ํ์ผ์ด ์๋๋๋ผ๋ ์ฌ๋ฌ ๊ฐ์ ์ฌ์ด๋ ํ์ผ์ ๋์์ ์ฐ์ฃผํ ๊ฒฝ์ฐ
์๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ์คํธ๋ฆฌ๋ฐ(streaming)์ด ๋ฐ๋ก ์์ ๋ฒํผ๋ฅผ ํตํด ์ปค๋ค๋
ํ์ผ์ ์ฐ์ฃผํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ฆ ๋ฉ๋ชจ๋ฆฌ๋ ์กฐ๊ธ๋ง ํ ๋นํด๋๊ณ ๊ณ์์ ์ผ๋ก
์ฌ์ด๋ ํ์ผ์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ค๊ฐ ์ฑ์ฐ๋ ๋ฐฉ์์ ํํ๋ ๊ฒ์ด๋ค.
์ด ๋ฐฉ๋ฒ์ ํจ์จ์ ์ด๊ธด ํ์ง๋ง ์ฐ์ฃผ๋๋ ์๋๊ฐ ์ฑ์์ง๋ ์๋๋ณด๋ค ๋น ๋ฅผ ๊ฒฝ
์ฐ ๋ฌธ์ ๊ฐ ๋๋ค. ์ฆ, ์ง์ฐ์ด ๋ฐ์ํ์ฌ ๋ฃ๋ ์ฌ๋ ์ ์ฅ์์๋ ๋๊ธฐ๋ ๋ฏํ
๋๋์ด๋ ์ก์์ด ๋ค๋ฆด ์๊ฐ ์๋ค.
์ด ๋ฐฉ๋ฒ์ ๊ด๊ฑด์ ๋ฐ๋ก ๋ฒํผ๊ฐ ๋น์์ง๊ธฐ ์ ์ ์ฑ์๋ฃ๋ ์ ํฉํ ์์ ์ ์ด
๋ป๊ฒ ์ฐพ์๋ด๋๋์ ๋ฌ๋ ค์๋ค. ์ฌ๊ธฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ด ์๋ค.
- ํ์ด๋จธ ๋ฉ์์ง ๋ฑ์ ์ด์ฉํด ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฒ์ฌํ๋ค.
- ๋ฒํผ์ ํน์ ์์น๊ฐ ์ฐ์ฃผ๋๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋๋ก ํ๋ค.
์์ ํ๋ก๊ทธ๋จ์์๋ ๊ฐ๋จํ๊ฒ ์คํํฑ ์ฌ์ด๋ ๋ฒํผ๋ฅผ ์ฌ์ฉํด ์ฌ์ด๋ ํ์ผ
๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋๊ณ ํ ๋ฒ์ ์ฐ์ฃผํด๋ณด๋๋ก ํ๊ฒ ๋ค. ๋ค์๊ณผ ๊ฐ
์ ๋ณ์๋ฅผ ์ ์ญ ๋ณ์๋ก ์ ์ํ๋ค.
LPDIRECTSOUNDBUFFER pDirectSoundBuffer;
// ์ฌ์ด๋ ๋ฒํผ ๊ฐ์ฒด
// WAVE ํ์ผ ๊ด๋ จ ๋ณ์
DWORD waveSize;
BOOL waveOK;
char *pWave;
WAVEFORMATEX waveFormatEx;
๋จผ์ ์ฌ์ฉ์๊ฐ ํ์ผ ๋ฉ๋ด์ ์ด๊ธฐ ๋ช ๋ น์ ํํ๋ฉด ๋ฆฌ์คํธ 11์ ์ฝ๋๊ฐ ์คํ๋
๋ค.
===============================================================
๋ฆฌ์คํธ 11 : ํ์ผ ๋ฉ๋ด์ ์ด๊ธฐ ๋ช
๋ น์ ํํ๋ฉด ์คํ๋๋ ์ฝ๋
---------------------------------------------------------------
case WM_COMMAND :
{
switch(LOWORD(wParam))
{
case ID_OPEN :
{
OPENFILENAME ofn;
char buffer[MAXCHARS];
buffer[0] = 0;
memset(&ofn, 0x00, sizeof
(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = "Wave Files\
000*.wav\000\000";
ofn.nFilterIndex = 1;
ofn.lpstrFile = buffer;
ofn.nMaxFile = MAXCHARS;
// ํ์ผ ์คํ ๋ค์ด์๋ก๊ทธ๋ฅผ ๋์ด๋ค.
if (GetOpenFileName(&ofn))
{
if (!Load(buffer, TRUE))
// ์ง์ ๋ Wave ํ์ผ์ ๋ก๋ํ๋ค.
{
MessageBox(hWnd, "Wave ํ์ผ์ด
์๋๋๋ค.", "์๋ฌ", MB_OK);
}
}
break;
}
}
}
===============================================================
๋ฆฌ์คํธ 11์ ํ์ผ ์คํ ๋ค์ด์ผ๋ก๊ทธ ๋ฐ์ค๋ฅผ ์คํ์์ผ ์ฌ์ฉ์๋ก๋ถํฐ .WAV
ํ์ผ์ ์ ๋ ฅ๋ฐ๋๊ฒ์ด๋ค. ์ฌ์ฉ์๊ฐ ํ์ผ์ ์ ๋ ฅ์ ๋๋ด๊ณ OK ๋ฒํผ์ ๋๋ฅด๋ฉด
Load ํจ์๋ฅผ ์คํ์์ผ ์ด์ฐจ ์ฌ์ด๋ ๋ฒํผ๋ฅผ ์์ฑํ๊ณ ๊ฑฐ๊ธฐ๋ก WAV ํ์ผ์ ๋ชจ
๋ ๋ด์ฉ์ ์ฌ๋ ค๋ฒ๋ฆฐ๋ค. Load ํ์ผ์ ๋ค์๊ณผ ๊ฐ๋ค.
// ----------------------------------------------------
// Load : ์ง์ ํ ํ์ผ์ ๋ก๋ํ์ฌ ์ด์ฐจ ๋ฒํผ๋ฅผ ๋ง๋ค๊ณ ๊ฑฐ๊ธฐ์
// ์ฌ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ค.
// ----------------------------------------------------
BOOL Load(LPCSTR pWavFileName, BOOL bAll)
{
// ์ด์ฐจ ๋ฒํผ๋ฅผ ์์ฑํ๋ค.
if (!CreateBuffer(pWavFileName, bAll))
return FALSE;
// ์ฌ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ค.
return LoadSoundData(bAll, (bAll) ? 0 : cbBufSize);
}
์์ ํจ์์์๋ ์ด์ฐจ ์ฌ์ด๋ ๋ฒํผ๋ฅผ ์์ฑํ๊ธฐ ์ํด CreateBuffer๋ผ๋ ํจ
์๋ฅผ ์ด์ฉํ๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ธฐ ์ํด
LoadSoundData๋ผ๋ ํจ์๋ฅผ ํธ์ถํ๊ณ ์๋ค. ์ด ๋ ํจ์์ ๋ด์ฉ์ ๋ฆฌ์คํธ
12, 13, 14์ ๊ฐ๋ค.
CreateBuffer ํจ์๋ฅผ ๋ณด๋ฉด WAV ํ์ผ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ธฐ ์ํด LoadWave
FileToPCM์ด๋ ํจ์๋ฅผ ํธ์ถํ๋ค. ์ด ํจ์๋ WAV ํ์ผ์ ์์ถ ๋ฐ์ดํฐ๋ฅผ ๋ค
์ด๋ ํธ ์ฌ์ด๋์์ ์ฌ์ฉํ ์ ์๋๋ก ํ์ด์ฃผ๋ ์ญํ ์ ๋ด๋นํ๋ค. ๊ทธ๋ฌ
๊ธฐ ์ํด์ ์๋์ mmIO ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ ๊ทธ ๋ด์ฉ์ด ๊ฝค ๊น๋ค๋กญ
๋ค. ํ์๋ ๊ทธ ๋ด์ฉ์ ์ดํดํ ๊ฒ์ ์๋๊ณ ์น์ฌ์ดํธ์์ ๋จ๋ค์ด ๋ง๋ค์ด ๋
์ ๊ฒ์ ๊ฐ์ ธ๋ค ์ผ๋ค. LoadWaveFileToPCM ํจ์์์๋ ์ผ๋จ WAV ํ์ผ์ ๋ฐ
์ดํฐ๋ฅผ pWave๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฌ๋ ค๋๊ณ ๊ทธ ํฌ๊ธฐ๋ฅผ waveSize ๋ณ์์ ์
์ฅํด๋๋ค.
===============================================================
๋ฆฌ์คํธ 12 : CreateBuffer ํจ์
// ----------------------------------------------
// CreateBuffer : ์ง์ ๋ ํ์ผ์ ์ฝ์ด๋ค์ฌ DirectSound
// ์ด์ฐจ ๋ฒํผ๋ฅผ ๋ง๋ ๋ค.
// ----------------------------------------------
BOOL CreateBuffer(LPCSTR sndFileName, BOOL bAll)
{
DSBUFFERDESC dsBufferDesc;
// WAV ํ์ผ์ ๋ก๋ํ๋ค.
if (LoadWaveFileToPCM((LPSTR)sndFileName)
== FALSE)
return FALSE;
// DSBUFFERDESC ๊ตฌ์กฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ค.
memset(&dsBufferDesc, 0, sizeof
(DSBUFFERDESC));
dsBufferDesc.dwSize = sizeof(DSBUFFERDESC);
dsBufferDesc.dwFlags = DSBCAPS_CTRLDEFAULT;
if (bAll)
dsBufferDesc.dwBufferBytes = waveSize;
else
{
cbBufSize = 2000;
dsBufferDesc.dwBufferBytes = waveSize;
}
dsBufferDesc.lpwfxFormat
= (LPWAVEFORMATEX)&waveFormatEx;
// ์์ ์์ฑ๋ ์ด์ฐจ ๋ฒํผ๊ฐ ์์ผ๋ฉด ์ด๋ฅผ ๋จผ์ ํด์ ํ๋ค.
if (pDirectSoundBuffer)
pDirectSoundBuffer->Release();
// ์ด์ฐจ ๋ฒํผ๋ฅผ ์์ฑํ๋ค.
if (pDirectSoundObj->CreateSoundBuffer
(&dsBufferDesc, &pDirectSoundBuffer, NULL)
!= DS_OK)
return FALSE;
return TRUE;
}
===============================================================
๋ค์์ผ๋ก DSBUFFERDESC ๊ตฌ์กฐ์ฒด์ dsBufferDesc ๋ณ์๋ฅผ ์ด๊ธฐํํ๊ณ ์ด์ฐจ
์ฌ์ด๋ ๋ฒํผ๋ฅผ ์์ฑํ๊ธฐ์ํด ๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด์ CreateSoundBuffer ํจ
์
๋ฅผ ํธ์ถํ์ฌ ๊ทธ ๊ฐ์ pDirectSoundBuffer ๋ณ์์ ์ ์ฅํด๋๋ค.
LoadWaveFile
ToPCM ํจ์์ ์ํ์ ๋ฆฌ์คํธ 13๊ณผ ๊ฐ๋ค.
===============================================================
๋ฆฌ์คํธ 13 : LoadWaveFileToPCM ํจ์
// ----------------------------------------------
// LoadWaveFileToPCM : ์ง์ ๋ ํ์ผ์ ์ฝ์ด๋ค์ฌ ์ด๋ฅผ
// ๋ฒํผ๋ก ์ฝ์ด๋ค์ธ๋ค.
// ----------------------------------------------
BOOL LoadWaveFileToPCM(char* fileName)
{
MMCKINFO mmCkInfoRIFF;
MMCKINFO mmCkInfoChunk;
HMMIO hMMIO;
// Open the wave file.
hMMIO = mmioOpen(fileName, NULL, MMIO_READ
| MMIO_ALLOCBUF);
if (hMMIO == NULL)
return FALSE;
// Descend into the RIFF chunk.
mmCkInfoRIFF.fccType = mmioFOURCC
('W', 'A', 'V', 'E');
if (mmioDescend(hMMIO, &mmCkInfoRIFF,
NULL, MMIO_FINDRIFF) !
= MMSYSERR_NOERROR)
return FALSE;
// Descend into the format chunk.
mmCkInfoChunk.ckid = mmioFOURCC
('f', 'm', 't', ' ');
if (mmioDescend(hMMIO, &mmCkInfoChunk,
&mmCkInfoRIFF, MMIO_FINDCHUNK)
!= MMSYSERR_NOERROR)
return FALSE;
// Read the format information into the
WAVEFORMATEX structure.
if (mmioRead(hMMIO, (char*)&waveFormatEx,
sizeof(WAVEFORMATEX)) == -1)
return FALSE;
// Ascend out of the format chunk.
if (mmioAscend(hMMIO, &mmCkInfoChunk, 0)
!= MMSYSERR_NOERROR)
return FALSE;
// Descend into the data chunk.
mmCkInfoChunk.ckid = mmioFOURCC
('d', 'a', 't', 'a');
if (mmioDescend(hMMIO, &mmCkInfoChunk,
&mmCkInfoRIFF, MMIO_FINDCHUNK)
!= MMSYSERR_NOERROR)
return FALSE;
// WAV ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ์ ์ฅํด๋๋ค.
waveSize = mmCkInfoChunk.cksize;
// WAV ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ๋ณดํด๋๋ค.
pWave = (char*)GlobalAllocPtr
(GMEM_MOVEABLE, waveSize);
if (pWave == NULL)
return FALSE;
// WAV ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ค.
if (mmioRead(hMMIO, (char*)pWave, waveSize)
== -1)
return FALSE;
mmioClose(hMMIO, 0);
return TRUE;
}
===============================================================
์ด๋ ๊ฒ ์ด์ฐจ ์ฌ์ด๋ ๋ฒํผ๊ฐ ์์ฑ๋๊ณ ์ฐ์ฃผํ๊ณ ์ ํ๋ WAV ํ์ผ์ ๋ด์ฉ
์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฝ์ด๋ค์ฌ ๋์์ผ๋ฉด WAV ํ์ผ์ ๋ด์ฉ์ ์ด์ฐจ ์ฌ์ด๋ ๋ฒํผ๋ก ๋ณต
์ฌํด๋์ด์ผ ํ๋ค. ๊ทธ ์ญํ ์ ํ๋ ๊ฒ์ด ๋ฐ๋ก LoadSoundData ํจ์์ด๋ค.
WAV ๋ฐ์ดํฐ๋ฅผ ์ด์ฐจ ์ฌ์ด๋ ๋ฒํผ๋ก ์จ๋ฃ์ผ๋ ค๋ฉด ์ด์ฐจ ์ฌ์ด๋ ๋ฒํผ์ ํฌ์ธํฐ
๋ฅผ ์ป์ด์ผ ํ๋ค. ๊ทธ ์ฉ๋๋ก ์ฌ์ฉ๋๋ ๊ฒ์ด ๋ฐ๋ก ๋ค์ด๋ ํธ ์ฌ์ด๋ ๋ฒํผ
๊ฐ์ฒด์ Lock ํจ์์ด๊ณ ์ฌ์ฉํ ๋ค์์๋ ๋ฐ๋์ Unlock ํจ์๋ฅผ ํธ์ถํ์ฌ ์ฌ
์ฉ์ด ๋๋ฌ์์ ์๋ ค์ผ ํ๋ค. Lock ํจ์๋ฅผ ๋ณด๋ฉด ์ด์ํ๊ฒ๋ ํฌ์ธํฐ๋ฅผ ํ๋
๊ฐ ์๋ ๋ ๊ฐ๋ฅผ ๋ฐ๋๋ก ๋์ด ์๋ค. ์ด๋ ์ด์ฐจ์ฌ์ด๋ ๋ฒํผ๋ฅผ ์คํธ๋ฆฌ๋ฐ
๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ๋๋ง ํ์ํ ๊ฒ์ด๋ค. ์์ ํ๋ก๊ทธ๋จ์์๋ ์คํํฑ ๋ฐฉ์์ผ
๋ก ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋๊ณ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ์ ํฌ์ธํฐ ์ค์์ ์์
๊ฒ ํ๋๋ง ํ์ํ๋ค.
์ฌ์ด๋์ ์ฐ์ฃผ์ ์ค์ง ์ด๋ ๊ฒ ์ฌ์ด๋ ๋ฐ์ดํฐ์ ์ด์ฐจ ์ฌ์ด๋ ๋ฒํผ์ ์์ฑ
์ด ์ข ๋ฃ๋์์ผ๋ฉด ์ด์ ์ฐ์ฃผํ๊ณ ์ค์งํ ์ค๋น๊ฐ ๋๋ ๊ฒ์ด๋ค.
์ฐ์ฃผ ๋ฉ๋ด์ ์ ์ฒด ์ฐ์ฃผ ๋ช ๋ น์ ํํ๋ฉด ๋ค์์ ๋ช ๋ น์ด ์คํ๋๋ค.
// --------------------------------------------------
// Play : ์ด์ฐจ ๋ฒํผ์ ์ฐ์ฌ์ง ๋ฐ์ดํฐ๋ฅผ ์ฐ์ฃผํ๋ค.
// --------------------------------------------------
BOOL Play(BOOL bInfiniteLoop)
{
if (pDirectSoundBuffer)
{
pDirectSoundBuffer->SetCurrentPosition(0);
pDirectSoundBuffer->Play(0, 0, DSBPLAY_LOOPING);
return TRUE;
}
return FALSE;
}
์ผ๋จ ์ด์ฐจ ์ฌ์ด๋ ๋ฒํผ์ ์์ ์ฐ์ฃผ ์์น๋ฅผ ์ฒ์์ผ๋ก ๋๋
๋ฆฌ๊ณ (SetCurrentPosition(0)) ์ฐ์ฃผ๋ฅผ ์์(Play)ํ๋ค. ์ธ ๋ฒ์งธ ์ธ์๋ก
DSBPLAY_LOOPING์ ์ฃผ์๊ธฐ ๋๋ฌธ์ ์ฐ์ฃผ๊ฐ ๋ฐ๋ณต๋๋ค. ์ด ์ฐ์ฃผ๋ฅผ ์ค์งํ๊ณ ์ถ
๋ค๋ฉด ์ค์ง ๋ช ๋ น์ ํํ๋ค. ์ด์ฐจ ์ฌ์ด๋ ๋ฒํผ ๊ฐ์ฒด์ Stop ํจ์๋ฅผ ํธ์ถํ
๋ฉด ํ์ฌ ์งํ ์ค์ด๋ ์ฐ์ฃผ๊ฐ ์ค๋จ๋๋ค. ์ค์ง ๋ช ๋ น์ ํํ๋ฉด ๋ค์ ํจ์๊ฐ ์ค
ํ๋๋ค.
// ---------------------------------------------------
// Stop : ์ฌ์ด๋ ๋ฐ์ดํฐ์ ์ฐ์ฃผ๋ฅผ ์ค๋จํ๋ค.
// ---------------------------------------------------
BOOL Stop()
{ if (pDirectSoundBuffer)
return (pDirectSoundBuffer->Stop()==DS_OK)
? TRUE : FALSE;
else
return FALSE;
}
์ด๊ฒ์ผ๋ก ๋ค์ด๋ ํธ ์ฌ์ด๋ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ๊ฐ๋จํ ์ดํด๋ณด์๋ค. ์ฌ์ค
์คํธ๋ฆฌ๋ฐ์ ์ด์ฉํ ์์ ๊น์ง๋ ์ดํด๋ด์ผ ์ ๋๋ก ๋ ๋ค์ด๋ ํธ ์ฌ์ด๋ ํ๋ก
๊ทธ๋๋ฐ์ ํ๋ค๊ณ ํ ์ ์์ ํ ๋ฐ ๋ค์ ๊ธฐํ์ ๊ผญ ๋ณด์ฌ๋๋ฆด ๊ฒ์ ์ฝ์ํ๋ค.
๋ค์ด๋ ํธ ์ฌ์ด๋ ๋ ํผ๋ฐ์ค
๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด
DirectSoundCreate ํจ์
์ด ํจ์๋ ๋ค์ด๋ ํธ ์ฌ์ด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํํ๋ ์ญํ ์ ๋ด๋นํ
๋ค.
์ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
HRESULT WINAPI DirectSoundCreate(LPGUID lpGuid, LPDIRECT
SOUND * ppDS, IUnknown FAR * pUnkOuter);
์ฒซ ๋ฒ์งธ ์ธ์์ธ lpGuid๋ก๋ ์์ฑํ๊ณ ์ ํ๋ ์ฌ์ด๋ ์ฅ์น๋ฅผ ๊ฐ๋ฆฌํค๋ GUID
๋ฅผ ์ง์ ํด์ผ ํ๋ค. ๋ง์ผ ๋ํดํธ ์ฌ์ด๋ ๋๋ฐ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด NULL์ ์ง
์ ํ๋ฉด ๋๋ค. ๋ ๋ฒ์งธ ์ธ์์ธ ppDS๋ก๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ์์ฑ๋๋ DirectSound
๊ฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ๋ฐ์์ค๋ ๊ณณ์ด๋ค. ์ธ ๋ฒ์งธ ์ธ์๋ ํ์ฌ๋ก๋ NULL์ ์ฃผ์ด
์ผ ํ๋ค. ์ด ํจ์๊ฐ ์ฑ๊ณตํ๋ฉด DS_OK๊ฐ ๋ฆฌํด๋๋ค. DirectSoundCreate๋ก
DirectSound ๊ฐ์ฒด์ ์์ฑ์ด ์ฑ๊ณตํ๋ฉด ๋ฐ๋ก SetCooperativeLevel ๋ฉ์๋๋ฅผ
ํธ์ถํด์ผ ํ๋ค.
CreateSoundBuffer ํจ์
CreateSoundBuffer ๋ฉ์๋๋ ์ค๋์ค ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋๋
๋ค์ด๋ ํธ ์ฌ์ด๋ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ด ํจ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
HRESULT CreateSoundBuffer(LPCDSBUFFERDESC
lpcDSBufferDesc, LPLPDIRECTSOUNDBUFFER
lplpDirectSoundBuffer, IUnknown FAR * pUnkOuter);
์ฒซ ๋ฒ์งธ ์ธ์์ธ lpcDSBufferDesc์ ์์ฑํ๊ณ ์ ํ๋ ์ฌ์ด๋ ๋ฒํผ์ ํํ๋ฅผ
๊ธฐ์ ํ DSBUFFERDESC ๊ตฌ์กฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค. ์ถ๋ ฅ๋ ์ค๋์ค ๋ฐ์ดํฐ์ ํ
์๊ณผ ํฌ๊ธฐ์ ๊ธฐ๋ฅ ๋ฑ์ ๊ธฐ์ ํ๋ค. ์๋ฅผ ๋ค์ด ๋ค์ด๋ ํธ ์ฌ์ด๋ ๋ฒํผ ๊ฐ
์ฒด์ SetFrequency ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ด ๊ตฌ์กฐ์ฒด์ dwFlags
ํ๋์ DSBCAPS_CTRLFREQUENCY๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
๋ ๋ฒ์งธ ์ธ์์ธ lplpDirectSoundBuffer๋ ์์ฑ๋ Direc tSoundBuffer ๊ฐ์ฒด
์ ์ฃผ์๋ฅผ ๋ฐ๋๋ค.
๋ง์ง๋ง ์ธ์๋ ํญ์ NULL์ด์ด์ผ ํ๋ค. ์ด ํจ์๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋๋๋ฉด ๋ฆฌํด
๊ฐ์ DS_OK๊ฐ ๋๋ค.
DSBUFFERDESC ๊ตฌ์กฐ์ฒด
์ด ๊ตฌ์กฐ์ฒด๋ ์์ฑํ๊ณ ์ ํ๋ DirectSoundBuffer ๊ฐ์ฒด์ ํน์ฑ์ ๊ธฐ์ ํ๋
๋ฐ ์ฌ์ฉ๋๋ค. ์ด ๊ตฌ์กฐ์ฒด๋ ์์์ ๋ณธ CreateSoundBuffer ๋ฉ์๋์ ์ํด ์ฌ
์ฉ๋๋ค.
์ด ๊ตฌ์กฐ์ฒด์ ๊ฐ ํ๋์ ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ๋ค.
LPWAVEFORMATEX lpwfxFormat;
DWORD dwSize : ์ด ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ๋ํ๋ธ๋ค.
DWORD dwFlags : ์ด ํ๋๋ ์์ฑ๋๋ DirectSoundBuffer์ ๊ธฐ๋ฅ์ ์ง์ ํ
๋๋ฐ ์ฌ์ฉ๋๋ค. ํ 7๊ณผ ๊ฐ์ ๊ฐ์ ํ๋ ์ด์ ์ง์ ํ ์ ์๋ค.
DWORD dwBufferBytes : ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ์ง์ ํ๋ค.
์ฃผ ๋ฒํผ๋ฅผ ์์ฑํ ๋๋ 0์ ์ง์ ํด์ผ ํ๋ค. ์ด ์ฐจ ๋ฒํผ์ ๊ฒฝ์ฐ์๋
DSBSIZE_
MIN์ DSBSIZE_MAX์ฌ์ด์ ํฌ๊ธฐ๋ฅผ ์ง์ ํด์ผํ๋ค.
DWORD dwReserved : ์ฌ์ฉ๋์ง ์๋๋ค.
LPWAVEFORMATEX lpwfxFormat
๋ฒํผ์์ ์ฌ์ฉํ ์ฌ์ด๋ ๋ฐ์ดํฐ์ ํํ์ ์ง์ ํ๋ค. ์ฃผ๋ฒํผ์ ๊ฒฝ์ฐ์๋
NULL์ ์ง์ ํด์ผ ํ๋ค. ์ฃผ ๋ฒํผ์ ์ฌ์ด๋ ํ์์ SetFormat ๋ฉ์๋๋ฅผ ์ด
์ฉํด ์ง์ ํ ์ ์๋ค.
SetCooperativeLevel ํจ์
SetCooperativeLevel ๋ฉ์๋๋ ์์ฉํ๋ก๊ทธ๋จ์์ ์ฌ์ด๋ ๋๋ฐ์ด์ค๋ฅผ ์ด
๋ป๊ฒ ์ฌ์ฉํ ๊ฒ์ธ์ง ํ๋ ๋ ๋ฒจ์ ์ง์ ํ๋ค. ์ด ํจ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
HRESULT SetCooperativeLevel(HWND hwnd, DWORD dwLevel);
์ฒซ ๋ฒ์งธ ์ธ์๋ก๋ ์ด ์์ฉํ๋ก๊ทธ๋จ์ ์๋ ํธ๋ค์ ์ง์ ํ๋ค. ๋ ๋ฒ์งธ ์ธ์
๋ก๋ ์ํ๋ ์ฐ์ ์์ ๋ ๋ฒจ์ ์ง์ ํ๋ค. ๋ค์ ๊ฐ ์ค์ ํ๋๋ฅผ ์ง์ ํด์ผ ํ
๋ค.
โ DSSCL_EXCLUSIVE : ๋ฐฐํ์ ๋ ์ ๋ ๋ฒจ์ ์ง์ ํ๋ค. ์ด ํ๋ก๊ทธ๋จ์ด ํฌ์ปค์ค
๋ฅผ ๊ฐ๊ณ ์์ ๋ ์ด ํ๋ก๊ทธ๋จ์ด ๋จ ํ๋์ ์ฌ์ด๋ ์์ค๊ฐ ๋๋ค. ์ด ๋
๋ฒจ์ DSSCL_PRIORITY ๋ ๋ฒจ์ ๋ชจ๋ ํน๊ถ์ ๋ค ํฌํจํ๋ค.
โ DSSCL_NORMAL : ์์ฉํ๋ก๊ทธ๋จ์ ๊ณต๋์์ ์ํ๋ก ๋ง๋ ๋ค. ๋๋ถ๋ถ์ ํ
๋ก๊ทธ๋จ์ ๋ณ๋ค๋ฅธ ์ด์ ๊ฐ ์๋ ํ ์ด ๋ชจ๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
โ DSSCL_PRIORITY : ์ด ๋ชจ๋์ ํ๋ก๊ทธ๋จ์ ๋ฒํผ์ ํ์์ ๋ณ๊ฒฝ(SetFormat
ํจ์ ํธ์ถ ๊ฐ๋ฅ)ํ ์ ์๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์จ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ๋์ง ์๋ ์
์ญ์ ์ด๋(Compact ๋ฉ์๋ ํธ์ถ ๊ฐ๋ฅ)์ํฌ ์ ์๋ค.
โ DSSCL_WRITEPRIMARY : ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋์ ๋ ๋ฒจ์ด๋ค. ์ฃผ ๋ฒํผ์ ๋ฐ
๋ก ์ฐ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฉฐ ์ด์ฐจ ๋ฒํผ๋ ํ์์๋ค.
๋ค์ด๋ ํธ ์ฌ์ด๋ ๋ฒํผ ๊ฐ์ฒด
Play ํจ์
Play ๋ฉ์๋๋ ์ฌ์ด๋ ๋ฒํผ์ ํ์ฌ ์์น๋ถํฐ ์ฐ์ฃผํ๋๋ก ํ๋ค. ์ด ํจ์์
์ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
HRESULT Play(DWORD dwReserved1, DWORD dwReserved2,
DWORD dwFlags);
์ฒซ ๋ฒ์งธ ์ธ์์ ๋ ๋ฒ์งธ ์ธ์๋ 0์ด์ด์ผ ํ๋ค. ์ธ ๋ฒ์งธ ์ธ์์ธ dwFlags
๋ ๋ฒํผ๋ฅผ ์ด๋ป๊ฒ ์ฐ์ฃผํ ๊ฒ์ธ์ง๋ฅผ ๋ํ๋ด๋ ํ๋๊ทธ์ด๋ค. DSBPLAY_LOOPING
์ ์ฃผ๋ฉด ์ฐ์ฃผ๊ฐ ๋ช ์์ ์ผ๋ก ์ค์ง๋ ๋๊น์ง ์ฐ์ฃผ๊ฐ ๊ณ์์ ์ผ๋ก ๋ฐ๋ณต๋๋ค.
Stop ํจ์
Stop ํจ์๋ ์ฌ์ด๋ ๋ฒํผ์ ์ฐ์ฃผ๋ฅผ ์ค์งํ๋ค. ๋ง์ง๋ง์ผ๋ก ์ฐ์ฃผํ๋ ๊ณณ
์์ ๋ฉ์ถ๊ธฐ ๋๋ฌธ์ ๋ค์ Play ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ฉ์ท๋ ๋ถ๋ถ์์๋ถํฐ ์ฐ์ฃผ
๊ฐ ๋ค์ ์์๋๋ค. ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
HRESULT Stop();
SetCurrentPosition ํจ์
SetCurrentPosition ํจ์๋ ๋ฒํผ(์ด์ฐจ ๋ฒํผ๋ง ๊ฐ๋ฅ)์ ํ์ฌ ์ฐ์ฃผ ์์น๋ฅผ
์ด๋์ํจ๋ค. ์ด ํจ์์ ์ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
HRESULT SetCurrentPosition(DWORD dwNewPosition);
์ธ์์ธ dwNewPosition์ผ๋ก๋ ๋ฒํผ์ ์๋ก์ด ์์น๋ฅผ ๋ํ๋ด๋ ์ซ์๋ฅผ ์ง์
ํ๋ค.
Lock ํจ์
Lock ํจ์๋ ๋ฒํผ์ ์ ํจํ ์ฐ๊ธฐ ํฌ์ธํฐ๋ฅผ ์ป์ด์ค๋ค. ์ด ํจ์์ ์ํ์ ๋ค
์๊ณผ ๊ฐ๋ค.
HRESULT Lock(DWORD dwWriteCursor, DWORD dwWriteBytes,
LPVOID lplpvAudioPtr1, LPDWORD lpdwAudioBytes1,
LPVOID lplpvAudioPtr2, LPDWORD lpdwAudioBytes2,
DWORD dwFlags);
dwWriteCursor ์ธ์๋ ๋ฒํผ์ ์ด๋์๋ถํฐ ๋ฝ์ ์์ํ ๊ฒ์ธ์ง๋ฅผ ์ง์ ํ
๋ค. ๋ง์ผ dwFlags ์ธ์์ DSBLOC K_FRO MWRITECURSOR๊ฐ ์ง์ ๋์ด
์๋ค๋ฉด ์ด ์ธ์๋ ๋ฌด์๋๋ค. dwWriteBytes ์ธ์๋ ๋ฒํผ์์ ์ด๋ ์ ๋์ ํฌ
๊ธฐ๋ฅผ ๋ฝํ๋ ค๊ณ ํ๋์ง ์ง์ ํ๋๋ฐ ์ฌ์ฉ๋๋ค. lplpvAudioPtr1 ์ธ์๋ ๋ฒํผ
์ ๋ค ์์ญ ์ค ๋ฝ ๋ ์์ญ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ป์ด์จ๋ค.
lpdwAudioBytes1๋ lplpvAud ioPtr1๊ฐ ๊ฐ๋ฆฌํค๋ ์์ญ์์ ๋ช ๋ฐ์ดํธ๊ฐ ๋ฝ
๋์๋์ง๋ฅผ ๋ํ๋ด๋ ์ธ์์ด๋ค. ๋ง์ผ ์ด ์ธ์์ ๊ฐ์ด dwWriteBytes ์ธ์
์ ๊ฐ๋ณด๋ค ์ ๋ค๋ฉด lplpvAudioPtr2 ์ธ์๊ฐ ์ฌ์ด๋ ๋ฐ์ดํฐ์ ๋ ๋ฒ์งธ ๋ธ๋ก
์ ๊ฐ๋ฆฌํฌ ๊ฒ์ด๋ค. lplpvAudioPtr2๋ ๋ ๋ฒ์งธ ๋ธ๋ก์ ๋ฝ๋ ์ฃผ์๋ฅผ ๋ฐ์์จ
๋ค. ๋ง์ผ ์ฒซ ๋ฒ์งธ ๋ธ๋ก์ผ๋ก ํ์ํ ์์ญ์ ๋ชจ๋ ๋ฝํ ๊ฒฝ์ฐ์๋ ์ด ์ธ์์
๊ฐ์ด NULL์ด ๋๋ค. lpdwAudioBytes2๋ lplpvAudioPtr2๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์์
์ ๋ช ๋ฐ์ดํธ๊ฐ ๋ฝ๋์๋์ง๋ฅผ ๊ฐ๋ฆฌํจ๋ค. lplpvAudioPtr2๊ฐ NULL์ด๋ฉด ์ด ์ธ
์์ ๊ฐ์ 0์ด ๋๋ค.
dwFlags ์ธ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ด ๊ฐ๋ฅํ๋ค.
โ DSBLOCK_FROMWRITECURSOR : ํ์ฌ์ ์ฐ๊ธฐ ์์น๋ถํฐ ๋ฝ์ ๊ฑด๋ค. ์ด
์ธ์๋ฅผ ์ฃผ๋ฉด GetCurrentPosition ํจ์๋ฅผ ํธ์ถํ ํ์๊ฐ ์์ผ๋ฉฐ
dwWriteCursor
์ธ์๊ฐ ๋ฌด์๋๋ค.
โ DSBLOCK_ENTIREBUFFER : ์ ์ฒด ๋ฒํผ๋ฅผ ๋ฝํ๋ค. dwWriteBytes ์ธ์๋
๋ฌด์๋๋ค. ์ด๋ ๊ฒ ๋ฝํ ๋ฒํผ์ ๋ํ ํฌ์ธํฐ๋ ๋ฐ๋์ ๋ค์ด๋ ํธ ์ฌ์ด๋ ๋ฒ
ํผ์ Unlock ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ฐํํด์ผ ํ๋ค. ๋ฝ๋์ด์๋ ์๊ฐ์ ๋๋๋ก ์ต
์ํํด์ผ ํ๋ค.
Unlock ํจ์
์ด ํจ์๋ ๋ฝ๋ ์ฌ์ด๋ ๋ฒํผ๋ฅผ ํ์ด์ฃผ๋ ์ญํ ์ ํ๋ค. ์ด ํจ์์ ์ํ์
๋ค์๊ณผ ๊ฐ๋ค.
HRESULT Unlock(LPVOID lpvAudioPtr1, DWORD dwAudioBytes1,
LPVOID lpvAudioPtr2, DWORD dwAudioBytes2);
์ด ํจ์์ ์ธ์๋ค์ ๊ฐ์ ์์ Lockํจ์์ ์ธ ๋ฒ์งธ ์ธ์๋ถํฐ ์ฌ์ฏ ๋ฒ์งธ
์ธ์๊น์ง์ ๊ฐ๊ณผ ๋์ผํ๋ค. ๊ฐ๋จํ๊ฒ๋๋ง ๋ค์ด๋ ํธX์ ๊ทนํ ์ผ๋ถ์ ํด๋นํ
๋ ๋ค์ด๋ ํธ ์ฌ์ด๋์ ๋๋ก์ฐ์ ๋ํด ์์๋ณด์๋ค. ์์ ํ๋ก๊ทธ๋จ ์ค์ฌ์ผ
๋ก ์ดํด๋ณด์๊ธฐ ๋๋ฌธ์ ์ดํด์ ํฐ ๋ฌด๋ฆฌ๋ ์์์ผ๋ฆฌ๋ผ ์๊ฐ๋๋ค. ๋ฌผ๋ก API
์ ๋ํ ํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ์ด ์๊ฑฐ๋ ์ต์ํ์ง ๋ชปํ ๋ ์๋ค์ ์ด๋ ค์ด ์ ์ด
๋ง์์ผ๋ฆฌ๋ผ ์๊ฐ๋๋ค. ํ ์ ์ ๋ฐฐ๋ถ๋ฅผ ์๋ ์๋ ์ผ์ด๋ค. API๋ฅผ ์ด์ฉํ
ํ๋ก๊ทธ๋๋ฐ์ ์๋ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ์ด๋ค. API ํ๋ก๊ทธ๋๋ฐ๋ถํฐ ๊ณต๋ถํ ์ฌ
๋์ ์ด๋ค ํ์ ์ ์๋ ํ๋ก๊ทธ๋๋ฐ์ด๋ ์ง ๊ฐ์ ๋ผ์ ๊น์ด๊น์ง ์ดํดํ ์
์๋ค. ์ด์ ์ฒ๊ณ ๋ง๋น์ ๊ณ์ ๊ฐ์์ด๋ค. ์ ์ ํ ๋ ์จ์ ๊ณต๋ถ ์ด์ฌํ ํ๊ธฐ
๋ฐ๋ผ๋ฉฐ ํ์์ ๊ธ์ด ์ฌ๋ฌ๋ถ์ ๋ค์ด๋ ํธX์ ๋ํ ๊ถ๊ธ์ฆ ์ค ์ผ๋ถ๋ฅผ ํ์ด์ฃผ
์๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ค. ๋ค์ด๋ ํธ ๋๋ก์ฐ์ ์ฌ์ด๋๋ฅผ ์ด์ฉํ ๊ฒ์ ์ ์์ ๋ค์
๊ธฐํ์ ์ค๋ช ํ๋๋ก ํ๊ฒ ๋ค. ๊ทธ ๋๊น์ง ๋ ์ ์ฌ๋ฌ๋ถ๋ค๋ ์ด์ฌํ ๊ณต๋ถํ๊ธฐ
๋ฐ๋๋ค.
๋ค์ด๋ ํธ ๋ฎค์ง์ ๋ฑ์ฅ
ํ์๊ฐ ์๊ณ ๋ฅผ ๊ฑฐ์ ๋ค ๋ง๋ฌด๋ฆฌํด๊ฐ ์ฆ์ํด์ ๋ง์ดํฌ๋ก์ํํธ์ ๋ค์ด๋ ํธX
์ฌ์ดํธ์ ๋ค์ด๊ฐ๋ค๊ฐ ๋ค์ด๋ ํธX์ ์๋ก์ด ์ปดํฌ๋ํธ์ธ ๋ค์ด๋
ํธ ๋ฎค์ง(DirectMusic)์ด ์ถ๊ฐ๋์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
ํ์ฌ๊น์ง ๋ค์ด๋ ํธX๋ ์ฃผ๋ก ๊ทธ๋ํฝ์ด๋ ์ ๋๋ฉ์ด์ ๊ณผ ์ฌ์ด๋ ๊ธฐ๋ฅ์ ํฅ์
์ ์ค์ ์ ๋์ด์จ ๊ฒ์ด ์ฌ์ค์ด๋ค. ์ฌ์ด๋์ ๊ฒฝ์ฐ 3D ์ฌ์ด๋๊น์ง ์ง์๋๊ธฐ
๋ ํ์ง๋ง ๊ธฐ๋ฅ ์์ฒด๊ฐ ๋ฉํฐ๋ฏธ๋์ด ํ๋ก๊ทธ๋จ์ ์ถฉ๋ถํ๋ค๊ณ ๋ณผ ์๋ ์์
๋ค.
์ด ์ปดํฌ๋ํธ๋ MIDI์ ๊ธฐ๋ฐํ์ฌ ๋์ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ๋ค์ด๋ ํธ ์ฌ์ด๋์
๋ ๋ค๋ฅธ ์ฐจ์์ ์๋น์ค๋ฅผ ์ ๊ณตํด์ค๋ค. MIDI ํ๋กํ ์ฝ์ด ์ฒ์ ๋ฑ์ฅํ ๊ฒ
์ ๋ฐ๋ก 1982๋ ์ด์๋ค. ์ด๊ฒ์ ๋ฑ์ฅ์ผ๋ก ์ธํด ์ ์ ์ ๊ธฐ์ ์ปดํจํฐ๊ฐ์ ์ฐ๊ฒฐ
์ด ๊ฐ๋ฅํด์ก๊ณ ์ด๊ฒ์ผ๋ก ์ธํด ์ง์์๋ ์์ ์ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํด์ก๋ค.
์ด๋ฌํ MIDI์ ๊ธฐ๋ฐ ์์ ๋ง๋ค์ด์ง ๋ค์ด๋ ํธ ๋ฎค์ง์ ์ฐ์ ๊ณ์ ํ์ค์ด
๋ผ ํ ์ ์๋ DLS(Downloadable sound)๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ํ๋ค๋ ํน์ง
๋ ๊ฐ๊ณ ์๋ค. ๋ฐ๋ผ์ ์ฌ์ด๋์นด๋ ๋ฑ์ ์ค์ ์ฐ์ฃผ ์ฅ์น์ ๋ฐ๋ผ ์์ง์ด ๋ฌ๋ผ
์ง๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ค๋ง๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค. ๋ค์ด๋ ํธ ๋ฎค์ง์ ๊ดํ
์์ธํ ์ฌํญ์ http://www.microsoft.com/directx์์ ์ฐพ์๋ณผ ์ ์๋ค.
๋ธํ์ด์์ ๋ค์ด๋ ํธX ์ฌ์ฉํ๊ธฐ ํ์๊ฐ ์๋ก ๋ ์์ ํ๋ก๊ทธ๋จ๋ค์ ๋ชจ๋
API๋ฅผ ์ด์ฉํด ์์ฑ๋์ด์๋ค. ์ฌ์ค ๋ธํ์ด์์๋ ์๋ API๋ฅผ ์๋ฌด๋ฐ ๋ฌด๋ฆฌ ์
์ด ๋ค ํธ์ถํ ์ ์๊ธฐ ๋๋ฌธ์(VB๋ ํฌ์ธํฐ๋ผ๋ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋
API๋ฅผ ๋ค ๋ถ๋ฅผ ์๋ ์๋ค) ์์ ํ๋ก๊ทธ๋จ์ ์ฝ๋๋ฅผ ๋ธํ์ด์์ ์ฌ์ฉํ
์ ์๋ค. ๋ค๋ง ๋ชจ์์ด ๋ณ๋ก ๋ธํ์ด๋ต์ง๋ ๋ชปํ ๊ฒ์ด๋ค. ๋ค์ด๋ ํธX๋ฅผ ํ๋
์ ์ปจํธ๋กค์ฒ๋ผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ค๋ ์๋๊ฐ ์ฌ๋ฌ ๊ณณ์์ ์งํ๋
๊ณ ์๋ค. ๋ธํ์ด์์ ๋ค์ด๋ ํธX๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ๋ชจ๋์
์ ๊ณตํด์ฃผ๋ ์น์ฌ์ดํธ๋ ์๋๋ฐ ๊ด์ฌ ์๋ ๋ ์๋ผ๋ฉด ์ด ์ฌ์ดํธ
(http://www.delphi-jedi.org/DelphiGraphi cs/)๋ฅผ ๋ฐฉ๋ฌธํด๋ณด๊ธฐ ๋ฐ๋๋ค.
์ฐธ๊ณ ๋ฌธํ
1) http://www.microsoft.com/directx
2) ์๋ 95์ฉ Game SDK ์ ๋ต ๊ฐ์ด๋, ์ ๋ณด ๋ฌธํ์ฌ, ์ฐจ์ฃผํ, ๋ฐ์์ฑ ์ญ
3) http://www.aros.net/~npawn/tutorial.htm
4) http://www.ziron.com/links/directx/
5) http://www.aha.ru/~pervago/
6) DirectX Foundation ๋์๋ง
- ๋ -
- the end of this article -
Sample 1 - D3D Cubic
์ด๋ฒ ์์ ๋ Direct3D Retained Mode (D3D RM)์ ์ฒซ ๋ฒ์งธ ์์ ๋ก์จ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ค์ ์ ๋ํด ์์๋ณผ ๊ฒ์ด๋ค. MFC์ ๋ทฐ-๋ํ๋จผํธ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ ๊ฒ์ธ๋ฐ, ์ฌ๊ธฐ์์ ์ฝ๋๋ ๋ชจ๋ ๋ทฐ ํด๋์ค์์๋ง ๊ธฐ์ ๋ ๊ฒ์ด๋ค. ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ DirectX SDK๋ฅผ ๋จผ์ ๋ฐ์์ ์ค์นํด์ผ ํ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์๋ 7.0 ๋ฒ์ ์ SDK๋ฅผ ์ฌ์ฉํ์ง๋ง ์ค์ ๋ก ๋ค์์ ์ฝ๋๋ ์๋ง direct x 3.0 ๋ฒ์ ์์๋ ์ปดํ์ผ๋ ๊ฒ์ด๋ค. ์์ ๋ฒ์ ์ ๊ธฐ๋ฅ์ ์ด์ฉํ๋ ์์ ๋ ๋์ค์ ๋ค์ ์ดํด๋ณผ ๊ฒ์ด๋ค.
์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๋จํ ์ค๋ช ํ์๋ฉด DirectX.bmp ๋ผ๋ ํ์ผ์ ์ฝ์ด๋ค์ฌ์ ์ก๋ฉด์ฒด์ ํ ์ค์ฒ๋ฅผ ์ ํ๋ ์์ ์ด๋ค.
์์ค๋ ์ฌ๊ธฐ์ ๋ฐ์ผ๋ฉด ๋์ง์. (๋นํธ๋งต ํ์ผ์ ๋ฆฌ์์ค์์ ๋ณต์ฌํด์ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค.)
1. SDI, ํ๋ก์ ํธ ์ด๋ฆ์ D3DCubic์ผ๋ก ์ ํ๋ค.
2. ๋ฉ๋ด์์ Project - Settings.. - Link์์ Object/library modules ์ ๋ค์์ ์จ๋ฃ๋๋ค.
d3drm.lib ddraw.lib
3. ํ ์ค์ฒ, ์ก๋ฉด์ฒด, ๋ ธ๋ฉ๋ฒกํฐ์ ๊ดํ ๋ฐ์ดํฐ๋ฅผ ๋ทฐ์ cppํ์ผ์ ์๋ถ๋ถ์ ์ถ๊ฐํ๋ค.
int faces[] = { 4, 0, 1, 1, 1, 2, 1, 3, 1, // ์์ชฝ
4, 4, 3, 5, 3, 6, 3, 7, 3, // ์๋์ชฝ
4, 8, 2, 9, 2, 10, 2, 11, 2, // ์ค๋ฅธ์ชฝ
4, 12, 0, 13, 0, 14, 0, 15, 0, // ์ผ์ชฝ
4, 16, 4, 17, 4, 18, 4, 19, 4, // ์์ชฝ
4, 20, 5, 21, 5, 22, 5, 23, 5, // ๋ค์ชฝ
0 };
D3DVECTOR cubicVertices[] = { 1.0f, 1.0f, -1.0f, // 0
-1.0f, 1.0f, -1.0f, // 1
-1.0f, 1.0f, 1.0f, // 2
1.0f, 1.0f, 1.0f, // 3
1.0f, -1.0f, -1.0f, // 4
1.0f, -1.0f, 1.0f, // 5
-1.0f, -1.0f, 1.0f, // 6
-1.0f, -1.0f, -1.0f, // 7
1.0f, 1.0f, -1.0f, // 8
1.0f, 1.0f, 1.0f, // 9
1.0f, -1.0f, 1.0f, // 10
1.0f, -1.0f, -1.0f, // 11
-1.0f, 1.0f, -1.0f, // 12
-1.0f, -1.0f, -1.0f, // 13
-1.0f, -1.0f, 1.0f, // 14
-1.0f, 1.0f, 1.0f, // 15
1.0f, 1.0f, -1.0f, // 16
1.0f, -1.0f, -1.0f, // 17
-1.0f, -1.0f, -1.0f, // 18
-1.0f, 1.0f, -1.0f, // 19
1.0f, 1.0f, 1.0f, // 20
-1.0f, 1.0f, 1.0f, // 21
-1.0f, -1.0f, 1.0f, // 22
1.0f, -1.0f, 1.0f, // 23
};
D3DVECTOR cubicNormals [] = { -1.0f, 0.0f, 0.0f, // 0 - ์ผ์ชฝ
0.0f, 1.0f, 0.0f, // 1 - ์์ชฝ
1.0f, 0.0f, 0.0f, // 2 - ์ค๋ฅธ์ชฝ
0.0f, -1.0f, 0.0f, // 3 - ์๋์ชฝ
0.0f, 0.0f, -1.0f, // 4 - ์์ชฝ(-z๋ฐฉํฅ)
0.0f, 0.0f, 1.0f // 5 - ๋ค์ชฝ(+z๋ฐฉํฅ)
};
4. ๋ทฐ์ ํค๋ํ์ผ์ ๋ค์ ๋ฉค๋ฒ๋ณ์๋ฅผ ์ถ๊ฐํ๋ค.
// Attributes
public:
LPDIRECT3DRM pD3DRM; // Direct3D retained mode Object
LPDIRECT3DRMFRAME pD3DSceneFrame; // Direct3D Scene Frame
LPDIRECT3DRMFRAME pD3DCameraFrame; // Direct3D Camera Frame
LPDIRECTDRAWCLIPPER pDDClipper; // DirectDraw Clipper
LPDIRECT3DRMDEVICE pD3DRMDevice; // Direct3D Device
LPDIRECT3DRMVIEWPORT pD3DViewport; // Direct3D Viewport
5. ๋ทฐ์ ์์ฑ์์์ ๋ฉค๋ฒ๋ณ์๋ค์ ๋ํ ์ด๊ธฐํ๋ฅผ ํ๋ค.
CD3DCubicView::CD3DCubicView()
{
// TODO: add construction code here
pD3DRM = NULL;
pD3DSceneFrame = NULL;
pD3DCameraFrame = NULL;
pDDClipper = NULL;
pD3DRMDevice = NULL;
pD3DViewport = NULL;
}
6. D3D RM์ ์ค์ ์ ํ๋ ๋ค์ ํจ์๋ฅผ ์ถ๊ฐํ๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ ์ ์๊ฒ ์ง๋ง ์ด ํจ์์์ D3D RM์ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๊ณ , Scene ํ๋ ์, Camera ํ๋ ์, ํด๋ฆฌํผ, ๋๋ฐ์ด์ค, ๋ทฐํฌํธ, ๋ ๋๋ง ๋ฑ์ ์ค์ ์ ํ๋ค.
BOOL CD3DCubicView::SetupD3DRM()
{
// Direct3D RM ์ธํฐํ์ด์ค ์์ฑ
if(Direct3DRMCreate(&pD3DRM) != D3DRM_OK) {
::AfxMessageBox("Direct3D Retained Mode Interface Creation failure!");
return FALSE;
}
// Scene Frame ์์ฑ
if(pD3DRM->CreateFrame(NULL, &pD3DSceneFrame) != D3DRM_OK) {
::AfxMessageBox("Scene Frame Creation Failure!");
return FALSE;
}
// Camera Frame ์์ฑ
if(pD3DRM->CreateFrame(pD3DSceneFrame, &pD3DCameraFrame) != D3DRM_OK) {
::AfxMessageBox("Camera Frame Creation Failure!");
return FALSE;
}
// ํด๋ฆฌํผ๋ฅผ ์์ฑํ๊ณ ์๋์ฐ์ ๊ฒฐํฉํ๋ค.
if(DirectDrawCreateClipper(0, &pDDClipper, NULL) != DD_OK) {
::AfxMessageBox("Could not create clipper!");
return FALSE;
}
if(pDDClipper->SetHWnd(0, m_hWnd) != DD_OK) {
::AfxMessageBox("Could not associate clipper with window!");
return FALSE;
}
// Device ์์ฑ
if(!CreateDevice()) {
::AfxMessageBox("Device Creation Failure!");
return FALSE;
}
// Viewport ์์ฑ
if(!CreateViewport()) {
::AfxMessageBox("Viewport Creation Failure!");
return FALSE;
}
// ๊ด์ ์์ฑ
if(!SetRenderingLights()) {
::AfxMessageBox("Lights Creation Failure!");
return FALSE;
}
// Scene Rendering
if(!RenderingScene()) {
::AfxMessageBox("Scene Creation Failure!");
return FALSE;
}
return TRUE;
}
7. OnInitialUpdate() ํจ์์์ ๋ค์๊ณผ ๊ฐ์ด SetupD3DRM() ํจ์๋ฅผ ํธ์ถํ๋ค.
void CD3DCubicView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
if(!SetupD3DRM())
PostQuitMessage(0);
}
8. ๋๋ฐ์ด์ค๋ฅผ ์ค์ ํ๋ CreateDevice() ํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
BOOL CD3DCubicView::CreateDevice()
{
RECT rect;
// ํ์ฌ์ ์๋์ฐ ์์ญ์ ์ ํ๋ค.
GetClientRect(&rect);
if(!rect.right || !rect.bottom)
return FALSE;
// ๋๋ฐ์ด์ค ์์ฑ
if(pD3DRM->CreateDeviceFromClipper(pDDClipper, NULL,
rect.right, rect.bottom, &pD3DRMDevice) != D3DRM_OK) {
return FALSE;
}
return TRUE;
}
9. ๋ทฐํฌํธ๋ฅผ ์ค์ ํ๋ CreateViewport() ํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
BOOL CD3DCubicView::CreateViewport()
{
// Viewport ์์ฑ
if(pD3DRM->CreateViewport(pD3DRMDevice, pD3DCameraFrame,
0, 0, pD3DRMDevice->GetWidth(), pD3DRMDevice->GetHeight(),
&pD3DViewport) != D3DRM_OK)
return FALSE;
return TRUE;
}
10. ๊ด์์ ์ค์ ํ๊ณ , ๋ฐฐ๊ฒฝ์๋ ์ ํ๊ณ , Quality ๋ ์ ํ๋ ํจ์ - SetRenderingLights()
BOOL CD3DCubicView::SetRenderingLights()
{
LPDIRECT3DRMLIGHT pAmbient = NULL;
LPDIRECT3DRMLIGHT pPoint = NULL;
// point ๊ด์ ์์ฑ
if(FAILED(pD3DRM->CreateLightRGB(D3DRMLIGHT_POINT,
0.4f, 0.4f, 0.4f, &pPoint)))
return FALSE;
if(FAILED(pD3DSceneFrame->AddLight(pPoint)))
return FALSE;
// ambient ๊ด์ ์์ฑ
if(FAILED(pD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT,
0.8f, 0.8f, 0.8f, &pAmbient)))
return FALSE;
if(FAILED(pD3DSceneFrame->AddLight(pAmbient)))
return FALSE;
// Scene ๋ฐฐ๊ฒฝ์์ ํ์์ผ๋ก ์ค์
pD3DSceneFrame->SetSceneBackground(D3DRGB(0.5, 0.5, 0.5));
// Quality ์ค์
pD3DRMDevice->SetQuality(D3DRMRENDER_GOURAUD);
return TRUE;
}
11. ๋นํธ๋งต์ ๋ถ๋ฌ์์ ๋ ๋๋ง์ ํ๋ ํจ์.
BOOL CD3DCubicView::RenderingScene()
{
// Mesh builder interface
LPDIRECT3DRMMESHBUILDER pMeshBuilder = NULL;
LPDIRECT3DRMFRAME pCubicFrame = NULL; // Cubic์ ํฌํจํ ํ๋ ์
LPDIRECT3DRMTEXTURE pTexture = NULL;
// Mesh builder ์์ฑ
if(FAILED(pD3DRM->CreateMeshBuilder(&pMeshBuilder)))
return FALSE;
// Texture Load
if(FAILED(pD3DRM->LoadTexture("directx.bmp", &pTexture)))
return FALSE;
// ์ ์ ๋ฐฐ์ด๋ก๋ถํฐ ํ์ด์ค๋ฅผ ๋ก๋ํ๋ค.
pMeshBuilder->AddFaces(24, cubicVertices, 24,
cubicNormals, (unsigned long *)faces, NULL);
pMeshBuilder->SetColor(D3DRGB(1, 1, 1));
pMeshBuilder->SetTexture(pTexture);
// Texture Mapping
for(int i=0; i<24; i+=4) {
pMeshBuilder->SetTextureCoordinates(i, 0.0f, 0.0f);
pMeshBuilder->SetTextureCoordinates(i+1, 1.0f, 0.0f);
pMeshBuilder->SetTextureCoordinates(i+2, 1.0f, 1.0f);
pMeshBuilder->SetTextureCoordinates(i+3, 0.0f, 1.0f);
}
// Frame ์์ฑ
if(FAILED(pD3DRM->CreateFrame(pD3DSceneFrame, &pCubicFrame)))
return FALSE;
// Frame์ Mesh Builder ์ถ๊ฐ
if(FAILED(pCubicFrame->AddVisual(pMeshBuilder)))
return FALSE;
// Camera Frame ์์น ์ค์
if(FAILED(pD3DCameraFrame->SetPosition(pD3DSceneFrame, 0.0f,
0.0f, -7.0f)))
return FALSE;
// interface Release
pCubicFrame->Release();
pMeshBuilder->Release();
pTexture->Release();
return TRUE;
}
12. OnDraw() ํจ์ ๋์ ์ OnPaint() ํจ์๋ฅผ ํธ์ถํ๋ค.
void CD3DCubicView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
if(!pD3DRMDevice || IsIconic())
return;
pD3DViewport->Clear(); // Viewport Clear
pD3DViewport->Render(pD3DSceneFrame); // Scene Rendering
pD3DRMDevice->Update(); // Device Update
// Do not call CView::OnPaint() for painting messages
}
13. ์๋์ฐ์ ํฌ๊ธฐ๊ฐ ๋ฐ๋์ ๋ฐ๋ผ ๋๋ฐ์ด์ค์ ๋ทฐํฌํธ๋ฅผ ๋ค์ ์ค์ ํ๋ค.
void CD3DCubicView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(!pD3DViewport) return;
if(!pD3DRMDevice) return;
int width = cx;
int height = cy;
if(!width || !height || IsIconic()) return;
// Device์ Viewport์ ํ์ฌ ํญ๊ณผ ๋์ด๋ฅผ ์ป๋๋ค.
int vWidth = pD3DViewport->GetWidth();
int vHeight = pD3DViewport->GetHeight();
int dWidth = pD3DRMDevice->GetWidth();
int dHeight = pD3DRMDevice->GetHeight();
// window ํฌ๊ธฐ์ ๋ณํจ์ด ์์ผ๋ฉด ๋ฆฌํดํ๋ค.
if(vWidth == width && vHeight == height) return;
// ์๋๋ฉด Device์ Viewport๋ฅผ ๋ค์ ์์ฑํ๋ค.
pD3DViewport->Release();
pD3DRMDevice->Release();
if(!CreateDevice()) {
::AfxMessageBox("Device Creation Failure!");
PostQuitMessage(0);
}
if(!CreateViewport()) {
::AfxMessageBox("Viewport Creation Failure!");
PostQuitMessage(0);
}
}
14. ํค๋ณด๋์ ํ์ดํ ํค์ ๋ฐ๋ผ ์ก๋ฉด์ฒด๊ฐ ์์ง์ด๋๋ก ํ๋ค.
void CD3DCubicView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
LPDIRECT3DRMFRAMEARRAY pFrameArray; // Frame Array
LPDIRECT3DRMFRAME pChildFrame; // ์ป๊ณ ์ํ๋ Frame
// Frame Array๋ฅผ ์ป๋๋ค.
pD3DSceneFrame->GetChildren(&pFrameArray);
// ์ฐ๋ฆฌ๊ฐ ์ํ๋ Frame์ ์ป๋๋ค.
pFrameArray->GetElement(1, &pChildFrame);
// Frame์ rotateํ๋ค.
if(nChar == VK_UP)
pChildFrame->AddRotation(D3DRMCOMBINE_AFTER,
1.0f, 0.0f, 0.0f, 0.1f);
if(nChar == VK_DOWN)
pChildFrame->AddRotation(D3DRMCOMBINE_AFTER,
1.0f, 0.0f, 0.0f, -0.1f);
if(nChar == VK_LEFT)
pChildFrame->AddRotation(D3DRMCOMBINE_AFTER,
0.0f, 1.0f, 0.0f, 0.1f);
if(nChar == VK_RIGHT)
pChildFrame->AddRotation(D3DRMCOMBINE_AFTER,
0.0f, 1.0f, 0.0f, -0.1f);
pFrameArray->Release();
pChildFrame->Release();
InvalidateRect(NULL, FALSE); // ์๋์ฐ๋ฅผ ๋ค์ ๊ทธ๋ฆฐ๋ค.
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
- the end of this article -
Sample 2 - X Loader
์ด๋ฒ ์์ ๋ ์ญ์ Direct3D Retained Mode(D3D RM)๋ฅผ ์ด์ฉํ๋ ๊ฒ์ธ๋ฐ, ์์ Sample 1 ๊ณผ๋ ๋ฌ๋ฆฌ DirectX 6.0 ์ด์ ๋ฒ์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋น์ฐํ 6.0 ์ด์์ DirectX ๋ฐํ์์ด ์ค์น๋์ด ์์ด์ผ ํ ๊ฒ์ด๋ค. ์ค์ ๋ก D3D RM์์ ์ฌ์ฉ๋๋ API๋ค์ 6.0 ๋ฒ์ ์์ ๊ฐ๋ฐ์ด ์ค๋จ๋์๊ณ , Immidiate Mode(IM)์์ ์ฌ์ฉ๋๋ API ๊ฐ๋ฐ์ ๋ ธ๋ ฅ์ด ์ง์ค๋์๋ค. ๊ทธ๋ฌ๋ฏ๋ก RM์ ์ฌ์ฉํ๋ค๋ฉด 6.0 ๋ฒ์ ์ด์์ ์ด๋ค๊ณ ํด๋ ๋ ๋์ ์ ์ ์๋ค.
๋ง๋ค ํ๋ก๊ทธ๋จ์ ๋ํด ๊ฐ๋ตํ ์๊ฐ๋ฅผ ํ์๋ฉด, ์ด๋ฒ ์์ ๋ Direct3D์์ ์ง์ํ๋ ํ์ผ ํฌ๋งท์ธ X ํ์ผ์ ์ฝ์ด๋ค์ด๋ ํ๋ก๊ทธ๋จ์ด๊ณ , Xํ์ผ์ ์ธํฐ๋ท ์์์ ๊ตฌํ 3DS ํ์ผ์ SDK์ conv3ds.exe๋ฅผ ์ด์ฉํด Xํ์ผ๋ก ๋ฐ๊พผ ๊ฒ์ด๋ค.
์ฐธ๊ณ ๋ก 3DS ์ ๊ฐ์ 3D ๋ชจ๋ธ๋ง ํ์ผ์ด ๋ง์ด ์๋ ์ฌ์ดํธ๋ฅผ ์๊ฐํ์๋ฉด http://www.3dcafe.com ์ด ๋ฌด๋ํ๊ฒ ๋ค. ๋ฌผ๋ก ๊ฒ์์์ง์ผ๋ก ์ง์ ์ฐพ์๋ณด๋ฉด ๋ค๋ฅธ ์ข์ ์ฌ์ดํธ๋ค๋ ๋ง์ ๊ฒ์ด๋ค.
์ด ์์ ์์ ์ฌ์ฉํ, conv3ds.exe ํ์ผ์ ์ฌ์ฉ๋ฒ๊ณผ ์ต์ ์ ๋ํด ๊ฐ๋จํ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
sample.3ds ํ์ผ์ sample.x ํ์ผ๋ก ๋ฐ๊พธ๋ ค๊ณ ํ ๋
conv3ds -m sample.3ds
๋ฌผ๋ก -m ์ต์ ์ธ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ต์ ์ด ์์ง๋ง ์ฌ๊ธฐ์ ์ฌ์ฉํ ๊ฒ์ ๊ณ์ธต๊ตฌ์กฐ๊ฐ ์๋ single mesh ํ์์ด๋ฏ๋ก -m ์ต์ ์ ์ฌ์ฉํ์๋ค. ํ์ฅ์๊ฐ .X ์ด๋๋ผ๋ ๊ณ์ธต๊ตฌ์กฐ๋ ํคํ๋ ์์ ์ ๋ฌด ๋ฑ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ํ์์ด ์๊ณ , ์ด์ ๋ฐ๋ผ Xํ์ผ์ ๋ถ๋ฌ๋ค์ผ ๋ ์ฌ์ฉ๋๋ ํจ์๊ฐ ๋ฌ๋ผ์ง๋ค. -m ์ต์ ์ ์ฌ์ฉํ์ ๋๋ meshbuilder ์ Load ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ง๊ธ๊น์ง ๊ธ์ด ์ดํด๊ฐ ์๋๋๋ผ๋ ์ ํ ์๊ดํ ํ์์๋ค. ํ์ฃผ์ธ์ ๊ทธ๋ฐ๊ฑฐ ์ ๊ฒฝ์ฐ์ง๋ ์๊ณ , ๋ค์ ์์ ๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ผํด ๋ณด๋ฉด ๊ฒฐ๊ณผ๋ ๋๊ฐ์ด ๋์ฌํ ๋๊น ๋ง์ด๋ค..
์ด์ ์ค์ ์ฝ๋ฉ์ ํด ๋ณด์... ์์ ํ๋ก์ ํธ๋ ์ฌ๊ธฐ์์ ๋ค์ด๋ก๋.
1. ์ฐ์ Xํ์์ ํ์ผ์ ํ๋ ์ฅ๋งํด์ ํ๋ก์ ํธ ํด๋์ ๋ณต์ฌํด ๋ฃ๋๋ค. ์ด ์์ ์์ ์ฌ์ฉํ X ํ์ผ์ ์ด๋ฆ์ 55porsmx.x ์ด๋ค. 3์ฐจ์ ๋ชจ๋ธ๋ง ํ์ผ์ ๋ค๋ฅธ๊ฑธ ๊ตฌํด์ Xํ์์ผ๋ก ๋ณํํด์ ์ฐ๊ฑฐ๋ ์ง์ ๋ง๋ค์ด์ ๋ณํํด ์จ๋ ๋ฌด๋ํ๊ฒ ๋ค.
2. AppWizard์์ SDI ๋ก ํ๋ก์ ํธ๋ฅผ ํ๋ ๋ง๋ ๋ค. ์ฌ๊ธฐ์ ํ๋ก์ ํธ ์ด๋ฆ์ XLoader๋ผ๊ณ ์ ํ๋ค. ์ต์ ์ ๋ชจ๋ ๋ํดํธ๋ก ์ฌ์ฉํด๋ ๊ด๊ณ์๋ค.
3. DirectX ํ์ผ์ ๋งํฌ์ํค๊ธฐ ์ํด ๋ฉ๋ด์ Project - Settings.. - Link์์ Object/library modules ์ ๋ค์์ ์จ๋ฃ๋๋ค.
ddraw.lib d3drm.lib d3dxof.lib dxguid.lib
4. ๋ทฐ์ ํค๋ํ์ผ ์๋ถ๋ถ์ ๋ค์์ ์ถ๊ฐํ๋ค.
#define INITGUID
#include "d3drmwin.h"
5. ๋ทฐ์ ํค๋ํ์ผ์ ๋ค์ ๋ฉค๋ฒ๋ณ์๋ฅผ ์ถ๊ฐํ๋ค.
LPDIRECT3DRM3 pD3DRM; // Direct3D retained mode Object
LPDIRECTDRAWCLIPPER pDDClipper; // DirectDraw Clipper Object
LPDIRECT3DRMDEVICE3 pD3DRMDevice; // Direct3D Device
LPDIRECT3DRMVIEWPORT2 pD3DViewport; // Direct3D Viewport
LPDIRECT3DRMFRAME3 pD3DSceneFrame; // Direct3D Scene Frame
LPDIRECT3DRMFRAME3 pD3DCameraFrame; // Direct3D Camera Frame
6. ๋ทฐ์ ์์ฑ์์์ ๋ฉค๋ฒ๋ณ์๋ค์ ๋ํ ์ด๊ธฐํ๋ฅผ ํ๋ค.
CXLoaderView::CXLoaderView()
{
// TODO: add construction code here
pD3DRM = NULL;
pDDClipper = NULL;
pD3DRMDevice = NULL;
pD3DViewport = NULL;
pD3DSceneFrame = NULL;
pD3DCameraFrame = NULL;
}
7. ๋ทฐ์ cpp ํ์ผ์ ์๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ ๋งคํฌ๋ก ํจ์๋ฅผ ํ์ค ๋ฃ๋๋ค.
#define SAFE_RELEASE(x) if (x != NULL) {x->Release(); x = NULL;}
8. ๋ทฐ์ ์๋ฉธ์์์, ํค๋ํ์ผ์ ์ ์ํ ๋ณ์๋ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํด์ ํ๋ค.
CXLoaderView::~CXLoaderView()
{
SAFE_RELEASE(pD3DRM);
SAFE_RELEASE(pDDClipper);
SAFE_RELEASE(pD3DRMDevice);
SAFE_RELEASE(pD3DViewport);
SAFE_RELEASE(pD3DSceneFrame);
SAFE_RELEASE(pD3DCameraFrame);
}
9. OnInitialUpdate() ํจ์๋ฅผ ๋ค์์ฒ๋ผ ์ค๋ฒ๋ผ์ด๋ํ๋ค.
void CXLoaderView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
if(!SetupD3DRM())
PostQuitMessage(0); }
10. D3D RM์ ์ค์ ์ ํ๋ ๋ค์ ํจ์๋ฅผ ์ถ๊ฐํ๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ ์ ์๊ฒ ์ง๋ง ์ด ํจ์์์ D3D RM์ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๊ณ , Scene ํ๋ ์, Camera ํ๋ ์, ํด๋ฆฌํผ, ๋๋ฐ์ด์ค, ๋ทฐํฌํธ, ๋ ๋๋ง ๋ฑ์ ์ค์ ์ ํ๋ค.
// D3DRM ์ด๊ธฐํํ๋ ํจ์
BOOL CXLoaderView::SetupD3DRM()
{
LPDIRECT3DRM pD3DRM1;
// D3DRM์ ๊ฐ์ฒด ์์ฑ
if(FAILED(Direct3DRMCreate(&pD3DRM1))) {
::AfxMessageBox("Failed to create Direct3DRM.");
return FALSE;
}
// ์๋ฒ์ ์ D3DRM์ ๊ฐ์ฒด ์์ฑ
if(FAILED(pD3DRM1->QueryInterface(IID_IDirect3DRM3, (void **)&pD3DRM))) {
::AfxMessageBox("Failed to QI for Direct3DRM3.");
return FALSE;
}
// clipper๋ฅผ ์์ฑํ๊ณ ์๋์ฐ์ ๊ฒฐํฉ
if(FAILED(DirectDrawCreateClipper(0, &pDDClipper, NULL))) {
::AfxMessageBox("Failed to create DirectDrawClipper.");
return FALSE;
}
if(FAILED(pDDClipper->SetHWnd(0, m_hWnd))) {
::AfxMessageBox("Failed to set hwnd on the clipper.");
return FALSE;
}
// scene frame ์์ฑ
if(FAILED(pD3DRM->CreateFrame(NULL, &pD3DSceneFrame))) {
::AfxMessageBox("Failed to create the master scene frame.");
return FALSE;
}
// camera frame ์์ฑ
if(FAILED(pD3DRM->CreateFrame(pD3DSceneFrame, &pD3DCameraFrame))) {
::AfxMessageBox("Failed to create the camera's frame.");
return FALSE;
}
// camera ์์น ์ง์
if(FAILED(pD3DCameraFrame->SetPosition(pD3DSceneFrame, 0.0f, 0.0f, 0.0f))) {
::AfxMessageBox("Failed to position the camera in the frame.");
return FALSE;
}
// Device ์์ฑ
if(!CreateDevice()) {
::AfxMessageBox("Device Creation Failure.");
return FALSE;
}
// Viewport ์์ฑ
if(!CreateViewport()) {
::AfxMessageBox("Viewport Creation Failure.");
return FALSE;
}
// ๊ด์ ์์ฑ
if(!SetRenderingLights()) {
::AfxMessageBox("Lights Creation Failure.");
return FALSE;
}
// ๋ ๋๋ง ์ํ ์ค์
if(!SetRenderingState()) {
::AfxMessageBox("Lendering State Failure.");
return FALSE;
}
// Scene ๋ ๋๋ง
if(!RenderingScene()) {
::AfxMessageBox("Scene Rendering Failure.");
return FALSE;
}
return TRUE;
}
11. ๋๋ฐ์ด์ค๋ฅผ ์์ฑํ๋ CreateDevice ํจ์๋ฅผ ์์ฑํ๋ค.
// Device๋ฅผ ์์ฑํ๋ ํจ์
BOOL CXLoaderView::CreateDevice()
{
RECT rect;
// ํ์ฌ์ ์๋์ฐ ์์ญ์ ์ ํ๋ค.
GetClientRect(&rect);
if(!rect.right || !rect.bottom)
return FALSE;
// ๋๋ฐ์ด์ค ์์ฑ
if(FAILED(pD3DRM->CreateDeviceFromClipper(pDDClipper, NULL,
rect.right, rect.bottom, &pD3DRMDevice)))
return FALSE;
return TRUE;
}
12. ๋ทฐํฌํธ์ Z๋ฒํผ์ ๊น์ด๋ฅผ ์ ํ๋ ํจ์ CreateViewport()๋ฅผ ์์ฑํ๋ค.
// viewport๋ฅผ ์์ฑํ๋ ํจ์
BOOL CXLoaderView::CreateViewport()
{
// Viewport ์์ฑ
if(FAILED(pD3DRM->CreateViewport(pD3DRMDevice, pD3DCameraFrame,
0, 0, pD3DRMDevice->GetWidth(), pD3DRMDevice->GetHeight(),
&pD3DViewport)))
return FALSE;
// z๋ฒํผ์ ๊น์ด์ง์
pD3DViewport->SetBack(5000.0f);
return TRUE;
}
13. ๊ด์์ ์ค์ ํ๋ ํจ์ SetRenderingLights() ํจ์๋ฅผ ์์ฑํ๋ค.
// ๊ด์(Lights)์ ์ค์ ํ๋ ํจ์
// CreateLightRGB์ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ฌ์ฉ๊ฐ๋ฅํ ๊ฐ๋ค :
// D3DRMLIGHT_AMBIENT, D3DRMLIGHT_POINT, D3DRMLIGHT_SPOT,
// D3DRMLIGHT_DIRECTIONAL, D3DRMLIGHT_PARALLELPOINT
BOOL CXLoaderView::SetRenderingLights()
{
LPDIRECT3DRMLIGHT pAmbient = NULL;
LPDIRECT3DRMLIGHT pPoint = NULL;
// point ๊ด์ ์์ฑ
if(FAILED(pD3DRM->CreateLightRGB(D3DRMLIGHT_POINT,
0.4f, 0.4f, 0.4f, &pPoint)))
return FALSE;
if(FAILED(pD3DSceneFrame->AddLight(pPoint)))
return FALSE;
// ambient ๊ด์ ์์ฑ
if(FAILED(pD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT,
0.8f, 0.8f, 0.8f, &pAmbient)))
return FALSE;
if(FAILED(pD3DSceneFrame->AddLight(pAmbient)))
return FALSE;
return TRUE;
}
14. ๋ฐฐ๊ฒฝ์์ด๋ ๋๋๋ง, Quality ๋ฑ์ ๊ฒฐ์ ํ๋ SetRenderingState() ํจ์๋ฅผ ์์ฑํ๋ค.
// ๋ ๋๋ง ์ํ๋ฅผ ์ค์ ํ๋ ํจ์
// SetQuality์ ์ธ์๋ก ๊ฐ๋ฅํ ๊ฐ๋ค :
// D3DRMRENDER_WIREFRAME, D3DRMRENDER_UNLITFLAT, D3DRMRENDER_FLAT
// D3DRMRENDER_GOURAUD, D3DRMRENDER_PHONG
// ํ์ํ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ texture๋ shade์ ๋ํ ์ค์ ์ ํ ๊ฒ
BOOL CXLoaderView::SetRenderingState()
{
// Scene ๋ฐฐ๊ฒฝ์์ ๊ฒ์์์ผ๋ก ์ค์
if(FAILED(pD3DSceneFrame->SetSceneBackground(D3DRGB(0.5, 0.5, 0.5))))
return FALSE;
// ๋ ๋๋ง Quality ์ค์
if(FAILED(pD3DRMDevice->SetQuality(D3DRMRENDER_FLAT)))
return FALSE;
// Dithering ์ฌ๋ถ ์ค์
if(FAILED(pD3DRMDevice->SetDither(FALSE)))
return FALSE;
return TRUE;
}
15. ์ธ๋ถํ์ผ์ ๋ถ๋ฌ๋ค์ฌ ๋ ๋๋งํ๋ ํจ์ RenderingScene() ํจ์๋ฅผ ์์ฑํ๋ค.
// Scene์ ๋ ๋๋งํ๋ ๋ถ๋ถ
BOOL CXLoaderView::RenderingScene()
{
LPDIRECT3DRMMESHBUILDER3 pMeshBuilder = NULL;
LPDIRECT3DRMFRAME3 pMeshFrame = NULL; // ๋ถ๋ฌ๋ค์ผ mesh๋ฅผ ํฌํจํ ํ๋ ์
// Mesh builder ์์ฑ
if(FAILED(pD3DRM->CreateMeshBuilder(&pMeshBuilder)))
return FALSE;
// Load mesh file : camaro.x ํ์ผ์ ๋ถ๋ฌ๋ค์
if(FAILED(pMeshBuilder->Load("55porsmx.x", NULL, D3DRMLOAD_FROMFILE,
NULL, NULL))) {
SAFE_RELEASE(pMeshBuilder);
SAFE_RELEASE(pMeshFrame);
return FALSE;
}
// SceneFrame ์์ Mesh๋ฅผ ์ํ Frame ์์ฑ
if(FAILED(pD3DRM->CreateFrame(pD3DSceneFrame, &pMeshFrame)))
return FALSE;
// Frame์ ๋ถ๋ฌ๋ค์ธ mesh ๋ถ์ด๊ธฐ
if(FAILED(pMeshFrame->AddVisual((LPDIRECT3DRMVISUAL)pMeshBuilder)))
return FALSE;
// Set up the frames position, orientation and rotation
if(FAILED(pD3DCameraFrame->SetPosition(pD3DSceneFrame, 1.0f, -0.9f, -12.5f)))
return FALSE;
if(FAILED(pD3DCameraFrame->SetOrientation(pD3DSceneFrame,
0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f)))
return FALSE;
if(FAILED(pMeshFrame->SetRotation(pD3DSceneFrame, 0.0f, 1.0f, 0.0f, 0.02f)))
return FALSE;
// ์ด๊ธฐ์ ํ์ํ ๋งํผ mesh๊ฐ์ฒด๋ฅผ ๋๋ฆฌ๊ธฐ ์ํด AddRotation ์ฌ์ฉ
if(FAILED(pMeshFrame->AddRotation(D3DRMCOMBINE_AFTER, 0.0f, 1.0f, 0.0f, 2.4f)))
return FALSE;
if(FAILED(pMeshFrame->AddRotation(D3DRMCOMBINE_AFTER, 1.0f, 0.0f, 0.0f, -0.3f)))
return FALSE;
SAFE_RELEASE(pMeshFrame);
SAFE_RELEASE(pMeshBuilder);
return TRUE;
}
16. OnDraw๊ฐ ์๋๊ณ OnPaint๋ฅผ ์ฌ์ฉํ๋ค. ๋ค์์ฒ๋ผ OnPaint ํจ์์์ฑ.
// OnDraw()๋ฅผ ์ฌ์ฉํ์ง ์๊ณ OnPaint() ์ฌ์ฉ
void CXLoaderView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
if(!pD3DRMDevice || IsIconic())
return;
pD3DViewport->Clear(D3DRMCLEAR_ALL); // Viewport Clear
pD3DViewport->Render(pD3DSceneFrame); // Scene Rendering
pD3DRMDevice->Update(); // Device Update // Do not call CView::OnPaint() for painting messages
}
17. ๋ทฐ์ ํฌ๊ธฐ๊ฐ ๋ฐ๋ ๊ฒฝ์ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ํด OnSize() ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ๋ค.
// ๋ทฐ์ ํฌ๊ธฐ๊ฐ ๋ฐ๋๊ฒฝ์ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ํด
void CXLoaderView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(!pD3DViewport) return;
if(!pD3DRMDevice) return;
int width = cx;
int height = cy;
if(!width || !height || IsIconic()) return;
// Device์ Viewport์ ํ์ฌ ํญ๊ณผ ๋์ด๋ฅผ ์ป๋๋ค.
int vWidth = pD3DViewport->GetWidth();
int vHeight = pD3DViewport->GetHeight();
int dWidth = pD3DRMDevice->GetWidth();
int dHeight = pD3DRMDevice->GetHeight();
// window ํฌ๊ธฐ์ ๋ณํจ์ด ์์ผ๋ฉด ๋ฆฌํดํ๋ค.
if(vWidth == width && vHeight == height) return;
// ์๋๋ฉด Device์ Viewport๋ฅผ ๋ค์ ์์ฑํ๋ค.
pD3DViewport->Release();
pD3DRMDevice->Release();
if(!CreateDevice()) {
::AfxMessageBox("Device Creation Failure!");
PostQuitMessage(0);
}
if(!CreateViewport()) {
::AfxMessageBox("Viewport Creation Failure!");
PostQuitMessage(0);
}
}
18. ๋ฐฉํฅํค๋ก ์๋์ฐจ ๋ชจ๋ธ์ ์์ง์ด๊ฒ ํ๊ธฐ ์ํด ํด๋์ค ์์ ๋์์ WM_KEYDOWN ๋ฉ์์ง์ ํธ๋ค๋ฌ๋ฅผ ์์ฑํ๋ค.
// ๋ฐฉํฅํค๋ก ์๋์ฐจ ๋ชจ๋ธ์ ์์ง์ผ ์ ์๋๋ก ํจ
// rotation : ๋ฐฉํฅํค, translation : Insert, Home, PgUp, PgDn
void CXLoaderView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
LPDIRECT3DRMFRAMEARRAY pFrameArray; // Frame Array
LPDIRECT3DRMFRAME pChildFrame; // ์ป๊ณ ์ํ๋ Frame
// Frame Array๋ฅผ ์ป๋๋ค.
pD3DSceneFrame->GetChildren(&pFrameArray);
// ์ฐ๋ฆฌ๊ฐ ์ํ๋ Frame์ ์ป๋๋ค.
pFrameArray->GetElement(1, &pChildFrame);
// Frame์ rotateํ๋ค.
if(nChar == VK_UP) // ์์ชฝ ๋ฐฉํฅํค
pChildFrame->AddRotation(D3DRMCOMBINE_AFTER,
1.0f, 0.0f, 0.0f, 0.1f);
if(nChar == VK_DOWN) // ์๋์ชฝ ๋ฐฉํฅํค
pChildFrame->AddRotation(D3DRMCOMBINE_AFTER,
1.0f, 0.0f, 0.0f, -0.1f);
if(nChar == VK_LEFT) // ์ผ์ชฝ ๋ฐฉํฅํค
pChildFrame->AddRotation(D3DRMCOMBINE_AFTER,
0.0f, 1.0f, 0.0f, 0.1f);
if(nChar == VK_RIGHT) // ์ค๋ฅธ์ชฝ ๋ฐฉํฅํค
pChildFrame->AddRotation(D3DRMCOMBINE_AFTER,
0.0f, 1.0f, 0.0f, -0.1f);
// Frame์ Translateํ๋ค.
if(nChar == VK_PRIOR) // Page Up ํค : ์์ชฝ (+y์ถ ๋ฐฉํฅ)
pChildFrame->AddTranslation(D3DRMCOMBINE_AFTER,
0.0f, 0.1f, 0.0f);
if(nChar == VK_NEXT) // Page Down ํค : ์๋์ชฝ (-y์ถ ๋ฐฉํฅ)
pChildFrame->AddTranslation(D3DRMCOMBINE_AFTER,
0.0f, -0.1f, 0.0f);
if(nChar == VK_INSERT) // Insert ํค : ์ผ์ชฝ (-x์ถ ๋ฐฉํฅ)
pChildFrame->AddTranslation(D3DRMCOMBINE_AFTER,
-0.1f, 0.0f, 0.0f);
if(nChar == VK_HOME) // Home ํค : ์ค๋ฅธ์ชฝ (+x์ถ ๋ฐฉํฅ)
pChildFrame->AddTranslation(D3DRMCOMBINE_AFTER,
0.1f, 0.0f, 0.0f);
pFrameArray->Release();
pChildFrame->Release();
InvalidateRect(NULL, FALSE); // ์๋์ฐ๋ฅผ ๋ค์ ๊ทธ๋ฆฐ๋ค.
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
# ๋ฌธ์ ์
: ์ด ์ฝ๋์์ ๋ถ๋ฌ๋ค์ด๋ ๋ชจ๋ธ์ ์๊ฒ ํด์(RenderingScene() ํจ์์์ ๊ณ ์น ์ ์๋ค) ๋ถ๋ฌ๋ณด๋ฉด ๋ฐฐ๊ฒฝ์ฒ๋ฆฌ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.. ๋ชจ๋ธ์ด ์์ง์ด๋ ๋ถ๋ถ์๋ง ๋ฐฐ๊ฒฝ์ด ๊ทธ๋ ค์ง๊ณ , ๋๋จธ์ง๋ ๋ฐฐ๊ฒฝ์ด ๊ทธ๋ ค์ง์ง ์๋ ๋ฌธ์ ๊ฐ ์์ฃ . ์ฌ๊ธฐ์๋ ๋ชจ๋ธ์ ํฌ๊ธฐ๋ฅผ ์ ๋นํ ๋ง์ถ์ด์ ๊ทธ๋ฐ ํฐ๊ฐ ์๋๊ฒ ์กฐ์ ํ์ง๋ง, ์ค์ ๋ก ๊ทธ๋ ๊ฒ ๋ง๋ค์ด์ ํ๋ฒ ๋๋ ค๋ณด๋ฉด ์ ์ ์์ ๊ฒ๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์๊ณ ๊ณ์ ๋ถ์ ํ์ฃผ์ธ์๊ฒ ์ฐ๋ฝ์ ํด ์ฃผ๊ธฐ ๋ฐ๋๋๋น.
- the end of this article -