设为首页收藏本站喵玉殿官方微博

 找回密码
 少女注册中
搜索
查看: 7517|回复: 3

[教程图书] DX Library和VB .NET的邂逅 ~ 如何在VB .NET下使用DxLib

[复制链接]
发表于 2014-12-8 19:48:35 | 显示全部楼层 |阅读模式
本帖最后由 drzzm32 于 2014-12-9 10:09 编辑

在这之前的:
    如果不知道什么是DX Library,请看技术区的DX Library翻译帖:
    http://bbs.nyasama.com/forum.php?mod=viewthread&tid=42912
    以下教程都是默认你有一定的VB .NET开发经验,基础的话,先看书吧。
    如果想学进阶的,看上面的翻译帖。

然后是资源链接: DxLibDotNet.exe (177.5 KB, 下载次数: 291) DxLibDotNet.7z.001 (1000 KB, 下载次数: 317) DxLibDotNet.7z.002 (1000 KB, 下载次数: 332) DxLibDotNet.7z.003 (773.4 KB, 下载次数: 327)
等下我看看附件限制是多大。。。1MB啊。。。主要是不想补档什么的。。。

以上就是DX Library的.NET版本了。
文件夹里面有源代码,是用C++写的DLL来调用DirectX API。
以下是DxLibDotNet目录结构:
DxLibDotNet
│ DxDLL.cs
│ DxLib.dll
│ DxLibDotNet.dll
│ DxLib_x64.dll
│ readme.txt

└─Source
        DxDLL.cpp
        DxDLL.def
        DxDLL.h
        MakeDxLibDLLSource.cpp
        TextAnalyse.cpp
        TextAnalyse.h

其中的DxLib.dll,DxLib_x64.dll根据你的使用设备架构来复制到输出目录(就是程序的运行目录下),推荐是都复制。
DxLibDotNet.dll也是必要的文件,这个不分架构,必须复制过去。
后面会具体说明这三个文件的处理。

然后还有。。。我的游戏引擎源码(部分),这玩意似乎在技术群里。。。嘛我等下直接复制上来。

那么,开。。。等下,你的开发环境。。。注意这教程是给VB .NET的,因此你需要Visual Studio 2005以上或VB2010。
因此VB6是没法用的。
那么:
    虽然有DirectX for Managed Code,但是,DX Library的简易程度是显而易见的。
    不要随意喷。并且这玩意是自己查对象浏览器研究出来的,当前的FPS最高只能达到并稳定在40。
    使用前注意。

开始吧。

1.png
首先新建项目,其实框里三种都可以,这里选第一种。

2.png
然后,看右边的解决方案资源管理器。

3.png
向项目目录里添加现有项。

4.png
定位到你下载的资源的目录,添加那三个DLL文件。

5.png
然后就这样子了。

6.png
选择这三个文件,并设置总是复制到输出目录。

7.png
然后添加引用。

8.png
9.png
点浏览,添加外部引用。

10.png
这里的话可以是你的项目目录,或者是你下载的解压目录。
最好解压在一个不错的路径里。
选择DxLibDotNet.dll添加进去。


11.png
这里左边要打勾。

12.png
13.png
另外这里,如果你像兼容XP,就把目标框架选成版本4.0及以下的。
推荐4.0,可能低版本会没有些你需要的特性。

14.png
在需要使用的代码文件的头部导入命名空间。
就可以使用了。
也可以直接用DxLibDLL.使用。

15.png
此时这个Form更多是一个启动器而已。
因为绘制的话是会重新创建一个窗口的。
记得把启动器隐藏下喔。

16.png
比如我的这个玩意。
地址:http://bbs.nyasama.com/forum.php?mod=viewthread&tid=40596
现在正在做SDK。。。但是难度会比引擎大。。。

17.png
注意所有绘制的代码都需要在这么一个循环里执行。
或者放在Timer里面。
其实OpenGL和其他的图形API都是这样,连续绘制形成动画。

值此,这个简单的引导就差不多了。详细的,还是看那个翻译帖吧~

以上。





注释被吃了啊啊啊啊啊啊啊啊啊




