网页功能: 加入收藏 设为首页 网站搜索  
VB.NET下的托管DX9编程入门
发表日期:2007-03-28作者:[转贴] 出处:  

   VB.NET从语法上扩展了VB6,具有VB6不可具备的优点。从本质上来说VB6是积木式的编程方式,语法上不是一个大型软件语言,是对象语言但不是面向对象的语言,但其与COM和API的良好结合,使得这个语言的应用变得极为广泛。我们为什么要从VB6转向VB.NET,现代软件由于规模庞大,往往不得不采用面向对象的方式来设计软件,一种语言或多或少都是具有面向对象的特性和面向过程的特性,纯粹面向对象和面向过程的语言都十分难以控制。比如我们用C语言来编写一个软件,C语言也可以调用Win32 API函数,也可以调用COM,但就是觉得很麻烦,因为他对对象的支持太少。VB6也很简单,用起来十分方便,但如果你写的软件需要十个窗体,每个窗体都大同小异,那么你就会觉得很枯燥,老是重复写一些东西,尽管你觉得很简单,把控件拖上去,写不了几行代码就完成了,但如果要你做十变,你是不是觉得很浪费?

  面向对象的语言其实并不复杂,只要具备3个条件就行了,一是封装性,这是面向对象最基本的功能,其实就是private,public这些玩意,如果是私有的,外面就不能访问,如果是公共的,就允许外面访问,这样我们就很好的控制对象的一些属性,防止一些意外发生,并与其他对象进行联系。二是继承,这是面向对象语言的一个重要的功能,只有能够继承才实现了对象代码的可复用。我们写了一个对象,另外一个对象跟他相似,那我们继承一下就好了,不用多写很多重复的代码。三是多态性,这是面向对象的最灵活的一个特性,同样的函数,调用的方式不同,调用的参数不同,就实现不同的功能。

  从上面的3个特性来看C语言一个都不具备,VB6具备第一个,但剩下的2个不具备,一个语言可能具备面向对象的特性,但并不意味着我们用了面向对象的语言就实现了面向对象的编程,比如你用C++写一个很简单的算法程序,根本用不着上面的特性,即使你用了上面的特性,也并不意味着你就掌握了OOP了,但我们不必要在这个上面绕弯子,只要我们自己觉得好就行,一切从实际出发,如果用VB6能实现就用VB6实现,没什么不可以。

  从我的看法来讲,将来还会有语言向VB6这方面的发展,但可能更高级。谁也说不好,不能说这种模式就是不好的。总有一点,目前这种情况下,VB6写游戏是比较困难的。

  很多人总觉得VB6很好用,VC多难啊,是的,但这是在VB.NET出来以前。VB.NET具有了上面说的3个特点,等会我给个例子,用VB.NET的,根本就没用到上面的特性,但如果你进行扩展,就会发现VB.NET原来这么好用。

  VB.NET是.NET语言的一种,他也有托管代码和非托管代码2种。非托管代码,编写出来的就跟VC一样,编写的时候,你也可以用API函数,直接使用COM,也可以使用.NET Framework。托管代码,你只能使用.NET Framework,尽管还不是很完善,但已经能够满足绝大部分需求了,但有一点就是执行的时候,它是本地代码,这一点要比VB6的半解释型代码快。而且VB.NET的执行效率和编译效率还在不断提高。

  首先一点,我用过6年的VB,我没学过VB.NET,为了写这个例子,我临时学了一点。不对的地方大家指出一起讨论。

VB6和VB.NET语法上的不同

1、有了继承Inherits,我想这一点,一般人能够理解没什么难度,我们写了一个类,继承它就可以直接调用里面的函数。对于多重继承,不要理解的太复杂,一般用不着的,反正多重继承出错了,编译没法通过,改一下就好了,我也不知道VB.NET的多重继承是怎么规定的。

2、有了重载,同一个函数名可以有多种表现和不同的参数,这也好理解

3、委托,这个比较别扭,大家慢慢意会一下,其实很简单,委托就是一种变量类型,这种变量类型是指向一个函数的,比如我们有个函数A想调用另外一个函数,但是不知道函数名,为什么不知道,因为我们还没定义这个函数,经常我们在游戏引擎写了一个函数,比如一个动画放完了,我们想通知用我们引擎的人,怎么办?调用它的一个函数,但是我们引擎还没写好,怎么知道用我们引擎的人写的是个什么函数,没关系,我们定义一个委托类型,调用这个委托就可以了,等引擎写好了,开发者在用我们的引擎的时候,一看这里有个委托,就定义他的函数,然后把这个函数通过委托类型传递进引擎就可以了。
这样说不知道大家明白没有。大家去看看MSDN例子,很详细的。(我还不会用哈哈,所以我没有例子)

4、New,这个关键字在VB6中间也有,但是VB.NET中更接近本来的意思,以前我们在VB6中定义一个变量,自己就有了默认的初始化函数,现在我们通过New能够调用构造函数来实例化一个对象。

5、VB.NET和其他的.NET语言一样,不允许有全局的独立函数,所有的函数都必须在类里面,其实这一点并没有太多的问题,只是理解起来别扭一点而已。VB里面定义一个全局的函数用Shared修饰,凡是用Shared修饰的函数,我们不需要New类的实例就可以调用,比如:
  Public Class A
  Shared a As Integer
  Public Dim b As Integer
  Public Shared Sub f()
  a = 10
  End Sub
  End Class
