CSDN博客

img xmlscript

通过游戏的地图介绍GDI+

发表于2004/11/3 12:13:00  967人阅读

        我现在正在为GenreOnline.com制作一款基于Internet的旋转风格的科幻游戏,叫做Unbound。旋转冒险游戏最重要的部分之一是地图。地图将游戏者旋转时所发出的统计信息图形化,使其更容易被理解。在.NET里,你可以使用图形设备接口+(GDI+)来给图形元素编程­­——在这种情况下图形元素就是地图。但是熟悉 Visual Studio 6.0里的GDI的开发人员会发现.NET里的GDI+已经相当的不同了。

        既然这是个基于旋转的游戏,你就不用实时生成地图——这是很幸运的,因为还有一大堆的信息要表现出来。A显示了我们要转化到像B这样的地图中的信息。

图A

点击放大
数据模型的一个子集

图B


点击放大
完成的Unbound地图

从实质上讲,这一过程调用了四个步骤:

  1. 打开Open)一个地图用的模板——基本上是六边形图。
  2. 将图标放置Place)到地图上的正确位置。
  3. 在地图上写上Write)标题。
  4. 将地图保存Save)到Web服务器上供使用。
ASP.NET的Web矩阵

        许多IT的专家惊奇地发现微软已经开始允许.NET的一部分免费使用。ASP.NET的Web矩阵工具是设计用来简化编译简单程序的。点击这里了解如何在你的开发工作中好好利用这个免费的工具。

设计

        要处理好这四个过程,我们就要向Unbound.MapEngine这个命名空间加入一个叫做MapImage的类。在构造器里,我们将把图像加载到一个GDI+的图形对象里。然后我们加入三个方法:PlaceIconWriteTitle,和SaveMap

       这个目标的一部分是简单。除了一些简单的错误处理,我们不会做很复杂的事情。既然这将作为Windows服务的一部分在后台运行,我们就不用太担心性能或者企业服务(Enterprise Services)。

代码

        一开始我们就要在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世界类别库开发的新空间。

阅读全文
0 0

相关文章推荐

img
取 消
img