亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? directdraw

?? Delphi技巧
??
字號:
DirectDraw 游戲編程基礎(3)

游戲使計算機的發展超越了晶體管時代
       
      微軟公司供稿
例一的擴展(DDEX2和DDEX3)
DDEX1包含了一個最基本的DirectDraw的實現方法。它生成了DirectDraw和DirectDrawSurface對象,同時也生成了一個主表面(Surface)和與之相關的后臺緩沖區,并在后臺緩沖區打印文本,并可以在表面(Surface)之間進行切換。
在DirectX 3 SDK(DDEX2)中的第二個DirectDraw 例程擴展了關于DDEX1應用程序。DDEX2包括將一個位圖文件載入到后臺緩沖區的函數。
第三個DirectDraw 例程將這一函數進一步地擴展了。除了主表面(Surface)和后臺緩沖區之外,DDEX3還生成了兩個隱屏表面(Surface),并且在每一個隱屏表面(Surface)之中都載入了一個位圖文件。然后,DDEX3使用IDirectDrawSurface::BltFast方法,將一個隱屏的內容復制到后臺緩沖區中。之后,彈出這些緩沖區,并且將下一個隱屏表面(Surface)的內容復制到后臺緩沖區。
以下的部分將更詳細地檢查這一新的函數。
在一個表面(Surface)上載入一個位圖(Bitmap)
就與DDEX1一樣,dolnit是DDEX2應用程序的初始化函數。雖然,在DDEX2中,DirectDraw的初始化方式表面上與在 DDEX1中的DirectDraw的初始化方式不太一樣,但它們的實質是一樣的。這一過程如下列的程序代碼所示:
    LPddPal = DDLoadPalette(LpDD, szBackground);
    if (LpddPal == NULL)
     goto error;
      ddrval = LpDDSprimary->SetPalette(LpDDPal);
      if( ddral != DD_OK )
      goto error;
       // Load a bitmap into the back buffer。
     Ddrval = DDReLoadBitmap(LpDDSBack, szBackground);
     if( ddrval != DD_OK )
     goto error;
生成調色板        
這個程序代碼的第一行是:從DDLoadPalette函數返回一個值。如果你想知道在哪能找到DDLoadPalette,你可以在\DXSDK|SAMPLES|MISC目錄中的Ddutil.cpp文件中找到它。你會發現,在DirectX 3 SDk的大部分DirectDraw例程中都使用了Ddutil.cpp文件。最為關鍵的是:該文件上包括了能從文件中或是從資源中載入位圖和調色板的函數。這些函數的代碼并非一遍遍地重復出現在例程文件中,而且被放置在能被重復使用的同一文件之中。
注意:如果你正在使用MS Developer Studio(微軟開發工作室)編輯DDEX2和用DirectX 3 SDK提供的其它工具,你必須把Ddutil.cpp文件插入到DDEXx文件工作區的文件表中。重申一遍:在工作區中必須包括Ddutil.cpp:
 1.	在插入(insert)菜單上,單擊Files進入Projeects。
 2. 單擊Browse.
 3. 單擊DXSDK\SDK\SAMPLES\MISC\目錄。
 4. 單擊Ddutil.cpp
 5. 單擊ADD
對于DDEX2來說,從Back.bmp文件中,DDLoadPalette創建了一個DirectDraew對象。DDLoadPalette函數實際上是來檢查用以產生調色板的一個文件或資源是否存在。如果不存在的話,該函數就創建一個缺省的調色板,對于DDEX2 來說,DDLoadPalette函數從文件中提取調色板信息,并通過ape指針將其存儲在一個指定的結構中,然后它生成DirectDrawPalette 對象。如下面的代碼所示:
          pdd->CreatePalette(DDPCAPS_8BIT, ape, &ddpal, NULL);
          return ddpal;
          