我们调用的时候只要A.f()就可以了,不需要定义A的实例,但是如果我们访问b变量,不能A.b,必须定义一个实例,比如:

  Dim va As New A
  va.b = 10

但我们同样不能va.f(),这样没有意义。

同时,我们在过程f里不能访问变量b,这也很好理解,因为f是全局的,他实例化的时候,b还没有定义呢。

  那么关于VB.NET的语法我就说到这里,其实稍微理解以下就够用了,等到实际用的时候,再去慢慢查资料慢慢理解,还是比较容易的,因为大部分都是我们熟悉的。
 
下面是一个例子

 


Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D

Public Class Form1
    Inherits System.Windows.Forms.Form

#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 窗体设计器修改此过程。
    '不要使用代码编辑器修改它。
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
        Me.ClientSize = New System.Drawing.Size(292, 273)
        Me.Name = "Form1"
        Me.Text = "Form1"

    End Sub

#End Region

    Dim m_D3DDev As Microsoft.DirectX.Direct3D.Device ' 设备
    Dim m_Sprite As Microsoft.DirectX.Direct3D.Sprite ' 精灵,这个接口对于显示2D图像和文字比较方便
    Dim m_Font As Microsoft.DirectX.Direct3D.Font ' 文字
    Dim m_Tex As Microsoft.DirectX.Direct3D.Texture ' 材质

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '初始化D3D设备
        Try

            'PresentParameters设置一些设备参数,包括显示模式等等
            Dim pp As New PresentParameters
            pp.Windowed = True '窗口模式
            pp.SwapEffect = SwapEffect.Discard
            pp.EnableAutoDepthStencil = True
            pp.AutoDepthStencilFormat = DepthFormat.D16 '16位位深

            '注意第4个参数是一个复合参数,通过Or连接控制一些选项
            m_D3DDev = New Device(Nothing, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, pp)
            If m_D3DDev Is Nothing Then
                MsgBox("生成设备失败")
            End If

            m_Sprite = New Sprite(m_D3DDev)

            '这里我们简单生成了一个字体,关于System.Drawing.Font可以参考GDI+的一些文档
            m_Font = New Font(m_D3DDev, New System.Drawing.Font("隶书", 14))

            Dim ii As ImageInformation
            ii = TextureLoader.ImageInformationFromFile("\rc\btn.png")

            '&HFF00FF00过虑颜色
            m_Tex = TextureLoader.FromFile(m_D3DDev, "\rc\btn.png", _
                ii.Width, ii.Height, 1, Usage.None, Format.Unknown, Pool.Default, Filter.None, Filter.None, &HFF00FF00)
        Catch ex As Exception
            MsgBox(ex.ToString())
        End Try
    End Sub

    Public Sub Render()
        If m_D3DDev Is Nothing Then Exit Sub

        m_D3DDev.Clear(ClearFlags.ZBuffer Or ClearFlags.Target, System.Drawing.Color.FromArgb(255, 0, 0, 128), 0.0, 0.0)
        m_D3DDev.BeginScene()

        m_D3DDev.SetRenderState(RenderStates.ZEnable, True)
        m_D3DDev.SetRenderState(RenderStates.CullMode, Cull.None)
        m_D3DDev.SetRenderState(RenderStates.Lighting, False)

        '设置alpha-blend
        m_D3DDev.SetRenderState(RenderStates.AlphaBlendEnable, True)
        m_D3DDev.SetRenderState(RenderStates.SourceBlend, Blend.SourceAlpha)
        m_D3DDev.SetRenderState(RenderStates.DestinationBlend, Blend.InvSourceAlpha)
        m_D3DDev.SetRenderState(RenderStates.AlphaTestEnable, False)

        '如果是2D和3D混合,要分开渲染
        m_Sprite.Begin(SpriteFlags.None)

        '&H80FFFFFF是对象绘制的颜色
        m_Sprite.Draw2D(m_Tex, New Point(0, 0), 0.0, New Point(20, 40), &H80FFFFFF)

        m_Sprite.End()

        m_Font.DrawText(Nothing, "这是一个VB.NET测试", 10, 10, System.Drawing.Color.White)

        m_D3DDev.EndScene()

        m_D3DDev.Present()
    End Sub

    Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
        Me.Dispose()
    End Sub
End Class

Public Class CMain

    Shared a As Integer

    Public Shared Sub Main(ByVal CmdArgs() As String)
        Dim frm1 As New Form1

        frm1.Show()

        While frm1.Created
            frm1.Render()
            Application.DoEvents()
        End While
    End Sub

End Class
 

  再说一下DX托管库的安装,微软的网站上有一个最新的安装包,但是需要正版的Windows验证,还有一个 DirectX 9c Apri 2005 SDK,这个比较完整,包含了托管库,也不需要验证,文档例子都很全,还有一个最新的 DirectX 9c June 2005 SDK,这个不包含托管的运行库,只有例子和文档。

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 VB.NET下的托管DX9编程入门
本类热点文章
  脚本系统的实现
  C++基本功和 Design Pattern系列(2) Ty..
  C++基本功和 Design Pattern系列(1) - ..
  斜45度游戏开发(提高篇)
  睱酵笴栏祘Α砞璸?? - [秈顶絞]
  斜45度游戏开发(二)
  第一次写技术文献。Collision AI
  斜视角游戏中遮挡的判断
  C语言基本功教程系列(5) - 文件, Socke..
  用rand()和srand()产生伪随机数的方法总..
  C++基本功和 Design Pattern系列(3) co..
  C语言基本功教程系列(1)
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.0059