C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十二)制作精美的Mini地图②
前面章节中讲解的包括对象头像面板、Mini雷达地图等窗体都是位置固定的,在处理起来方式多样且简单;而RPG、SLG、休闲养成等类型的游戏中往往会大量使用到悬浮且可自由拖动的窗体,比如包裹面板、武器装备面板、个人属性面板、技能面板、系统设置面板等等,这就要求我们必须为游戏量身定做一个通用且易用的ChildWindow控件。那么本节我将为大家讲解如何制作一个包含可拖动头部、关闭按钮及内容主体3大部件高自由度的自定义ChildWindow控件,并用它来实现Mini寻路地图。
首先,我们需要确定该ChildWindow的功能需求,从布局上说包含上述3大部分,且这3部分都是可以用任意对象来实现的,这样才能实现高度拓展;从功能上说,ChildWindow可在游戏窗口中任意拖动,且多个ChildWindow实例之间同样存在一个可协调的层次关系,这方面内容大家可以参考我关于ChildWindow的另一篇文章;从整体结构上说,ChildWindow即可以与游戏中与对象轻松交互,同时也不能影响到游戏中其它对象的活动。
那么接下来进入实质性设计阶段,此时我们有3条路可以选择:
1)通过底层的继承来实现。例如新建一个BaseWindow.cs类文件,然后让之继承Control或ContentControl或UserControl等均可,并通过代码添加并布局好各部分控件,同时实现各部分应有的功能事件,最后让this.Content=总的布局控件或其它方式来完成基类的定义。那么其他的控件就可以通过继承此BaseWindow,在拥有所有BaseWindow功能的基础上再拓展出各自控件自身的特定功能。总的来说这是传统的方案,但是在WPF/Silverlight中易用性不强,因为有着xaml这一层东西在;且目前大多数的开发者都不一定具备底层控件开发的技术与经验,实现起来难度较大。
2)通过Silverlight模板控件来实现。国外很多Silverlight开发者都比较喜欢使用此方式进行控件开发。具体步骤:在项目上右键->添加->新建项->Silverlight模板化控件:
新建好后,大家可以看到的项目结构中出现了一个Themes文件夹,且里面包含着一个名为Generic.xaml的模板文件,主体代码如下:
<Style TargetType="local:QXChildWindow">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:QXChildWindow">
……模板内容……
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
以后如果还有新的模板添加进项目,那么所有模板的xaml部分均会以如上格式追加到此文件中,只是它们绑定的TargetType不同(cs文件不同)罢了: