幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 5393|回复: 12

[原创]DLM Engine 使用方法

[复制链接]

24

主题

117

帖子

1274

积分

⑥精研

积分
1274
QQ
发表于 2010-10-2 00:46:11 | 显示全部楼层 |阅读模式
那么下面来说使用方法,一楼献给幻森。

DLM Engine 发布地址:
http://www.rpgchina.net/read-htm-tid-38727.html
Tamashii是啥意思? 魂! ======================= 我真是败给C++的面向对象了啊……
回复

使用道具 举报

24

主题

117

帖子

1274

积分

⑥精研

积分
1274
QQ
 楼主| 发表于 2010-10-2 00:47:59 | 显示全部楼层
开发环境:
.Net版本:2.0
Sharp Develop 4.0(.Net 2.0工程)

首先来讲一下每个DLL的用处:
Microsft打头的DLL都是MDX的库文件。
Graphics.dll:图形引擎
Audio.dll:声音引擎
Input.dll:输入引擎

然后逐一讲解

首先是Graphics:
版本:1.0.4
Graphics中包含一个静态类,五个成员类。
静态类:
Screen:画面的类,主要的画面操作以及系统图层的定义。
成员类:
Color:颜色的类。这里我用的方法是记录ARGB的方法。
Sprite:图形的类。可以用Sprite.Render()进行渲染。
Font:文字的类。可以用Font.Update()进行渲染文字。
GameWindow:游戏窗体。通常意义上来说,游戏窗体有一个就足够了,在Screen类中有GameWindow的定义。
Layer:图层。每一个层可以包含多个图形和字体。字体是被画在图形上面的。在Screen类中有5个系统层,将会在稍后介绍。

然后是Audio:
版本:1.0.0
Audio中包含一个静态类,两个成员类。
静态类:
AudioPlayer:播放的类,里面定义了一个Music和一个Sound。
成员类:
Music:背景音乐。
Sound:前景音乐。

最后是Input:
版本:1.00
Input中包含两个静态类。
Keyboard:键盘输入处理类。
Mouse:鼠标输入与鼠标坐标类。
Tamashii是啥意思? 魂! ======================= 我真是败给C++的面向对象了啊……
回复 支持 反对

使用道具 举报

24

主题

117

帖子

1274

积分

⑥精研

积分
1274
QQ
 楼主| 发表于 2010-10-2 01:19:33 | 显示全部楼层
使用方法:

首先是如何建立一个基本的框架。
1.新建一个Windows窗体工程,先把工程转换成.Net Framework 3.5 之前的版本,再把里面的代码文件全都删掉(AssemblyInfo.cs 就不要删除了),如图。(我的开发工具是 Sharp Develop,其他的开发工具基本上也差不多。)
  
2.添加引用。把 Graphics、Audio、Input 这几个DLL引用进来。如果没有安装 MDX 的话,也要把 Microsoft 打头的DLL 引用进来。如图。
  
3.新建一个类,起名叫Game。
  