當IDirectDraw::Createpalette方法返回后,ddpal參數將指向DirectDrawPalette對象,其中,對象DirectDrawPalette是從DDLoadPalettede的調用返回的。
Ape參數是一個指針,它可以包括2,4,16或256個入口,呈直線分布。這些入口的數目由IDirctDraw::CreatePalette參數決定。在這種情況下,dwFLags參數被設置為DDPCAPS_8BIt,它表示:在這個結構中有256個入口。每個入口包括4位(一位紅通道,一位綠通道,一位蘭通道和一個標志位)。
設置調色板
在生成調色板之后,你要通過調用IDirectDrawSurface::SetPalette方法,將DirectDrawPalette對象的指針轉到主表面(Surface)上,如下列代碼所示:
          ddrval = LpDDSPrimary->SetPalette(LpDDPal);
           if( ddrval != DD_Ok )
              // SetPalette failed
一旦你已經調用了IdirectDrawSurface::SetPalette,DirectDrawPalette對象就被嵌入到DirectDrawSurface對象中了。不論何時你需要改變這一調色板,你要作的就是生成一個新的調色板并重新設置該調色板。(這就如例程中所做的一樣。然而,也有其它的改變調色板的方式。我們可以在其它例程中看到)。
在后臺緩沖區中載入一個位圖文件
一旦DirectDrawPalette對象被嵌入到DirectDrawSurface對象之中,DDEX2就將Back.bmp bitmap載入到后臺緩沖區中。使用下例的程序代碼可實現該過程:
           // Load a bitmap into the back buffer.
           Ddrval = DDReLoadBitmap(LpDDSBack, szBackground);
           if( ddrval != DD_Ok )
               // Load failed
DDReLoadBitmap是出現在Ddutil.cpp中的另一個函數。它從一個文件或資源中將一個位圖文件載入到一個已經存在的DirectDraw表面(Surface)之中。(就象在DDEX5中那樣,你可以使用DDLoadBitmap創造一個表面(Surface)并且將位圖載入那個表面(Surface))。對于DDEX2來說,DDReLoadBitmap把szBackground指向的Back.bmp載入到ipDDSBack指向的后臺緩沖區,DDReLoadBitmap調用DDCopyBitmap函數,將文件復制到后臺緩沖區中,并且將緩沖區擴展到適當的。
DDCopyBitmap函數將位圖復制到內存之中,然而利用GetObject函數得到位圖的大小。DDCopyBitmap然后使用下列的代碼得到后臺緩沖區的大小(它可以放置位圖):
           //
           // get size of surface
           //
           ddsd.dwSize = sizeof(ddsd);
           ddsd.dwFlags = DDSD_HEIGHT DDSD_WIDTH;
           pdds->GetSurfaceDesc(&ddsd);
ddsd是指向DDSRFACEDESC結構的一個指針。該結構存儲了DirectDraw表面(Surface)的當前描述。在這種情況下,我們需要注意的是:DDSURFACEDESC的成員描述這個表面(Surface)的高度和寬度,分別表示為:DDSD_HEIGHT和 DDSD_WIDTH。調用IDirectDrawSurface::GetSurfaceDesc方法,把適當的值來載入到這個結構。對于DDEX2來說,這些值將是:高480和寬640。
DDCopyBitmap函數鎖定表面(Surface)并將位圖文件復制到后臺緩沖區,使用StretchBit函數延伸或壓縮后臺緩沖區到可適用的大小。表示如下:
    if ((hr = pdds->GetDC(&hdc)) == DD_OK)
          {
             StretchBlt(hdc, 0,0,ddsd.dwWidth, ddsd.dwHeight, hdcImage,x, y, dx, dy, SRCCOPY);
          pdds->ReleaseDC(hdc);
          }