什么你还想知道什么?额。。。好吧。。。我再说下我认为的DxLib的基础代码和程序结构。。。
以下代码均在命名空间DxLibDLL.DX下,而且代码介绍顺序就是我认为的运行顺序(这顺序不能换!我试了很多次的!)
具体参数数据类型啊,函数原型啊,自己查看对象浏览器。。。

  1. DxLibDLL.DX.SetWindowIconHandle(Handle)
复制代码
图标资源的句柄,可以通过My.Resources.Resources.Icon.Handle获得,或者其他方法。

  1. ChangeWindowMode(Flag)
复制代码
Flag取0,为全屏,1为窗口。

  1. DxLibDLL.DX.SetWindowSize(Width, Height)
复制代码
绘制窗口大小,和下面的函数有关。这里的大小小于下面的函数设置的大小的话,会进行缩放。

  1. DxLibDLL.DX.SetGraphMode(Width, Height, Color)
复制代码
图形绘制固有大小,和坐标系有关,颜色深度貌似只能取32。比如弹幕天邪鬼的标准分辨率是1280x960然而你也可以选择640x480。
前者是设置的SetGraphMode,后者就是上面那个WindowSize了。

  1. DxLibDLL.DX.SetWindowText(Title)
复制代码
窗口标题文字。

  1. DxLibDLL.DX.DxLib_Init()
复制代码
窗口加载,上面设置完了就执行这个语句加载绘制窗口。

下面是绘制循环:

  1. Do
  2.         MainCircle() '这Sub里就是绘制函数,这个循环可以放在某个Button触发的Sub里。
  3.         DxLibDLL.DX.WaitTimer(5) '如果你把绘制函数放在Timer里就不需要这些东西了。
  4.         Loop Until DxLibDLL.DX.ProcessMessage = -1 'Timer里需要注意对这个函数的使用。
复制代码

  1. DxLibDLL.DX.ProcessMessage
复制代码
这个函数返回值为-1代表绘图窗口被关闭,所以需要处理下这个消息,退出绘制循环。

  1. DxLibVB.DxEnd()
复制代码
所有绘图函数结束并退出循环后,执行这个语句,清理资源。

下面是绘制循环函数:

  1. DxLibDLL.DX.ScreenFlip() '翻转调色板,具体意义嘛,不好解释,自己要系统学习了DirectX才会知道。
  2. DxLibDLL.DX.ClearDrawScreen() '清除绘制区域。
复制代码

还是解释下吧:
    比如一个双面画板,你先翻转,清除你面对的那面,另一面面对观众。然后你绘制。
    绘制结束后循环跳转到开始,再次翻转,有画的那面就面向观众了,另外一面你清理下接着画,如此循环。
    这样提高了绘制的效率,类似GDI+里的双缓存。

  1. DxLibDLL.DX.DrawGraph() '绘制图片的函数,因为这函数重载了接近20次,具体还是看对象浏览器吧。
复制代码

  1. DxLibDLL.DX.DrawString() '绘制字符的函数,这函数也重载了很多次,同上。现在我在纠结字体句柄的问题。。。
复制代码


对了还有图片加载呢,诶嘿嘿嘿。。。

  1. DxLibDLL.DX.LoadGraph(Path)
复制代码
路径是绝对路径。

其他高深的函数。。。我还没研究到。。。尤其是它这个3D。。。Z轴在哪里啊。。。Z轴坐标定义是什么节奏啊。。。

这次真的完了。。。嗯,第一个大的教程帖呢。。。

 楼主| 发表于 2014-12-8 19:51:13 | 显示全部楼层
本帖最后由 drzzm32 于 2014-12-8 20:12 编辑