看代码:
  1. using System;
  2. using Graphics;
  3. using Audio;
  4. using Input;
  5. namespace DESample
  6. {
  7.     public class Game
  8.     {
  9.         [STAThread]
  10.         public static void Main(string[] args) {
  11.             try {
  12.                 Screen.Title = "My 1st Game by DLM Engine"; // 游戏窗口标题
  13.                 Screen.FullScreen = true; // 窗口模式
  14.                 Screen.SetClientSize(640, 480); // 设置分辨率为 640 x 480
  15.                 Screen.Initialize(); // 初始化画面
  16.                 Screen.GameWindow.Show(); // 显示游戏窗体
  17.             }
  18.             catch(Exception ex) {
  19.                 System.Windows.Forms.MessageBox.Show(ex.ToString(), ex.Message,
  20.                                                      System.Windows.Forms.MessageBoxButtons.OK,
  21.                                                      System.Windows.Forms.MessageBoxIcon.Hand);
  22.             }
  23.             finally {
  24.                 Screen.Cleanup(); // 清空
  25.             }
  26.         }
  27.     }
  28. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Tamashii是啥意思? 魂! ======================= 我真是败给C++的面向对象了啊……
回复 支持 反对

使用道具 举报

24

主题

117

帖子

1274

积分

⑥精研

积分
1274
QQ
 楼主| 发表于 2010-10-2 01:33:05 | 显示全部楼层
可以看到,有一个窗口出现了,闪了一下就消失了。
那么我们如何让他保持住呢?

可以给窗口写一个主循环。

在17和18行中间插入:
  1. while (Screen.GameWindow.Created) {
  2.     Screen.Update();
  3. }
复制代码
这样的话,窗体就会保持住,并自动刷新D3D设备。
于是,我们就得到了一个黑色背景的窗口,窗口标题为“My 1st game by DLM Engine”。
  

接下来讲一下代码的内容。
  1. Screen.Title = "My 1st Game by DLM Engine";
复制代码
这段代码是更改游戏的标题。
  1. Screen.FullScreen = true;
复制代码
这段代码是使用窗体模式。如果想用全屏模式请使用:
  1. Screen.FullScreen = false;
复制代码
(全屏模式会出现输入无效的BUG……正在查找原因中……)
  1. Screen.SetClientSize(640, 480);
复制代码
这行代码用来设置分辨率为640 x 480。数字可以随便改,但如果使用全屏模式的话,则必须是标准的屏幕分辨率。
  1. Screen.Initialize();
复制代码
初始化画面,包括窗体和几个系统层的初始化。
  1. Screen.GameWindow.Show();
复制代码
显示游戏窗体。在初始化之后窗体不会自动显示,所以需要手动显示。
  1. while (Screen.GameWindow.Created) {
  2.     Screen.Update();
  3. }
复制代码
这段代码的作用就相当于VC中的while(GetMessage(&msg, NULL, 0, 0)),不过不同的是,你不必为他写消息处理。并且在窗口显示的时候返回true,否则为false。
  1. Screen.Cleanup();
复制代码
回收过程中产生的垃圾。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Tamashii是啥意思? 魂! ======================= 我真是败给C++的面向对象了啊……
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2010-10-2 07:46:20 | 显示全部楼层
用的是VC#2010 EXPRESS,发现默认会使用.NET 4.0,是不是需要手动修改为2.0呢?

不然好像就直接退出……

最后是不是就可以看到一个黑色的窗口^^?
Style-C
回复 支持 反对

使用道具 举报

24

主题

117

帖子

1274

积分

⑥精研

积分
1274
QQ
 楼主| 发表于 2010-10-2 22:23:06 | 显示全部楼层
不是说了待续么 - -bbb
用的是VC#2010 EXPRESS,发现默认会使用.NET 4.0,是不是需要手动修改为2.0呢?

不然好像就直接退出……

这点我忘了说了,谢谢提醒。

如果工程不改成3.5以下的版本的话,则不会支持MDX库。(哭,微软已经放弃MDX了 T T 明明很好用的说……)
Tamashii是啥意思? 魂! ======================= 我真是败给C++的面向对象了啊……
回复 支持 反对

使用道具 举报

24

主题

117

帖子

1274

积分

⑥精研

积分
1274
QQ
 楼主| 发表于 2010-10-3 01:19:53 | 显示全部楼层
那么今天来讲Graphics库。

说到Graphics库,最主要的就是Screen类了。它里面包含了很多静态的方法、属性和变量,都是游戏开发必不可少的。
类:Screen [
公有对象:
Background(Layer):背景层
Foreground(Layer):前景层
Message(Layer):消息层
Menu(Layer):菜单层
System(Layer):系统层
Initialize()(void):初始化
Cleanup()(void):清空
SetClientSize(int x, int y)(void):设置工作区大小
Update()(void):更新画面
FullScreen(bool):是否使用全屏模式
GameWindow(GameWindow):默认游戏窗体
ScreenWidth(int, readonly):屏幕宽度
ScreenHeigt(int, readonly):屏幕高度
ShowCursor(bool):是否显示鼠标指针
Title(string):游戏标题
]
其中
SetClientSize()、FullScreen、Title 只能在 Initialize 之前调用或赋值。

那么在游戏中如何去显示一张图片呢?
我们可以用Sprite来实现。
类:Sprite [
公有对象:
Render()(void):渲染当前的精灵(自动实现)。
Dispose()(void):注销当前的精灵。
BlendType:精灵的合成方式(未能实现)。
X、Left:精灵的X位置。
Y、Top:精灵的Y位置。
Width:精灵渲染时的宽度。
Height:精灵渲染时的高度。
Right:精灵的右侧的X位置。
Bottom:精灵的底下的X位置。
Hue:精灵的色调。
]
要显示图片,可以先生成一个精灵。
精灵的生成是需要层(Layer)的。
在Screen当中有了系统层的定义,那么这里我们直接调用就可以了。
比如,要在前景层显示一个叫做“a.png”的图片:
  1. Sprite sprite = new Sprite("a.png", Screen.Foreground);
复制代码
这里有几点需要特别注意:
默认支持的格式为:png、bmp、jpeg。
如果没有加扩展名就会自己寻找文件,顺序为png=>bmp=>jpeg。
构造函数有两次重载,第一次重载为
  1. Sprite(string filename, Layer layer);
复制代码
第二次为
  1. Sprite(string filename)
复制代码
值得注意的是,第二次的重载并不是不需要层,而是默认把精灵放到了前景层里。
综上所述,上面的代码可以简写为:
  1. Sprite sprite = new Sprite("a.png");
复制代码

如果说想要改变Sprite的位置,则可以给 Sprite 的 X 和 Y  属性赋值,如:
  1. sprite.X = 100;
  2. sprite.Y = 100;
复制代码
那么当该Sprite再次被渲染的时候则会显示在这个位置。
Hint:
Sprite现在的缺点:无法将图片文件在中途改变。这个问题将会在下次的版本中修正。
关于图片重叠问题:由于精灵是逐个渲染的,所以先初始化的精灵会被后初始化的精灵覆盖。

那么,有了图片了,如果还需要显示文字怎么办?
这时则可以使用 Font  类。
类:Font [
公有对象:
Color(Color):字体的颜色。
Text(string):文字内容。
X(int):X 位置。
Y(int):Y位置。
Update()(void):刷新当前文字(自动完成)。
]
由于Font类没有像Sprite那样的构造函数,所以就无法轻易的注销。
并且,文字生成出来之后,应该用Layer.Fonts.Add包含到层里。
(这个问题我在下个版本也会一并修复。)
  1. Font font = new Font("SimSun", 20, false, false);
  2. font.text = "Hello, world!";
  3. Screen.Foreground.Fonts.Add(font);
复制代码
Tamashii是啥意思? 魂! ======================= 我真是败给C++的面向对象了啊……
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2010-10-3 07:50:47 | 显示全部楼层
不知道怎么放置资源文件夹……
尝试了把自己的.PNG文件放在DEBUG目录下,还有工程目录下,总是提示有异常发生,顺便问一下C#默认的res加载路径是哪里- -?在工程的属性下面直接指定了全局路径居然也没有作用……

sprite构造代码放在Init之后,Show之前……,奇怪的……
Style-C
回复 支持 反对

使用道具 举报

24

主题

117

帖子

1274

积分

⑥精研

积分
1274
QQ
 楼主| 发表于 2010-10-3 12:38:28 | 显示全部楼层

回 7楼(lw) 的帖子

你的exe放在哪儿,你的图片就放在哪儿,他会自动寻找exe的根目录。

其实Sprite的构造函数放在while(Screen.GameWindow.Created)的前面就行……
Tamashii是啥意思? 魂! ======================= 我真是败给C++的面向对象了啊……
回复 支持 反对

使用道具 举报

24

主题

117

帖子

1274

积分

⑥精研

积分
1274
QQ
 楼主| 发表于 2010-10-3 18:33:34 | 显示全部楼层
本文章已经不再更新,具体的使用方法将会放在新发布的DLM Engine的doc文件夹里。
Tamashii是啥意思? 魂! ======================= 我真是败给C++的面向对象了啊……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-19 06:44 , Processed in 0.025289 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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