tamashii 发表于 2010-10-2 00:46:11

[原创]DLM Engine 使用方法

那么下面来说使用方法,一楼献给幻森。

DLM Engine 发布地址:
http://www.rpgchina.net/read-htm-tid-38727.html

tamashii 发表于 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 发表于 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。

看代码:
using System;
using Graphics;
using Audio;
using Input;

namespace DESample
{
    public class Game
    {
        
        public static void Main(string[] args) {
            try {
                Screen.Title = "My 1st Game by DLM Engine"; // 游戏窗口标题
                Screen.FullScreen = true; // 窗口模式
                Screen.SetClientSize(640, 480); // 设置分辨率为 640 x 480
                Screen.Initialize(); // 初始化画面
                Screen.GameWindow.Show(); // 显示游戏窗体
            }
            catch(Exception ex) {
                System.Windows.Forms.MessageBox.Show(ex.ToString(), ex.Message,
                                                     System.Windows.Forms.MessageBoxButtons.OK,
                                                     System.Windows.Forms.MessageBoxIcon.Hand);
            }
            finally {
                Screen.Cleanup(); // 清空
            }
        }
    }
}

tamashii 发表于 2010-10-2 01:33:05

可以看到,有一个窗口出现了,闪了一下就消失了。
那么我们如何让他保持住呢?

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

在17和18行中间插入:
while (Screen.GameWindow.Created) {
    Screen.Update();
}

这样的话,窗体就会保持住,并自动刷新D3D设备。
于是,我们就得到了一个黑色背景的窗口,窗口标题为“My 1st game by DLM Engine”。


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

lw 发表于 2010-10-2 07:46:20

用的是VC#2010 EXPRESS,发现默认会使用.NET 4.0,是不是需要手动修改为2.0呢?

不然好像就直接退出……

最后是不是就可以看到一个黑色的窗口^^?

tamashii 发表于 2010-10-2 22:23:06

不是说了待续么 - -bbb
用的是VC#2010 EXPRESS,发现默认会使用.NET 4.0,是不是需要手动修改为2.0呢?

不然好像就直接退出……

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

如果工程不改成3.5以下的版本的话,则不会支持MDX库。(哭,微软已经放弃MDX了 T T 明明很好用的说……)

tamashii 发表于 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”的图片:
Sprite sprite = new Sprite("a.png", Screen.Foreground);
这里有几点需要特别注意:
默认支持的格式为:png、bmp、jpeg。
如果没有加扩展名就会自己寻找文件,顺序为png=>bmp=>jpeg。
构造函数有两次重载,第一次重载为
Sprite(string filename, Layer layer);
第二次为
Sprite(string filename)
值得注意的是,第二次的重载并不是不需要层,而是默认把精灵放到了前景层里。
综上所述,上面的代码可以简写为:
Sprite sprite = new Sprite("a.png");

如果说想要改变Sprite的位置,则可以给 Sprite 的 X 和 Y  属性赋值,如:
sprite.X = 100;
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包含到层里。
(这个问题我在下个版本也会一并修复。)
Font font = new Font("SimSun", 20, false, false);
font.text = "Hello, world!";
Screen.Foreground.Fonts.Add(font);

lw 发表于 2010-10-3 07:50:47

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

sprite构造代码放在Init之后,Show之前……,奇怪的……

tamashii 发表于 2010-10-3 12:38:28

回 7楼(lw) 的帖子

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

其实Sprite的构造函数放在while(Screen.GameWindow.Created)的前面就行……

tamashii 发表于 2010-10-3 18:33:34

本文章已经不再更新,具体的使用方法将会放在新发布的DLM Engine的doc文件夹里。
页: [1] 2
查看完整版本: [原创]DLM Engine 使用方法