VB.NET实现DirectDraw9 (1) 托管的DDraw

关键字: 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<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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混音好像很麻烦.....

posted on 2005-12-31 17:45 a11s.net 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/a11s/archive/2005/12/31/309082.html

VB.NET实现DirectDraw9 (1) 托管的DDraw相关推荐

  1. VS生成桌面应用程序

    1.简介 1/ 什么是WPF WPF,Windows Presentation Foundation也,译过来就是"Windows呈现基础",你看它的目的非常明确,就是用来把数据& ...

  2. VB.NET实现DirectSound9 (7) 录音

    关键字: VB.NET DirectX 9 DirectSound 录音 riff文件格式 作者:董含君 下午看了微软提供的例子,居然把录音定位成Beginner级别 晕哦,虽说我认为这个例子是微软提 ...

  3. 【CLR的执行模型:将源代码编译成托管模块】

    CLR:由多种不同编程语言使用的运行库 托管模块:中间语言和元数据 非托管语言:C/C++,不过此为特殊,可以写成托管代码 托管语言:C# 托管模块 1,PE32/PE32+头:PE32运行在win3 ...

  4. 调试JavaScript/VB Script脚本程序(IE篇)

    JavaScript/VB Script脚本程序一般有两种执行方式,一种是嵌入在宿主程序里面执行,比如在IE浏览器里面执行:另外一种,在资源管理器里面双击执行(虽然还是通过另外一个程序解释执行,但是给 ...

  5. 您也使用托管C++吗?

    转向.NET后,手头上往往仍有旧的模块要重用.也许这些模块是Delphi写的,也许是C/C++写的,或者是其它编程语言--为了能把它们移植到.NET下,或者是在.NET中调用,To be or not ...

  6. vb.net2019-多线程并行计算(4)

    三.栈内存 1.每个WINDOWS都有一个栈基址和栈限址,二者合在一起表示栈的有效内存范围.栈限址不是固定的,程序需要更多内存空间里,栈限址没有超过保留的栈内存范围,则可以要求更多的内存页 2.在栈限 ...

  7. .net随笔-vb.net打开外部程序发送键盘信号(2)

    调用 Windows Api indows Api 是动态链接库 (Dll) 的 Windows 操作系统的一部分. 您可以使用它们来执行任务时很难编写你自己的等效过程. 例如,Windows 提供了 ...

  8. Win2D 入门教程 VB 中文版 - 防止内存泄漏

    避免内存泄漏 本文从微软官方文档翻译 http://microsoft.github.io/Win2D/html/RefCycles.htm 如果文档有问题,可以在 https://github.co ...

  9. 编写高性能的托管应用程序:入门

    编写高性能的托管应用程序:入门 发布日期: 6/15/2004 | 更新日期: 6/15/2004 Gregor Noriskin Microsoft CLR 性能小组 适用于:Microsoft . ...

最新文章

  1. 解决android引用library project错误
  2. 软件使用: word
  3. java ReentrantLock 实现原理
  4. 使用Apple的感受
  5. python程序员工作时间_Python程序员是怎么找工作的?怎么最快时间找到自己想要的工作?...
  6. 一个很好地List实现源码
  7. 获取成员函数地址及获取函数地址
  8. 1151 LCA in a Binary Tree 甲级
  9. oracle sql2000,sql2000的代码改成oracle的
  10. win10+Ubuntu16.04双系统安装——史上最稳总结,排除一切花里花哨
  11. 动态插入图片到 svg 中
  12. 全世界都误会我们了。。。。。。。。
  13. Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率..
  14. bt tracker服务器 相关内容
  15. Office2010安装出错(Error1406)
  16. 潜在语义分析(LSA)
  17. 通过C#Microsoft.Office.Interop.Word理解互操作性
  18. 用U盘重装Win7系统方法
  19. Python递归获取指定文件夹下的所有文件夹、文件
  20. SNR、BER、Eb/N0之间的区别与联系

热门文章

  1. mysql数据库充值网站程序_MySQL数据库安装
  2. 基于Linux下嵌入式网关,基于嵌入式Linux系统的无线网络网关设计
  3. java term_[ElasticSearch]Java API 之 词条查询(Term Level Query)
  4. hystrix是什么?
  5. 织入业务代码-ModifyService
  6. EasyExcel读写Excel的基本使用
  7. 上传图片-服务端-创建文件系统服务工程
  8. TortoiseSVN操作
  9. visualSVN仓库创建及操作
  10. 文件操作-使用readline分行读取大文件