公司要做一个游戏接入腾讯QQ游戏大厅,腾讯要求制作一个launcher,公司之前并没有接入过腾讯,所以大家其实都不懂,而我又是新人,所以刚拿到这个任务的时候整个人就是一个大写的懵逼。在网上查找了不少的资料,但是关于launcher的实在太少了,所以经历了半个多月终于写完launcher的我决定写这个系列的博客,希望能给大家一个参考。我是用C#写的,因为能查到的文档实在太少,所以流程基本都是自己实现的,如果有错希望大家指出。

首先launcher是什么:

我的理解就是一个游戏启动器,微端游戏为了避免资源太庞大启动太慢的问题而设计出了launcher这种东西,先下载一部分必要的资源,然后拉起游戏exe,之后的资源就边玩游戏边下载啦。这样就避免玩家在启动游戏的时候等太久一怒之下点了右上角的叉叉不玩了~

然后是launcher的功能:

既然知道了launcher是什么,那它的基本功能应该也知道了。launcher主要有几大功能,从web服务器下载文件,解压文件,启动游戏exe,和QQ游戏大厅通信(如果不接入QQ游戏大厅的话就没有这个了,腾讯给的是C++的动态库,并且接口全部都是纯虚函数,所以C#不能直接使用,如果有源码可以重新编译成C#,可惜我并没有。。。。。。我的做法是重新根据他给的demo封装一个C++动态库再引用,反正比较坑,最坑的就是指针和回调,花了挺多时间的)。

除了这些基本的功能,还有一些附加项,下载功能中有一个MD5码对比,MD5码是为了保密(?),有计算MD5码的api,直接用就行了,这里就是从web获取一个配置文件,里面包含了web上所有文件的MD5码,然后在本地计算出当前文件的MD5码对比,如果一样就不下载如果不一样就下载(还是有良心的给大家省了流量~~~)。既然说到了配置文件,就得有生成这个配置文件的程序,总不能几百个文件让人家手动的添加到配置文件里吧,这个和launcher功能是分开的,但是却不得不做。还有一个和launcher功能分开却不得不做的就是压缩功能,因为要解压就必须要压缩啊,我知道现在有很多压缩解压工具,但是你试试你能不能用程序解别人的压缩包,反正我是做不出来。。。。。。所以写压缩工具的人真是强大,什么压缩包都能解,不管别人是什么奇葩(?==、)的压缩方式,这可不是说同一种格式的就能互相解压的,压缩算法多种多样,这也是一个神奇的东西,我是不懂啦,就能用用人家的接口而已。也有一种方法就是调用本地安装的解压工具,但是万一人家电脑上没有解压工具呢,虽然不太可能但是我们程序员有句话叫不要猜测用户行为,意思就是什么情况都是有可能发生的。你也可以自带一个解压工具的安装包,如果人家的电脑上没有就给人家安装一个,跟那什么软件的全家桶一样,哈哈哈这是个耍流氓的事我还是不做了。。。。。。然后还有些什么链接啊什么的都是小问题了,都有现成的api一个函数就搞定了,感叹C#的强大,这让我们C++程序员如何是好?难怪C++程序员不转语言就找不到工作~~~

现在基本流程有了,就要开始制作launcher了。

毕竟我是一个C++程序员,所以一开始我还是准备用C++做的并且做好了下载功能和解压功能,比较坑~需要自己编译开源库配置库等等,别问我怎么编译开源库,我不会~~~我也是朋友帮忙编译的,据说是cmake?然后到了要做界面的时候就想到了MFC,毕竟人家是C++为基础的嘛。MFC是个神奇的东西,要想用MFC做出一个漂亮的界面不是不可以,只是首先你得是一个优秀的MFC程序员,然而我新建一个MFC之后就被它自带的各种东西给整懵逼了,一个app,一个dlg,main函数入口被封装起来了,程序的调用顺序就变得诡异起来,会先运行一个什么再拉起一个什么再run一个什么(好吧都是废话,因为我没记住~~~)。然后一个星期之后我们老大就说我想着你是C++程序员所以让你用C++试一试,但是C++太复杂太耗时间了,要不你换一种语言?(我:。。。。。。你是在逗我吗?早说啊!!!)然而我并没有说出来,而是说好,毕竟我是一个被生活所迫的人,如果能给我三个月,我是很愿意用C++来做的,但是事实上并不可能,所以之前的东西全部没用了,换成了C#。

在被C++摧残之后再写C#简直就是走上了康庄大道啊,大概花了两三天的时间界面框架和下载解压功能就做好了,不得不再次感叹C#的强大。想起之前用C++写一个游戏服务器,客户端的子弹就是调一个射线的api,然后服务器为了验证这个子弹是否打到了对方就必须自己实现类似射线的机制,我写了好久而且是出bug最多的地方。不过也还是得益于我用C++写过一遍,所以对流程的理解比较深刻,毕竟是受过摧残的~我就是要强行给C++正名!!!毕竟这些高级语言的底层都是C++,不过这都是大神们写出来的,我们这些C++程序员都只是难找工作的小白菜。。。。。。

最后我决定用wpf,基于C#的,用C#写后台逻辑,它有个xaml文件,编辑界面的,还用了C#的动态库也用了C++的动态库,其实我作为一个C++程序员,基本其他语言都没有怎么接触过,只知道他们封装的很牛逼。C++涉及的面太窄了(大神们除外,我是小白菜),做C++的感受就是什么你都得自己来,所以懂的东西呢就能理解得比较深,但是不懂的东西呢就完全不懂~~~大概就是这么个状态。不过做C++的人呢学习能力比较强,懂得操作系统的底层机制(我们老大说如果不是这样的话他是不会要我进公司的,不能因为我是个妹子就留下我~毕竟我们是一个游戏公司,现在应该没有人用C++写网络游戏吧),我记得当时我们老大问了我一个问题是操作系统怎么实现运行时多态~~~好吧我又在说废话了,说这么多只是想说不会没关系,程序太博大精深,没有谁都会的,不会别怕,学嘛。我刚开始也是连launcher是什么都不知道,毕竟不玩游戏,甚至在很困难的时候觉得自己要转行了,现在也还是做出来了,蛮有成就感的吧。

实现了这些功能呢一个launcher就基本完成了,用户看到的就是一个窗口然后一个进度条在那里跑,能点链接能开始游戏,却不知道它背后做了多少事~重要的是我们程序员死了多少脑细胞做了多少事~

好吧这篇基本都是废话,随便看看吧,接下来会分成几个部分具体的写每个功能的。

转载请注明出处~

微端游戏启动器launcher的制作(序篇)的更多相关文章

  1. 微端游戏启动器LAUNCHER的制作之MFC版一(序和进程通信)

    额...刚开始信誓旦旦说要写launcher制作的博客,还没写完就被抛到脑后了真是没毅力.最近把之前写的wpf的launcher改成了mfc版,遇到很多问题,写了三个星期才写完,好好记录一下吧.我也想 ...

  2. 微端游戏启动器launcher的制作之下载篇(系列一)

    首先第一篇先讲一讲launcher最核心的功能---下载功能. 这个部分估计得好几篇才能写完,东西比较多也比较杂,慢慢来吧,我的东西也在继续改进中...... 从web上下载文件需要用到几个类,Htt ...

  3. Unity下的开发框架--适应web和微端游戏异步资源请求的框架

    一.   内容简介: 1.   框架对Web与微端游戏特性的支持: Web和微端游戏最重要的特性是,资源是持续从服务器上即时下载下来的.而保证体验流畅的关键就是保证资源下载分散到持续的体验过程中,并保 ...

  4. 微端启动器LAUNCHER的制作之MFC版二(下载)

    用了C#再回来用C++写真的有一种我已经不属于这个世界的感觉.C++的下载就没有C#那么方便了,我用的是libcurl.dll,官网上下载的源码自己cmake出来编译的,c++的库引用有debug和r ...

  5. Egret微端 创建项目(一)

    开发环境: window7 egret engine:5.0.14 egret wing:4.1.0 微端:v0.0.14 官方教程:http://developer.egret.com/cn/git ...

  6. dotNet开发游戏微端

    需求分析 功能要求 当玩家使用不支持 unity webplayer 的浏览器进入游戏时,让玩家通过微端玩游戏. 确保微端的功能和页游戏功能一致. 大体功能就是为unity web game开发微端, ...

  7. 2D客户端+微端技术总结

    本人于2013年9月23号加入一个页游项目组, 并作为项目组的客户端小组的主程, 带领一个4个人(峰值)的前端小组, 进行微端的开发.微端项目于2014年8月底大体完成, 历时11个月.9月份之后微端 ...

  8. 微端 代码project as air 分享

    分享 ^_^ 1. 使用 air , as . 2. 微端下载和更新技术 成功上线棋牌游戏.它可用于传统的游戏开发. 地址: http://download.csdn.net/detail/stone ...

  9. 亲历H5移动端游戏微信支付接入及那些坑(二)——获取Openid和授权

    第一篇中将一些坑说明,那么这篇开始正式进入接入步骤.具体的参数说明,我不会列出,毕竟微信官方文档都有,我想大家都看的懂,而且这接口也有可能微信会变动,所以不列出来,也是不想引起大家的误解,接入步骤只起 ...

随机推荐

  1. php --with-mysql=mysqlnd

    1.什么是mysqlnd驱动? PHP手册上的描述: MySQL Native Driver is a replacement for the MySQL Client Library (libmys ...

  2. jquery刷新iframe页面的方法(兼容主流)

    1,reload 方法,该方法强迫浏览器刷新当前页面.语法:location.reload([bForceGet])   参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取 ...

  3. Unity3D中的函数方法及解释

    一.刷新函数 Update 当MonoBehaviour启用时,其Update在每一帧被调用. LateUpdate 当Behaviour启用时,其LateUpdate在每一帧被调用. FixedUp ...

  4. Jsoup使用教程

    一.解析和遍历一个HTML文档1.解析Html及Url链接 String html = "<html><head><title>First parse&l ...

  5. iOS 将NSArray、NSDictionary转换为JSON格式进行网络传输

    http://blog.csdn.net/worldzhy/article/details/49982491 将NSArray.NSDictionary转换为JSON格式进行网络传输,是经常用到的,但 ...

  6. Bash中的变量

    Bash中的变量1.用户定义的变量变量的定义  用户定义的变量有字母数字及下划线组成,并且变量名的第一个字符不能为数字.            与其它UNIX名字一样,变量名是大小写敏感的. 对于变量 ...

  7. iOS开发——UIImageView

    1.图像点击之后,全屏浏览 - (void)viewDidLoad { [super viewDidLoad]; _myImage=[[UIImageView alloc]initWithFrame: ...

  8. X-008 FriendlyARM tiny4412 uboot移植之copy u-boot到DDR内存

    <<<<<<<<<<<<<<<<<<<<<<<<< ...

  9. 【转】mysql中文乱码的一点理解

    我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B. 如果你也遇到了这个问题,咱 ...

  10. realvnc的卸载

    我安装了realvnc5.3.2后,采用如下方式卸载: (1)用如下命令查询当前安装的realvnc包的全名: rpm -qa realvnc-vnc-server (2) rpm -e 查询到的安装 ...