程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> GIFs,JPGs和DirectInputMouse在用VB做游戲的運用

GIFs,JPGs和DirectInputMouse在用VB做游戲的運用

編輯:VB綜合教程

  相對而言,不是很難,我們並不需要解碼器來得到JPG的每一個字節,或任何類似於次的,相反,我們將用一個圖片框來打開一個圖片,然後再將其傳到表面,但首先我門需要聲明API函數:

  Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

  Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long

  Public Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

  Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

  Public Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long

  現在我們要為加載圖片作好准備

  Dim Pict1 As StdPicture

  Set Pict1 = LoadPicture("MyPict.jpg")

  創造表面:

  Dim TDesc As DDSurfaceDesc2

  TDesc.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH

  TDesc.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN

  TDesc.lHeight = CLng((Pict1.Height * 0.001) * 567 / Screen.TwipsPerPixelY)

  TDesc.lWidth = CLng((TPict.Width * 0.001) * 567 / Screen.TwipsPerPixelX)

  Set Surf = DDraw.CreateSurface(TDesc)

  Dim SurfDC As Long, PictDC As Long

  SurfDC = Surf.GetDC

  PictDC = CreateCompatibleDC(0)

  SelectObject Pict1.Handle, PictDC

  我們將使用Dcs和Bitblt或StretchBlt來把Pic1復制到表面

  只復制成一樣大小:

  BitBlt SurfDC, 0, 0, TDesc.lWidth, TDesc.lHeight, PictDC, 0, 0, vbSrcCopy

  現在復制並且改變圖片大小

  StretchBlt SurfDC, 0, 0, StretchWidth, StretchHeight, PictDC, 0, 0, TDesc.lWidth, TDesc.lWidth, vbSrcCopy

  釋放DC:

  Surf.ReleaseDC SurfDC

  DelecteDC PictDC

  Set Pict1 = Nothing

  下一步該怎麼作呢?下載SurfUtil。Bas,我將利用這一技巧來創造並加載圖片

  注意:有時StretchBlt不能正常顯示GIF,那就是我添加了BitBlt這個函數的原因

  .

  特殊效果

  你會懶的不想利用C/C++或匯編來創造一個動態連接庫,並用那個動態連接庫來完成特殊效果嗎?

  就讓blitter(我不認識,也查不出來,可能是glitter,閃光)光柵操作(ROP)為你工作!

  我的格言是讓最小的努力為你帶來最大的報酬!

  在Vb中有不少可使用的ROP常數:

  vbSrcPaint -邏輯或操作,源和目標圖片,做一個模擬的Alpha混合效果。

  vbSrcAnd - 邏輯與操作,灰度效果。

  vbSrcInvert - 邏輯異或操作。

  vbSrcErase - 翻轉目標圖片,然後再和源圖片進行邏輯與操作

  vbSrcCopy - 把原圖片直接復制到目標圖片上,在圓滿的替換掉?(replacing it completely)

  vbDstInvert -翻轉目標圖片,全部忽略原圖片。

  vbNotSrcCopy -翻轉源圖片,然後在直接復制到目標上,又是圓滿的替換掉?(replacing it completely)

  vbNotSrcErase - 對源圖片和目標圖片進行邏輯或操作,在翻轉。

  現在我們利用這些ROP有兩個執行銷毀的方法。我們能夠使用APIBitBlt這個函數,,也可以使用DirectX的BltFx函數,只有用戶的顯卡能夠使用硬件來支持ROP而不是軟件模擬ROP,BltFx才能夠工作,否則BltFx將會失敗!無論怎樣,BltFx失敗時,API的BitBlt還是能夠調用,在軟件中,一切就緒時,BitBlt就決不會失敗!

  (深思熟慮:當使用BltFx時,它可以完美的將表面放到顯存以使其借助顯卡的Blitter(和上面的一樣,不認識也查不出來)來快速訪問,而當另外使用API函數BitBlt時,它卻完美的將其置放到系統內存,否則數據將會被從顯存中修改後帶來,然後它將回到顯存,沒有效率啊!)

  容易的知道確認用戶的顯卡是否硬件支持特殊的ROP是件很好的事,我寫了一個簡單的函數來確認:

  Private Function TestROP(ByRef surfBack As DirectDrawSurface7, lngROP As Long) As Boolean

  Dim objBltFx As DDBLTFX

  Dim rectTemp As RECT

  • 首頁
  • 上一頁
  • 1
  • 2
  • 3
  • 下一頁
  • 尾頁
  • 共3頁
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved