国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

VB.NET實現DirectDraw9 (1) 托管的DDraw

2024-07-10 13:00:51
字體:
來源:轉載
供稿:網友
關鍵字: vb.net directx directdraw 9 作者:董含君
轉載請注明來自: http://blog.csdn.net/a11s

================以下為廢話(記日記是好習慣)===============
本來應該繼續directsound 混音的,但是今天由于時間關系,完不成任務了.

發現國外的一個站點,里面的人比較牛x 直接自己用binaryreader讀取wav

自愧不如啊~~~

================end 廢話===============================

很多人都認為directdraw在directx7時代就終結了,到了vb.net以及托管的directx

微軟要繼承舊的directdraw,又要托管.所以ddraw畢竟是有變化的.

現在拾起來.有點不適應.但是基本概念還是不會變化的.


國內高手對此不屑,而且還有人會了3d后敵視2d,我就不發表評論了,倒是讓我有了填補國內空白的機會了

首先說大體過程.我的學習筆記比較基礎,不是為了體現ddraw的性能,而是理清步驟(微軟的例子就麻煩4了)

0 工程添加directdraw的引用,代碼里面imports microsoft.directx.directdraw

1 創建device 設置合作級別 (只要是directx 都要這樣)

2 創建描述 (為了創建surface做準備,跟directsound創建buffer的描述一個道理)

3 利用描述創建主緩沖以及二級緩沖(就是backsurface)

4 為主緩沖指定一個clipper

=============加載完成==================

繪制過程比較簡單,你可以使用timer設置時間間隔.但是一般人不會這么作,雖然實現過程簡單.

為了體現平滑的動畫,往往cpu能用就用,fps越高越好(其實太高了也沒用,但是當動畫復雜的時候就有用了)

以下是參考大風給我的計時器.



dim tfp as integer = 0 '''fps

dim mytime as date = datetime.now '''臨時用一下

while (run = true) '''如果游戲沒有結束

blt() '''主要繪制過程

tfp += 1 '''fps++

if tfp = 200 then '''200次的時候計算時間

tfp = 0

dim ts as new timespan

ts = (datetime.now.subtract(mytime))

mytime = datetime.now

if ts.totalseconds <> 0 then

dim qiqi as double = 200 / (ts.totalseconds)

me.text = qiqi.tostring("##.##") + "f c"

end if



end if



