VB.NET实现DirectDraw9 (1) 托管的DDraw
關(guān)鍵字: VB.NET DirectX DirectDraw 9???????????????????????????? 作者:董含君
轉(zhuǎn)載請(qǐng)注明來(lái)自: http://blog.csdn.net/a11s
================以下為廢話(記日記是好習(xí)慣)===============
本來(lái)應(yīng)該繼續(xù)DirectSound 混音的,但是今天由于時(shí)間關(guān)系,完不成任務(wù)了.
發(fā)現(xiàn)國(guó)外的一個(gè)站點(diǎn),里面的人比較牛X 直接自己用binaryreader讀取wav
自愧不如啊~~~
================End 廢話===============================
很多人都認(rèn)為DirectDraw在DirectX7時(shí)代就終結(jié)了,到了VB.NET以及托管的DirectX
微軟要繼承舊的DirectDraw,又要托管.所以DDraw畢竟是有變化的.
現(xiàn)在拾起來(lái).有點(diǎn)不適應(yīng).但是基本概念還是不會(huì)變化的.
國(guó)內(nèi)高手對(duì)此不屑,而且還有人會(huì)了3D后敵視2D,我就不發(fā)表評(píng)論了,倒是讓我有了填補(bǔ)國(guó)內(nèi)空白的機(jī)會(huì)了
首先說(shuō)大體過(guò)程.我的學(xué)習(xí)筆記比較基礎(chǔ),不是為了體現(xiàn)DDraw的性能,而是理清步驟(微軟的例子就麻煩4了)
0 工程添加DirectDraw的引用,代碼里面imports Microsoft.DirectX.DirectDraw
1 創(chuàng)建Device 設(shè)置合作級(jí)別 (只要是DirectX 都要這樣)
2 創(chuàng)建描述 (為了創(chuàng)建Surface做準(zhǔn)備,跟DirectSound創(chuàng)建Buffer的描述一個(gè)道理)
3 利用描述創(chuàng)建主緩沖以及二級(jí)緩沖(就是BackSurface)
4 為主緩沖指定一個(gè)Clipper
=============加載完成==================
繪制過(guò)程比較簡(jiǎn)單,你可以使用Timer設(shè)置時(shí)間間隔.但是一般人不會(huì)這么作,雖然實(shí)現(xiàn)過(guò)程簡(jiǎn)單.
為了體現(xiàn)平滑的動(dòng)畫,往往CPU能用就用,FPS越高越好(其實(shí)太高了也沒(méi)用,但是當(dāng)動(dòng)畫復(fù)雜的時(shí)候就有用了)
以下是參考大風(fēng)給我的計(jì)時(shí)器.
??????? Dim tfp As Integer = 0????????????????????????????????????? '''fps<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
??????? Dim mytime As Date = DateTime.Now?????????????????????????? '''臨時(shí)用一下
??????? While (run = True)????????????????????????????????????????? '''如果游戲沒(méi)有結(jié)束
??????????? blt()?????????????????????????????????????????????????? '''主要繪制過(guò)程
??????????? tfp += 1??????????????????????????????????????????????? '''fps++
??????????? If tfp = 200 Then?????????????????????????????????????? '''200次的時(shí)候計(jì)算時(shí)間
??????????????? 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)??????????????????????????????????????????? '''硬性規(guī)定休息一下,當(dāng)然可以去掉發(fā)揮MAX速度
??????? End While
需要知道,里面的變量都是臨時(shí)定義的,如果你對(duì)速度很在意,這樣做是不可取的,但是為了理解方便,所以才這么作,進(jìn)行優(yōu)化的時(shí)候就要拿出來(lái)了.
有了計(jì)數(shù)器,用它建立了游戲循環(huán).循環(huán)自己管理主要的blt()過(guò)程,blt也很簡(jiǎn)單
??? 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
就是設(shè)置好矩形區(qū)域然后繪制,這里不再是DDraw7的RECT了,里面多少有些變化.
調(diào)用游戲循環(huán)很簡(jiǎn)單,直接main2就可以,但是不可取,這樣做會(huì)讓你的程序”卡死”,導(dǎo)致程序沒(méi)有響應(yīng)
需要新開(kāi)一個(gè)線程處理這件事情
??? 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 窗體設(shè)計(jì)器生成的代碼 "
?
??? Public Sub New()
??????? MyBase.New()
?
??????? '該調(diào)用是 Windows 窗體設(shè)計(jì)器所必需的。
??????? InitializeComponent()
?
??????? '在 InitializeComponent() 調(diào)用之后添加任何初始化
?
??? 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 窗體設(shè)計(jì)器所必需的
??? Private components As System.ComponentModel.IContainer
?
??? '注意: 以下過(guò)程是 Windows 窗體設(shè)計(jì)器所必需的
??? '可以使用 Windows 窗體設(shè)計(jì)器修改此過(guò)程。
??? '不要使用代碼編輯器修改它。
??? 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?????????????????????????? '''臨時(shí)用一下
??????? While (run = True)????????????????????????????????????????? '''如果游戲沒(méi)有結(jié)束
??????????? blt()???????????????????????? ??????????????????????????'''主要繪制過(guò)程
??????????? tfp += 1??????????????????????????????????????????????? '''fps++
??????????? If tfp = 200 Then?????????????????????????????????????? '''200次的時(shí)候計(jì)算時(shí)間
??????????????? 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)??????????????????????????????????????????? '''硬性規(guī)定休息一下,當(dāng)然可以去掉發(fā)揮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
?
====================================================
需要注意的是,這里進(jìn)行繪制的時(shí)候,圖片的位置是相對(duì)屏幕左上角的,只要你改變響應(yīng)的rect就可
因?yàn)楂@得坐標(biāo)牽扯到其他地方,不宜于降低本文難度,所以沒(méi)加.
下一步的DirectDraw?? 全屏幕的動(dòng)畫 以及出現(xiàn)角色繪制
DirectSound混音好像很麻煩.....
轉(zhuǎn)載于:https://www.cnblogs.com/a11s/archive/2005/12/31/309082.html
總結(jié)
以上是生活随笔為你收集整理的VB.NET实现DirectDraw9 (1) 托管的DDraw的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ADO.NET 2.0 功能一览 --作
- 下一篇: 在64位Windows中使用64位版本A