在視窗模式下使用 directdraw , 最大的痛苦是不能使用換頁操作(flip). 但是有許多人還是喜歡在視窗模式下進行遊戲.
首先, 視窗模式下建立乙個 idirectdraw 介面物件和全屏模式下是一樣的, 不同的是, 在選擇協作模式和不能改變螢幕解析度. (當然你堅決要改變, 一定要有禮貌的改變.)
// 設定協作級別,視窗化下使用 ddscl_normal 標誌.
if (failed(m_x2d_lpddraw->setcooperativelevel(m_x2d_hwnd, ddscl_normal)))
return (e_fail);
// 使用 directdraw 介面物件建立 directdrawsu***ce 主頁面物件.
ddsu***cedesc2 ddsd;
init_dxstruct(ddsd);
ddsd.dwflags = ddsd_caps;
ddsd.ddscaps.dwcaps = ddscaps_primarysu***ce;
if (failed(m_x2d_lpddraw->createsu***ce(&ddsd, &m_x2d_lpddrawprimarysu***ce, null)))
return (e_fail);
// 建立乙個離屏頁面
init_dxstruct(ddsd);
ddsd.dwflags = ddsd_caps | ddsd_width | ddsd_height;
ddsd.dwwidth = width;
ddsd.dwheight = height;
ddsd.ddscaps.dwcaps = ddscaps_offscreenplain;
if (failed(m_x2d_lpddraw->createsu***ce(&ddsd, &m_x2d_lpddrawbacksu***ce, null)))
return (e_fail);
/* 在這裡省略掉給這個離屏頁面附屬上裁剪器,
下面使用到這個離屏頁面的是已經附屬上裁減器的. */
lpdirectdrawclipper lpddclipper = null;
// 建立裁剪器.
if (failed(m_x2d_lpddraw->createclipper(0, &lpddclipper, null)))
return (e_fail);
// 與視窗工作區關聯.
if (failed(lpddclipper->sethwnd(0, m_x2d_hwnd)))
if (failed(m_x2d_lpddrawprimarysu***ce->setclipper(lpddclipper)))
safe_release(lpddclipper);
給主頁面設定裁剪器, 是為了視窗在超出(超出螢幕的顯示部分)桌面時能正常工作.實際上主頁面就是你的桌面.
現在桌面上有許多視窗在執行, 我們不能胡亂的在桌面上亂畫, 否則其他的視窗可能抱怨. 我們要知道我們的視窗工作區位置, 然後我們在這個工作區內工作.
getclientrect(m_x2d_hwnd, &m_x2d_clientrect);
clienttoscreen(m_x2d_hwnd, (lppoint)&m_x2d_clientrect);
clienttoscreen(m_x2d_hwnd, (lppoint)&m_x2d_clientrect+1);
m_x2d_clientrect 儲存的是我們的視窗工作區(客戶區)位置.
然後我們可能這樣用:
m_x2d_lpddrawprimarysu***ce->blt(&m_x2d_clientrect, m_x2d_lpddrawbacksu***ce, null, ddblt_wait, null));
這個位轉換目標位置就是我們的工作區. 因為我們給主頁面附屬了裁剪器, 所以不能再用bltfast來位轉換了.
如果我們像這樣用, 可能看到乙個雜亂的桌面.
rect rct = ;
m_x2d_lpddrawprimarysu***ce->blt(&rct, su***ce, null, ddblt_wait, null));
這樣的後果是:
在桌面的 x = 0, y = 0 位置, 畫上 寬 = 300, 高 = 123 的 su***ce 圖形.
在視窗模式下, 一定要正確獲得自己的工作區, 當視窗移動或者改變大小, 我們因該有所行動.
case wm_move:
case wm_size:
getclientrect(m_x2d_hwnd, &m_x2d_clientrect);
clienttoscreen(m_x2d_hwnd, (lppoint)&m_x2d_clientrect);
clienttoscreen(m_x2d_hwnd, (lppoint)&m_x2d_clientrect+1);
break;
還有, 當視窗失去焦點(活動), 應該停止在繼續向主頁面繪畫. 否則, 你畫的將覆蓋掉在視窗上的其他視窗的內容.
case wm_activate:
菜鳥DirectX之頂點快取
現在是22點43分,剛下班回家,因為遊戲要十二月份上線,比之前的計畫提前了三個月,拼命的加班啊。一什麼是頂點快取 在遊戲中,物體模型是用多邊形網格來描述的,一般的是三角形,頂點快取就是來儲存用來描述物體模型的所有多面形的頂點的資訊,這些資訊有頂點的三維座標,頂點顏色,頂點法向量,紋理座標等。二如何使...
菜鳥DirectX之紋理對映
一紋理對映是什麼 就是你用前面部落格中講到的方法繪製乙個正方形後,在正方形上貼一張你想要顯示的 二紋理對映的使用 使用方法分為四步 1 在頂點格式中定義紋理的座標 比如 struct myvertex 2 填充頂點資料 customvertex vertices void pvertices if ...
DirectX學習之WinMain函式
剛開始學習directx,使用vs2013編譯環境,建立第乙個視窗,學習winmain函式。winmain函式是windows應用程式的入口,相當於c語言的main函式。winmain函式主要實現以下功能 1.註冊視窗類,建立視窗,執行其他必要的初始化的操作 2.進入訊息迴圈,根據從應用程式訊息佇列...