彈出表面(Surface)
在DDEX2例程中的彈出表面(Surface)操作本質上與在DDEX1例程中的彈出操作是同樣的過程。但是在表面(Surface)丟失的情況下,你必須通過調用DDReLoadBitmap函數,在表面(Surface)恢復之后,,將bitmap再次載入到后臺緩沖區中。
從一個隱屏表面(Surface)按位隔行拷貝
DDEX2是在后臺緩沖區中取出和放入位圖的,然后在后臺緩沖區和主緩沖區之間切換。這并不是一個展示位圖的很實際的方法。DDEX3擴展了DDEX2的功能,它包括了兩個隱屏緩沖區,且在其內部存放有兩個位圖(一個對應于偶行屏幕,另一個對應于奇行屏幕)。DDEX3把一個屏幕按位隔行拷貝到后臺緩沖區中,再把另外一個屏幕按位隔行拷貝到另一個后臺緩沖區中,然后彈出表面(Surface)。
生成隱屏表面(Surface)
下列的代碼在DDEX3 中加到dolnit 函數可生成兩個隱屏 緩沖區:
          // Create an offscreen bitmap.
          Ddsd.dwFlags = DDSD_CAPS DDSD_HEIGHT DDSD_WIDTH;
          ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
          ddsd.dwHeight = 480;
          ddsd.dwWidth = 640;
          ddrval = lpDD->CreateSurface( &ddsd,&lpm DDSOne,NULL);
          if (ddrval != DD_OK)
          {
              return initFail(hwnd);
          }
          //Create another offscreen bitmap.
          Ddrval = lpDD->CreateSurface( &ddsd,&lpm DDSTwo,NULL);
          if (ddrval != DD_OK)
          {
              return initFail(hwnd);
          }
如代碼中所示,dwFlags成員設定了應用程序將使用DDSAPS結構,并且設置緩沖區的高度和寬度。表面(Surface)是一個平面式隱屏緩沖區,就如同通過設置在DDSCAPS結構中的DDSCAPS_OFFSCREEN標志所表示的一樣。在DDSURFACEDESc結構中,高度和寬度被分別設置為480和640。通過使用IDirectDraw::CreateSurface方法,表面(Surface)就這樣被生成了。
因為兩個隱屏緩沖區有著同樣的大小,故生成第二個緩沖區的唯一要求就是再運行IDirectDraw::CreateSurface(當然,要用不同的指針名字)。
通過在DDSCAPS結構中,或是設置DDSCAPS_SYSTEMMEMORY,或是設置DDSCAP_VIDEOMEMORY的容量,你可以將該:隱屏緩沖區或是放置在系統內存中或是顯存中。通過將位圖存盤在顯存中,你可以增加隱屏表面(Surface)和緩沖區之間切換的速度。當我們開始討論位圖動畫時,速度將變得更加重要。但是,此時你應當注意:如果你僅為隱屏緩沖區設置DDScAPS_VIDEOMEMORY,而沒有足夠的顯存來保存整個位圖文件,那么,當你試圖創建表面(Surface)時,就會返回一個DDERR_OUTOFVIDEOMEMORY的錯誤值。

將位圖文件載入后臺緩沖區
在兩個隱屏表面(Surface)生成后,DDEX#使用INITSURFACES函數,從Frnt.bmp文件中將位圖文件載入到表面(Surface)中。InitSurfaces函數使用Ddutil.cpp中的DDCopyBitmap載入這兩個位圖文件,如下列代碼所示:
           // Load our bitmap resource.
           Hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL),szBitmap,
              IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);

           if (hbm == NULL)
               return FALSE;

           DDCopyBitmap(lpDDSone,hbm,0,0,640,480);
           DDCopyBitmap(lpDDSTwo,hbm,480,640,480);
           DeleteObject(hbm);
           return TRUE;
