我现在正在为
GenreOnline.com制作一款基于Internet的旋转风格的科幻游戏,叫做Unbound。旋转冒险游戏最重要的部分之一是地图。地图将游戏者旋转时所发出的统计信息图形化,使其更容易被理解。在.NET里,你可以使用图形设备接口+(GDI+)来给图形元素编程——在这种情况下图形元素就是地图。但是熟悉 Visual Studio 6.0里的GDI的开发人员会发现.NET里的GDI+已经相当的不同了。
既然这是个基于旋转的游戏,你就不用实时生成地图——这是很幸运的,因为还有一大堆的信息要表现出来。 图 A显示了我们要转化到像 图 B这样的地图中的信息。 图A 图B
从实质上讲,这一过程调用了四个步骤:
ASP.NET的Web矩阵许多IT的专家惊奇地发现微软已经开始允许.NET的一部分免费使用。ASP.NET的Web矩阵工具是设计用来简化编译简单程序的。点击这里了解如何在你的开发工作中好好利用这个免费的工具。 设计要处理好这四个过程,我们就要向Unbound.MapEngine这个命名空间加入一个叫做MapImage的类。在构造器里,我们将把图像加载到一个GDI+的图形对象里。然后我们加入三个方法:PlaceIcon,WriteTitle,和SaveMap。 这个目标的一部分是简单。除了一些简单的错误处理,我们不会做很复杂的事情。既然这将作为Windows服务的一部分在后台运行,我们就不用太担心性能或者企业服务(Enterprise Services)。 |
代码
<script language=JavaScript1.1 src="http://ad.cn.doubleclick.net/adj/messagingplus.zdnet.com.cn/developer/code;sz=1x1;ord=68959906?"> </script> |
一开始我们就要在Visual Studio .NET里创建一个新的类别库项目。在缺省状态下,这个项目包括了System空间命名;我们同时还要包括GDI+空间命名:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Text;
现在我们需要一些对象来表示图像。首先,我们要抓取一个位图对象,这会加载hex paper,并保存完成的地图。下一步,我们需要一个图形对象,这才是我们使用GDI+操控的真正对象。我们会在类构造器里加载这两个对象:
protected Graphics MapBase;
protected Bitmap newBitmap;
public MapImage()
{
//Load the image up here
newBitmap = new Bitmap("c://map//map.bmp");
MapBase = Graphics.FromImage(newBitmap);
}
PlaceIcon()这个方法会从图标库里取出一个图标(实际上就是我们服务器上地图目录里的一个文件名),再按照指定的坐标把它放在位图对象上:
public void PlaceIcon(float xCoordinate, float yCoordinate,
string iconType)
{
Bitmap iconImage = new Bitmap("c://map//" +
iconType + ".bmp");
MapBase.DrawImage(iconImage,xCoordinate, yCoordinate);
}
要使用WriteTitle()方法,我们就要用到.NET结构紧凑的FontFamily集合中的一个,这给了VB程序员对前台库前所未有的访问权。然后,我们将建立一个新的Front对象,再使用Draw方法集合里的另一个对象来放置文本。
public void WriteTitle(string textToWrite)
{
FontFamily serifFontFamily = new
FontFamily (GenericFontFamilies.Serif);
Font textFont = new Font(serifFontFamily, 12);
MapBase.DrawString(textToWrite,textFont,
new solidBrush(Color.Black),
new RectangleF(100, 100, 250, 350));
}
最后,我们要使用位图对象的实例把图像保存为文件。然后我们就可以释放内存里的位图和图形对象:
public void SaveMap(string fileName)
{
newBitmap.Save("c://map//" + fileName +
".bmp", ImageFormat.Bmp);
newBitmap.Dispose();
MapBase.Dispose();
}
结论
System.Drawing命名空间里的GDI+类为Windows程序员提供了以先前版本的VB,甚至是C++里所缺少的重要功能。虽然C++程序员可以用其绘图,但是会更加复杂。GDI+所提供的功能能让你创建复杂的效果,向你展示Windows世界类别库开发的新空间。