斑竹并没有太监,太监了也不会告诉你们。。。斑竹我郑重承诺,不出完整个系列我就是太监!!!
第一篇:http://www.cocoachina.com/bbs/read.php?tid=195879 3月27日更新
第二篇:http://www.cocoachina.com/bbs/read.php?tid=196891 4月4日更新
第三篇:http://www.cocoachina.com/bbs/read.php?tid=198172 4月15日更新(源码下载地址)
完结
那年
在美丽的
拉斯维加斯
我一下飞机后
映入我眼帘的是
满满的水果机Slot
好吧,其实我没去过拉斯维加斯,不过我喜欢Slot。其实一直想给大家写一份教程,可是我深深的指导自己的编码风格和思路应该不会是大众的健康的指导,包括我对Cocos2d-x的使用都是肤浅的,下贱的。可是,我真的不想网络上充斥着教材类的教程,这不利于Cocos2d-x的健康发展,我看过很多前人的博客,发现干货类不多(不是指责是大家出发点不一样),一个新手迫切关心的是什么:
我如何用这引擎写出游戏?
能写出什么样的游戏?
在具体的开发中都要趟过哪些坑?
这些功能怎么去实现?
怎么组织一个正式的项目结构?
这些东西就是我这个系列教程需要完整表达出的东西,具体如下:
-
技术方案
服务端我将采用Raknet引擎,客户端当然是Cocos2d-x 2.2.2 + 我自己的扩展,通讯方式打算尝试一下Raknet的Rpc远程调用。所以呢,大家请忽略掉承载能力,服务端健壮程度等问题,我也不打算在这系列教程中讨论服务端架构等问题,我们的服务端会是个单进程单线程的应用程序,非常简单,所以新手可以不用担心,我们的重点在客户端。我们将最终实现一个跨Win/Android/Ios的网络版水果机。我的大部分截图将是Win的,当然其他平台有遇到麻烦,可以我们共同解决,但是!我们教程讨论的不是关于引擎安装、工程创建等问题,我需要大家是已经能独立解决上诉问题的人,不然这教程你也白看,代码放出来你也没用。 -
功能点实现
1) 账号登陆:我们将支持直接用机器码登陆,实现单机唯一id登陆,这样做的优势很明显,我们的玩家可以不注册账号即下即玩,弊端也有,我们需要额外开发帐号绑定功能,因为我们所采用的唯一id获取方式是OpenUDID,这种方式重装系统后ID似乎就变了(不对的话你来打我啊)(不对的话请指出,因为我不记得了)反正我们先不管那么多,实现再说了。
2) 分辨率适配:在这一点上,我并没有采用CocoStudio,我也不会用。我自己实现了一套分辨率适配,在多个项目上已经实践,应该是没有什么问题,但是!请谨慎使用,因为我不提供技术维护和答疑。我考虑过使用cocos2d-x提供的方案,但很抱歉我是个喜欢重复造轮子的人,也就是大家口中的菜逼,所以爱看不看吧。所以大家实用为主吧。
3) 场景管理:很抱歉我又没有使用Cocos2d-x(以下简称ccx)提供的方案,是的,我又造轮子了,反正我自己觉得适用在这个项目上没有问题,所以大家不喜欢请勿喷。我将采用单Scene多Layer来实现多场景。但我也会实现包括音乐和layer的淡入淡出,来弥补这样做的一些缺陷,例如layer没有切换特效之类(当然又是自己扩展啦)。
4) 资源加载:我个人有个癖好,我无法接受阻塞的方法,至少使用的时候不能有阻塞的感觉,所以我在这个项目中会采用一些诡异的方式,来加载为数不多的文件,但这样的方式会让Windows上有明显卡顿,(我们他妈又不给玩家玩Windows)换来的是android和ios的流畅秒启动。
5) 多语言方案:当然了还是自己写,虽然这个项目规模很小,但是代码量真心不少,多语言我们将暂时支持简体、繁体、英文,当然也是可以自己扩展的,只需要加配置即可,简单说是获取设备语言,是英文,我们就启动英文。。。到时候看代码吧。
6) 网络消息传递:很多同学喜欢在主线程里tick网络消息,额还是上面那句话,我讨厌阻塞,更讨厌在点击登录后界面失去响应,毕竟不是每个人网络环境都很好的,所以我们将实现一系列的包括线程tick网络消息,并同步网络消息到主线程(不用CCNotificationCenter理由是没有边界),自己实现一个简单的同步机制包含加锁解锁和数据同步类。
7) UI相关控件:我将实现一些,包括Toast,Alert等相关控件,当然我还是不负责进行大家的“本地化”,我只给出我的实现,我的实现是基于我的扩展,如果你们觉得这东西挺好用,那么请参照我的自己用Cocos2d-x实现。
8) 付费:这部分的实现我将提供给大家包括:IOS/IAP、Android/某支付SDK、Android某积分墙。当然啦,写了这么多代码大家肯定想变成钱啊。还是那句话我只负责提供实现,初级问题请不要在本教程讨论(比如什么是积分墙啊,怎么注册啊,哪家好啊)我也不会给大家提供高度封装的东西,一切只为实现,这部分我用过一些Plugin说实话,适应不了我们的项目需求,所以我还是采用很原始的方式。
9) 文件读写:包含存档之类的东西,对,我又没用ccx那套,我又造轮子了,当然这套东西全异步实现,我自己使用反正非常舒服,读写的过程很像NoSQL,并且会异步完成,随时都可以调用。
10) 后台任务机制: 我写了套后台任务机制,可以用来异步执行HTTP请求最后会回调主线程,所以能用来做很多功能,大家凑活看吧。
11) 杂:看到很多朋友求什么卡牌翻转什么的,在这个项目中我会提供一个由shader完成的卡牌翻转,当然整个shader的创建和保存恢复的结构也是自己实现的,CCX我知道有,但是我没看,我就是一个懒得看别人代码宁愿自己写的人,所以大家原谅我这个菜逼吧。还有一些别的乱七八糟的东西吧,如果融入不进这个项目的,我会以sample的形式放在项目的某个地方,大家自己去找吧。(于是就开启了大海贼时代。。)
说了以上这些,可能还是不能将我的想法表达完整,解释一下一个问题,就是关于什么叫我只负责实现,不负责“本地化”,因为我为ccx写了大部分的扩展,包括底层的数据类型定义,STL重写(Vector HashMap),Math部分,XML部分,内存管理,资源管理,线程,消息机制,文件读写等,我不可能全都放出来给大家,因为很多涉及公司保密协议,所以,我能提供的就是实现层面,比如:
UIButton* pkEggBtn = ODE_NEW UIButton(pkClientVersionN,pkClientVersionP);
pkEggBtn->setScale(ui_main_scale);
AddWidget("pkEggBtn",pkEggBtn);
UILinkDelegate(pkEggBtn,OnEgg);
大家就不要深究UIButton是个什么了,也不要纠结为什么我要用AddWidget,反正就是那么个意思,你同样适用的一个CCX的Button来实现这个按钮就行了。这么说我不知道大家能明白不,反正具体教程写的过程中,我会适当的放出一些底层实现的,但不是全部。
另外解释一下,我的代码很少有注释(应该说压根没有),不过我会尽量保证代码可读性,我记得一个哲人说过:好的代码不需要注释(我瞎编的)。
那么本教程会分为几个步骤来发布:
- 就是本篇
- 整体框架搭建(包含服务端)不过服务端部分我会一笔带过,不属于ccx引擎范畴。到这一步基本有个框架了(废话,意思就是这一步啥效果都还看不见)
- 外围实现篇:会把基本的UI框架全做出来,也就是说到这步游戏就能单机玩了。不过会分为两篇来写,不然篇幅太大。
- 通信篇:实现所说的设备号登录,玩家资料传递,消息机制实现等。到这一步完成,基本就是个网游了。
- 第三方整合篇:就是什么付费啊,包括上面所说的异步的Http请求(公告什么的)。
- 发布篇:我准备用非常简短的文字来写这部分。非。常。简。短。
具体可能有些出入,不过大致上就这么愉快的决定了。另外,值得说明的是,所有美术资源来源于网络(也就是说从别人那扒来的)请注意不要引起版权问题,大家也都互相尊重。最后,为了给大家一点继续看下去的信心,提前告诉大家,这个项目是已经完成的,并不是重新写,所以这个教程不会太监,给大家一点信心放个图出来。




挺好看的哦

