1、 在上一节中,我们实现了地图牵引式移动,同时还遗留着一个小尾巴:主角和障碍物该如何跟随着地图的移动而移动?上节中有点到,只要在地图移动的同时,时时根据主角等对象物体的 X,Y 坐标进行相对于地图的 X,Y 坐标移动即可达到目的。但是由此又引来了新问题:主角为 Image 控件,障碍物则为矩形控件,它们都没有 X,Y 这两个属性,我们该如何对它们的坐标进行记录呢?最简单且最直接的方法莫过于将它们的 X,Y 坐标通过分隔符连接然后记录进 Tag 属性中,在调用的时候再将它分离取出。例如我们可以在构建障碍物的时候这样做:/构建障碍物(本节只为演示,随便建一个)for (int y = 11; y 代
2、码很简单,我先定义一个名为 Spirit 的 Canvas 主布局控件(为了方便自由定位它内部的其他子控件,所以在选择上我依然使用我钟爱的 Canvas。当然,你也可以使用别的布局控件作为主控件)。然后在它的内部建立一个名为 Body 的 Image 子控件,它就是精灵的身体啦(也就是我们前面章节中一直使用着的 Image Spirit=new Image())。游戏中的精灵不光只有身体部分,还包括关于它的很多附加信息显示在周围:例如名字、帮派、家族等等。在上面代码中,我将这 3 个描述精灵身份的文字控件放在一个名为 Describtion,类型为 StackPanel 的布局控件(该布局控件
3、特点为可以轻松的排列子控件)中并且稍微调整一下它的位置以便在角色身体上方合适的位置显示(Canvas.Top=“-21“)。而这 3 个描述身份的文字控件均为我事先写好的带描边的名为 BorderText 的控件,该控件同样编译封装在项目源码中的 Dll 文件夹中的 QX.dll 中。在WPF/Silverlight 中要引用程序集中的控件,必须在 xaml 开头申明它。因此,我们需要在UserControl 中写这样一句申明:xmlns:QXControl=“clr-namespace:QX.Game.Controls;assembly=QX“,其中 QXControl 为下文中引用该控件时
4、需要申明的前缀名称,clr-namespace 和 assembly 这两个词应该不用再解释了吧,会编程的人都应该知道。需要特别说明的是:这么几个字,用 TextBlock 或 Label 现成的控件不就行了,何必要劳师动众那么夸张自己去写个控件来实现?对 WPF/Silverlight 中的中文字有一定了解的朋友都知道,在WPF/Silverlight 中,文字都是矢量的,它在显示时被处理过(仿佛像是 Photoshop 中的文字锐利效果),因此显得模糊不清。例如假设我将本例的 3 个描述身份控件全用 TextBlock 来替换,那么效果将如下图:我们可以很清晰的看到,在位图中 12 像素的
5、字是不会显示成这样的;但是在WPF/Silverlight 中,它的效果看上去是带模糊。而我在 QXControl:BorderText 控件中添加了一个Stroke 属性和一个 StrokeThickness 属性,它们分别用来设置文字的描边线颜色和描边线粗细。并且 StrokeThickness 是 double 型,这样我就可以以任意想要的粗细对文字描边进行设置了。在上文代码中,我将之设置为 0.1,这样显示出来的效果如下图:虽然还无法达到最好的效果,但比起普通无描边的文字来说会美化些。由于文字只有 12 像素大小,在它上面描边无法很清晰的显示。因为,为了让大家更好理解 WPF/Silv
6、erlight 中TextBlock 和 QXControl:BorderText 文字效果区别,我分别在这两个控件中输入“深蓝色”3 个字,48 像素,其中 QXControl:BorderText 以黑色 1.5 像素描边(该控件默认字体为“微软雅黑”),得到以下效果比较图:左边为创建的,右边为创建的,不用我说大家都会明白谁更幽雅漂亮了吧?更可贵的是,它提供了另一种 WPF/Silverlight 中关于中文字体模糊的解决方案。因此,在后面的游戏设计中,我将以QXControl:BorderText 作为主要的文字控件使用。呼呼,到此终于将我们可爱的精灵控件界面 xaml 代码写完,剩下的就是在 Behind 代码中丰富精灵的内部了。在下一节中,我将就精灵控件后台代码及上一节中遗留的问题:在地图移动中,主角(精灵)与障碍物如何跟随移动进行讲解,敬请关注。