tt.sleep(20) '''硬性規定休息一下,當然可以去掉發揮max速度

end while

需要知道,里面的變量都是臨時定義的,如果你對速度很在意,這樣做是不可取的,但是為了理解方便,所以才這么作,進行優化的時候就要拿出來了.

有了計數器,用它建立了游戲循環.循環自己管理主要的blt()過程,blt也很簡單



sub blt()



if ps is nothing then exit sub

dim r1 as rectangle

dim r2 as rectangle

r2.height = desc2.height

r2.width = desc2.width

r1.height = p.size.height

r1.x = 0

r1.y = 0

r1.width = p.size.width

ps.draw(r1, bs, r2, drawflags.wait)



end sub

就是設置好矩形區域然后繪制,這里不再是ddraw7的rect了,里面多少有些變化.

調用游戲循環很簡單,直接main2就可以,但是不可取,這樣做會讓你的程序”卡死”,導致程序沒有響應

需要新開一個線程處理這件事情



private sub label2_click(byval sender as system.object, byval e as system.eventargs) handles label2.click

run = not run

if tt is nothing then

tt = new threading.thread(addressof main2)

tt.start()

end if

end sub

ok,具體需要注意的就這么多,以下為全部源代碼

======================================



imports microsoft.directx.directdraw

imports microsoft.directx

imports system.drawing





public class form1

inherits system.windows.forms.form

dim dev as device

dim ps as surface

dim bs as surface

dim desc as surfacedescription

dim desc2 as surfacedescription

dim clip as clipper

dim t as new date

dim run as boolean

dim tt as threading.thread

const fn = "d:/nerv.bmp"



#region " windows 窗體設計器生成的代碼 "



public sub new()

mybase.new()



'該調用是 windows 窗體設計器所必需的。

initializecomponent()



'在 initializecomponent() 調用之后添加任何初始化



end sub



'窗體重寫 dispose 以清理組件列表。

protected overloads overrides sub dispose(byval disposing as boolean)

if disposing then

if not (components is nothing) then

components.dispose()

end if

end if

mybase.dispose(disposing)

end sub



'windows 窗體設計器所必需的

private components as system.componentmodel.icontainer



'注意: 以下過程是 windows 窗體設計器所必需的

'可以使用 windows 窗體設計器修改此過程。

'不要使用代碼編輯器修改它。

friend withevents p as system.windows.forms.picturebox

friend withevents label1 as system.windows.forms.label

friend withevents label2 as system.windows.forms.label

<system.diagnostics.debuggerstepthrough()> private sub initializecomponent()

me.p = new system.windows.forms.picturebox

me.label1 = new system.windows.forms.label

me.label2 = new system.windows.forms.label

me.suspendlayout()

'

'p

'

me.p.location = new system.drawing.point(40, 48)

me.p.name = "p"

me.p.size = new system.drawing.size(640, 480)

me.p.tabindex = 0

me.p.tabstop = false

'

'label1

'

me.label1.location = new system.drawing.point(16, 16)

me.label1.name = "label1"

me.label1.size = new system.drawing.size(72, 24)

me.label1.tabindex = 1

me.label1.text = "init"

'

'label2

'

me.label2.location = new system.drawing.point(112, 16)

me.label2.name = "label2"

me.label2.size = new system.drawing.size(80, 16)

me.label2.tabindex = 2

me.label2.text = "draw"

'

'form1

'

me.autoscalebasesize = new system.drawing.size(6, 14)

me.clientsize = new system.drawing.size(728, 541)

me.controls.add(me.label2)

me.controls.add(me.label1)

me.controls.add(me.p)

me.name = "form1"

me.text = "form1"

me.resumelayout(false)



end sub



#end region



private sub label1_click(byval sender as system.object, byval e as system.eventargs) handles label1.click

initdd()

end sub



sub initdd()

dev = new device(createflags.default)

dev.setcooperativelevel(me, cooperativelevelflags.normal)



dim caps as new surfacecaps

dim caps2 as new surfacecaps

caps.primarysurface = true

caps.videomemory = true

caps2.offscreenplain = true



desc = new surfacedescription(caps)

desc2 = new surfacedescription(caps2)

desc2.emptyfacecolor = rgb(0, 0, 255)



clip = new clipper(dev)

clip.window = p

bs = new surface(fn, desc2, dev)

ps = new surface(desc, dev)

ps.clipper = clip

me.text = "loaded"



end sub



private sub label2_click(byval sender as system.object, byval e as system.eventargs) handles label2.click

run = not run

if tt is nothing then

tt = new threading.thread(addressof main2)

tt.start()

end if

end sub

sub blt()



if ps is nothing then exit sub

dim r1 as rectangle

dim r2 as rectangle

r2.height = desc2.height

r2.width = desc2.width

r1.height = p.size.height

r1.x = 0

r1.y = 0

r1.width = p.size.width

ps.draw(r1, bs, r2, drawflags.wait)



end sub



sub main2()

dim tfp as integer = 0 '''fps

dim mytime as date = datetime.now '''臨時用一下

while (run = true) '''如果游戲沒有結束

blt() '''主要繪制過程

tfp += 1 '''fps++

if tfp = 200 then '''200次的時候計算時間

tfp = 0

dim ts as new timespan

ts = (datetime.now.subtract(mytime))

mytime = datetime.now

if ts.totalseconds <> 0 then

dim qiqi as double = 200 / (ts.totalseconds)

me.text = qiqi.tostring("##.##") + "f c"

end if



end if



tt.sleep(20) '''硬性規定休息一下,當然可以去掉發揮max速度

end while

end sub



private sub form1_closing(byval sender as object, byval e as system.componentmodel.canceleventargs) handles mybase.closing

end

end sub

end class



====================================================

需要注意的是,這里進行繪制的時候,圖片的位置是相對屏幕左上角的,只要你改變響應的rect就可

因為獲得坐標牽扯到其他地方,不宜于降低本文難度,所以沒加.

下一步的directdraw 全屏幕的動畫 以及出現角色繪制

directsound混音好像很麻煩.....


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和林格尔县| 锦屏县| 咸宁市| 龙游县| 杭州市| 佛冈县| 连云港市| 象州县| 和政县| 满城县| 宁夏| 寿阳县| 南昌市| 读书| 诸暨市| 手游| 鄱阳县| 盘锦市| 岳阳县| 高阳县| 上虞市| 阜阳市| 万宁市| 广昌县| 上高县| 当涂县| 江永县| 铜山县| 张家界市| 周口市| 宜黄县| 禹城市| 巴青县| 海口市| 杨浦区| 盈江县| 广西| 手游| 米泉市| 同仁县| 晴隆县|