如果你在MS Paint(微軟畫筆)或是另一個繪畫程序中看到Frnt.bmp文件,你可以看到位圖文件是由兩個屏幕組成的(其中一個在另一個的上部)。DDCopyBitmap函數在屏幕相匯點上將位圖文件一分為二,并將第一份位圖文件載入第一個隱屏表面(Surface)(IPDDSOne)中,同時將第二份位圖載入第二個隱屏表面(Surface)(IPDDSTwo)中。
將隱屏表面(Surface)按位隔行拷貝到后臺緩沖區
WM TIMER包含了寫表面(Surface)和彈出表面(Surface)的代碼。在DDEX3的情況下,它包含下列的代碼,用來選擇適當的隱屏表面(Surface),并將它按位隔行拷貝到后臺緩沖區中。
           rcRECT.LEFT =0;
           RCRECT.TOP =0;
           RCRECT.right =640;
           rcRect.bottom =480;
           if(phase)
           {
              pdds = lpDDSTwo;
              phase = 0;
           }
           else
           {
              pdds = lpDDSOne;
              phase = 1;
           }
           while(1)
           {
              ddrval =lpDDSBack->BltFast(0,0,pdds,&rcRect,FALSE);
              if(ddrval == DD_OK)
              {
                 break;
              }

"phase"決定了將哪一個隱屏表面(Surface)按位隔行拷貝到后臺緩沖區中。然后,IDirectDrawSurface::BltFAst方法被調用,并將已經被選擇好的隱屏表面(Surface)按位隔行拷貝在后臺緩沖區中,開始位置為(0,0),它位于屏幕的左上角。參數rcRect指向結構Rect,它定義了隱屏表面(Surface)的左上角和右下角。最后的參數被設置為FALSE(或0),這就表明了沒有專門的轉移標志以備使用。
在這里,我很想補充說明的是:在何種情況下應該選擇IDirectDrawSurface::Blt方法,在何種情況下應該選擇IDirectDrawSurface::BltFast方法。如果你正在從一個隱屏緩沖區中進行一次按位隔行拷貝,你應當使用IDirectDrawSurface::BltFast。如果你的系統顯存中是使用硬件進行按位隔行拷貝,你雖然不會真正提高拷貝的速度,但是,它會節省系統模擬硬件時間,從而使整個按位隔行拷貝時間縮短約10%。因此,我推薦讀者使用IDirectDrawSurface::BltFast進行所有的顯示操作(從顯存按位隔行拷貝到顯存中)。如果你正在從系統內存中按位隔行拷貝,或者要求專門的硬件標志位,這樣的話,你就必須使用IDirectDrawSurface::Blt。
一旦隱屏表面(Surface)被載入后臺緩沖區中,后臺緩沖區和主表面(Surface)就如同前邊的例程中所顯示的一樣被彈出。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧洲一区在线电影| 久久综合色8888| 欧美一级一级性生活免费录像| 91麻豆精品国产91久久久| 久久久99久久| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲第一二三四区| 国产成人a级片| 欧美日韩你懂的| 国产精品色婷婷| 久久av老司机精品网站导航| 91老师片黄在线观看| 久久久久久久国产精品影院| 亚洲一区影音先锋| 成人av小说网| 久久影视一区二区| 日韩av电影免费观看高清完整版 | 国产成人精品免费在线| 欧美色图在线观看| 国产精品毛片久久久久久| 精品一区二区综合| 欧美二区三区91| 亚洲午夜国产一区99re久久| 99久久综合99久久综合网站| 久久这里只有精品视频网| 日韩精彩视频在线观看| 日本高清成人免费播放| 国产精品久久久久久久久久久免费看 | 亚洲天堂久久久久久久| 国产老女人精品毛片久久| 欧美丰满美乳xxx高潮www| 亚洲一区二区三区爽爽爽爽爽| 成人午夜激情片| 国产亚洲婷婷免费| 国产一区二区按摩在线观看| 日韩亚洲欧美一区二区三区| 午夜私人影院久久久久| 欧美亚洲国产一区二区三区va| 日韩伦理免费电影| 99re热视频精品| 中文字幕字幕中文在线中不卡视频| 国产一区二区伦理片| 久久久久久毛片| 国产成人午夜视频| 欧美激情一区二区三区四区 | 欧美96一区二区免费视频| 欧美日韩在线亚洲一区蜜芽| 亚洲一区二区三区免费视频| 91久久精品一区二区三区| 亚洲精品成人悠悠色影视| 91精品办公室少妇高潮对白| 亚洲精品乱码久久久久| 欧美丝袜丝交足nylons图片| 午夜精品福利一区二区蜜股av| 欧美男人的天堂一二区| 美日韩一区二区三区| 欧美成人乱码一区二区三区| 国产乱码精品一品二品| 国产精品欧美一区二区三区| 色婷婷激情久久| 亚洲自拍另类综合| 91精品国产丝袜白色高跟鞋| 精品一区二区三区免费视频| 国产欧美日韩久久| 日本高清不卡一区| 日韩avvvv在线播放| 久久男人中文字幕资源站| 国产.欧美.日韩| 一区二区三区中文字幕精品精品| 欧美日韩黄色一区二区| 激情小说亚洲一区| 亚洲欧美色综合| 91精品国产免费| 国产iv一区二区三区| 亚洲午夜久久久久久久久电影院 | 99久久精品99国产精品| 天堂久久久久va久久久久| 久久免费国产精品| 91传媒视频在线播放| 国产又黄又大久久| 一区二区三区精密机械公司| 精品久久久久久无| 91丝袜美腿高跟国产极品老师 | 久久国产尿小便嘘嘘尿| 亚洲欧美怡红院| 欧美变态口味重另类| 91麻豆免费观看| 韩国一区二区视频| 午夜精品久久久久久久99水蜜桃| 久久午夜羞羞影院免费观看| 欧美无砖砖区免费| 成人激情午夜影院| 美女www一区二区| 亚洲一区二区三区四区在线| 国产日韩欧美综合一区| 欧美一区日本一区韩国一区| 一本久道久久综合中文字幕 | proumb性欧美在线观看| 日韩在线一二三区| 亚洲欧洲综合另类| 久久精品一区二区三区不卡| 欧美色男人天堂| 97国产精品videossex| 国精产品一区一区三区mba桃花| 亚洲中国最大av网站| 中文字幕免费不卡| 精品免费视频.| 777精品伊人久久久久大香线蕉| 色婷婷精品久久二区二区蜜臂av| 国产成人啪午夜精品网站男同| 免费人成网站在线观看欧美高清| 亚洲精品成人少妇| 亚洲欧美日韩国产手机在线 | 亚洲在线视频免费观看| 国产日韩v精品一区二区| 日韩精品中文字幕在线一区| 91精品国产一区二区人妖| 欧美日韩免费视频| 欧美日韩免费在线视频| 欧美最新大片在线看| 在线观看亚洲精品| 色爱区综合激月婷婷| 欧美va天堂va视频va在线| 欧美一区二区免费观在线| 91精品国产91综合久久蜜臀| 欧美人动与zoxxxx乱| 在线播放日韩导航| 欧美一区二区久久| 日韩欧美www| 欧美成人性战久久| 久久久美女毛片| 亚洲国产高清在线观看视频| 国产拍欧美日韩视频二区| 亚洲国产精华液网站w| 日韩理论在线观看| 一区二区三区高清| 午夜精品aaa| 久久99精品久久久久婷婷| 激情久久久久久久久久久久久久久久| 久久av资源网| 成人aaaa免费全部观看| 色婷婷精品大视频在线蜜桃视频| 欧洲av一区二区嗯嗯嗯啊| 91精品视频网| 久久人人97超碰com| 国产精品拍天天在线| 亚洲最新视频在线观看| 亚洲五月六月丁香激情| 免费观看在线色综合| 国产麻豆9l精品三级站| 99久久久精品| 欧美福利电影网| 2020国产成人综合网| 国产精品污网站| 午夜不卡在线视频| 国产在线视频一区二区| 91丨porny丨首页| 91麻豆精品国产91久久久| 国产日韩欧美综合一区| 亚洲资源在线观看| 激情五月婷婷综合| 在线免费一区三区| 精品国产伦一区二区三区观看体验| 国产欧美中文在线| 午夜精品久久久久久| 成人美女在线观看| 日韩一区二区三区四区| 国产精品久久久久久久久免费丝袜| 亚洲va欧美va人人爽| 国产福利一区在线观看| 欧美日韩激情一区| 亚洲欧美自拍偷拍| 国产麻豆视频一区| 777午夜精品视频在线播放| 国产精品美日韩| 国内精品伊人久久久久影院对白| 91精彩视频在线观看| wwww国产精品欧美| 成人免费看黄yyy456| 欧美一区二区精品在线| 一区二区国产视频| 成人午夜又粗又硬又大| 欧美成人aa大片| 三级久久三级久久| 欧美在线观看一二区| 国产精品久久久久久久久快鸭 | 91香蕉视频在线| 国产三区在线成人av| 麻豆视频一区二区| 欧美探花视频资源| 一区二区三区四区亚洲| 成人免费毛片aaaaa**| 欧美精品一区二区三区高清aⅴ | 欧美午夜免费电影| 国产精品国产自产拍高清av王其| 久久超级碰视频| 欧美成人免费网站| 玖玖九九国产精品| 欧美一级黄色片| 日韩成人午夜精品|