来个福利。。。自己再次封装的一个类。。。这个就没注释了。。。福利嘛。。。
  1. Public Class DxLibVB

  2.                 Public Structure Images
  3.                     Public Handle As Integer
  4.                     Public Width As Integer
  5.                     Public Height As Integer
  6.                 End Structure

  7.                 Public Shared Sub DxSetIcon(ByVal Handle As Integer)
  8.                     DxLibDLL.DX.SetWindowIconHandle(Handle)
  9.                 End Sub

  10.                 Public Shared Sub DxInit(ByVal Title As String, Optional ByVal IsFullScreen As Boolean = False, Optional ByVal Width As Integer = 640, Optional ByVal Height As Integer = 480)
  11.                     If IsFullScreen Then
  12.                         DxLibDLL.DX.ChangeWindowMode(0)
  13.                     Else
  14.                         DxLibDLL.DX.ChangeWindowMode(1)
  15.                     End If
  16.                     DxLibDLL.DX.SetWindowSize(Width, Height)
  17.                     DxLibDLL.DX.SetGraphMode(1920, 1080, 32)
  18.                     DxLibDLL.DX.SetWindowText(Title)
  19.                     DxLibDLL.DX.SetDisplayRefreshRate(60)
  20.                     If DxLibDLL.DX.DxLib_Init() = -1 Then
  21.                         End
  22.                     End If
  23.                 End Sub

  24.                 Public Shared Sub DxEnd()
  25.                     DxLibDLL.DX.DxLib_End()
  26.                 End Sub

  27.                 Public Shared Function LoadTexture(ByVal IsRelativePath As Boolean, ByVal Path As String, ByRef Image As Images) As Boolean
  28.                     If Not Path = "" Or Not Path = Nothing Then
  29.                         If IsRelativePath Then
  30.                             If FileSystem.Dir(Application.StartupPath & Path) <> "" Then
  31.                                 Image.Handle = DxLibDLL.DX.LoadGraph(Application.StartupPath & Path)
  32.                                 Dim ImgTep As Bitmap = New Bitmap(Application.StartupPath & Path)
  33.                                 Image.Width = ImgTep.Width
  34.                                 Image.Height = ImgTep.Height
  35.                                 ImgTep.Dispose()
  36.                                 Return True
  37.                             Else
  38.                                 Return False
  39.                             End If
  40.                         Else
  41.                             If FileSystem.Dir(Path) <> "" Then
  42.                                 Image.Handle = DxLibDLL.DX.LoadGraph(Path)
  43.                                 Dim ImgTep As Bitmap = New Bitmap(Path)
  44.                                 Image.Width = ImgTep.Width
  45.                                 Image.Height = ImgTep.Height
  46.                                 ImgTep.Dispose()
  47.                                 Return True
  48.                             Else
  49.                                 Return False
  50.                             End If
  51.                         End If
  52.                     Else
  53.                         Return True
  54.                     End If
  55.                 End Function

  56.                 Public Shared Sub DrawPic(ByVal Image As Images, ByVal x As Single, ByVal y As Single)
  57.                     DxLibDLL.DX.DrawGraphF(x - (Image.Width / 2), y - (Image.Height / 2), Image.Handle, 1)
  58.                     'DxLibDLL.DX.DrawGraphF(x, y, Image.Handle, 1)
  59.                 End Sub
  60.                 Public Shared Sub DrawPicR(ByVal Image As Images, ByVal Angle As Double, ByVal ExRate As Double, ByVal x As Single, ByVal y As Single, Optional ByVal z As Single = 0)
  61.                     DxLibDLL.DX.DrawRotaGraph3D(x - Image.Width / 2, y - Image.Height / 2, z, ExRate, Angle, Image.Handle, 1)
  62.                 End Sub

  63.             End Class
复制代码




看了下日文的文档,貌似VB .NET调用这玩意效率不高?谁试试在Timer内调用?


问题找到了!!
需要在进入绘制循环之前调用这个函数:
  1. DxLibDLL.DX.SetDrawScreen(DxLibDLL.DX.DX_SCREEN_BACK)
复制代码



回复

使用道具 举报

 楼主| 发表于 2014-12-10 21:18:51 | 显示全部楼层
今天补充一下。。。
VB .NET里绘制MMD模型的时候貌似纹理加载有问题。。。不知道是文件名的问题还是什么问题。。。
C++版本的没问题
回复

使用道具 举报

发表于 2014-12-27 01:41:14 | 显示全部楼层
其中的問題是: 單憑函數的名稱,不能推測出其功能,而且可以看出函數呼叫的次序,也有可能是既定

我找不到這樣的說明....難道是沒有翻譯?
或者, 是否能夠從微軟範例中查出其功能﹑特性?

点评

注意,DX Library是一日本游戏作者写的库,并非微软的。因为这个库内含窗口加载函数,因此部分对窗口设置的代码必须在Init之前。具体可以下载它的源代码,看看如何封装的。前提是你会日文  发表于 2014-12-27 10:06
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 少女注册中

本版积分规则

合作与事务联系|无图版|手机版|小黑屋|喵玉殿

GMT+8, 2025-10-31 14:54

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表