在我的教程里一直未公开的QX.dll以及QXGameEngine开源后,大家讨论得比较多的QXGame_Silverlight3.dll。它俩到底是何方神圣,在引擎中起着何种作用;为什么就它俩不开源,莫非核心代码都在里面?本节我将就如上问题给予大家一个答案,揭开长久以来被尘封的种种谜团。
事情的起因缘于教程第七节中那对牛人老外用C#写的A*算法,一句话:相当的牛。于是乎我忍不住了,这么好的源码不拿来用太亏本了。但是,该源码却是在Winform环境下编写的,如何将之运用到WPF或是Silverlight平台上呢?
我们首先用VS打开源代码,整个结构如下:
一眼看过去就知道精华在哪了,Algorithms文件夹下的6个cs类即是寻路用的所有逻辑,并且全部属于namespace Algorithms命名空间下。发现金矿了,特别的心动,急了,杂办?当然是挖出来咯。
接下来关闭此解决方案,并另外新建一个Silverlight类库(如果是WPF平台,就建立WPF类库,道理是一样的),取名为QXGame_Silverlight3:
里面默认带了一个Class1.cs,没用,干掉它。嘿嘿
邪恶的事情即将发生。在项目上点击鼠标右键->添加->现有项,
然后找到本文开头的那6个cs文件加入到此项目中:
我靠。。。难道是传说中的移花接木???看到希望了,赶紧按Ctrl+Shift+B编译一下,伤心哪,一堆错误:
没折了吗?仔细分析一下,其实也不过4处而已:
1)Silverlight中没有System.Drawing这个东西
2)Silverlight中更没有System.Windows.Forms这个东西
3)无法识别Point这个结构类型,需要添加一个包含有该Point定义的命名空间引用
4)Silverlight中不允许使用unsafe代码
首先我们看第4点,在Winform/WPF中可以使用不安全代码;而在Silverlight项目中是不允许使用不安全代码的:
接下来我们找到源码中有出现unsafe代码的地方,发现其实它们的调用已经被注释掉了,注释上有提到使用unsafe会快那么一点点,但是不多。既然不用它能实现相当功能,且又可以被Silverlight所支持,不如干脆点,直接干掉它们好了:
OK,问题4成功解决;再下来我们同样可以很轻松的解决掉问题1和2,只需删除这6个cs文件中的所有using System.Drawing、using System.Drawing.Drawing2D和using System.Windows.Forms引用即可。
剩下来的仿佛只有问题3了,这个就更简单了,直接根据提示添加指定的命名空间引用即可:
到此是否大功告成了?不妨再次编译一下,结果又是一身冷汗:
又增加了45个错误。偶的神。。。
冷静的回想一下,不过是修改了错误3,加入了对Point的识别才造成出现这些错误,莫非与之有关?
再逐条分析,嘿嘿,眉目出来了,原来原代码的Point是System.Drawing中的Point,其中的Point.X与Point.Y均为int类型;而Silverlight的System.Windows中的Point.X与Point.Y则是double类型。找到了问题所在,解决也就不难了。大家想到的最直接且快速的方案即是转换,我们逐个找出提示出错的地方,然后将它们进行int类型转换,例如下面这样:
当然,这样做有损性能,如果您不嫌麻烦,可以用两个int来代替Point,或自己写个struct,处理方式太多了。至于本节示例嘛,作者比较懒,暂时按上面的方法对所有的错误进行类似处理了。仅仅需要不到两分钟的时间,即可干掉这45个错误,最后再次按下Ctrl+Shift+F5,嘿,生成成功啦!激动啊那个激动,用千辛万苦来形容毫不为过。金矿终于被挖出来,但它被存放到了哪儿?我们此时再次打开项目属性,点击输出目录的浏览按钮,然后在该输出文件夹上点右键->打开:
其中QXGame_Silverlight3.dll即是我们梦寐以求的金矿,一定要好好珍惜哦:
如果还有人要提问:该如何使用它?我只能和他说:一个.NET开发者不知道如何引用第三方dll,是天大的笑话哪~
结尾语:本节大家学到了什么?看似简单的问题其实蕴涵着挺多的Silverlight知识点。到此大家是否已经对本文开头的问题不再疑惑了?
最后说说个人的想法:将他人的源码经过修改后变成自己的工具是可以的,但是同时也应当建立在尊重他人劳动成果的前提下,尽量保留一些对源码来源及作者的信息描述,无论是在源码或是文章中体现,毕竟辛酸只有同道中人能感受。
出处:http://alamiye010.cnblogs.com
本系列目录及源码下载:点击进入(欢迎加入WPF/Silverlight小组 WPF/Silverlight博客团队)
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。